Java 神经网络的计算误差

Java 神经网络的计算误差,java,artificial-intelligence,neural-network,backpropagation,Java,Artificial Intelligence,Neural Network,Backpropagation,我已经编写了一个反向传播MLP神经网络,我希望在误差小于或等于0.01时停止训练 我的数据集已被拆分为60%的培训数据、20%的验证数据和20%的测试数据 我的主要培训和验证循环如下: while (continueTraining) { for (int i = 0; i < trainingDataSet.size(); i++) { neuralNetwork.train(trainingDataSet.get(i)); } double e

我已经编写了一个反向传播MLP神经网络,我希望在误差小于或等于0.01时停止训练

我的数据集已被拆分为60%的培训数据、20%的验证数据和20%的测试数据

我的主要培训和验证循环如下:

while (continueTraining) {
    for (int i = 0; i < trainingDataSet.size(); i++) {
        neuralNetwork.train(trainingDataSet.get(i));
    }

    double error = 0;
    for (int i = 0; i < validationDataSet.size(); i++) {
        error += neuralNetwork.validate(validationDataSet.get(i));
    }
    error = error / validationDataSet.size();

    if (error <= 0.01) {
        continueTraining = false;
    }
}
error = 0
for each output
    error = error + (idealOutput - calculatedOutput)^2

error = error / numberOfOutputs

return sqrt(error)
因此,validate方法返回验证数据集中每一行数据的错误,然后将其相加,然后除以验证数据集中的数据行数,得出整个数据集的平均错误

但是,在运行网络时,错误永远不会达到0.01。我得到的最接近于0.018,当历元数达到一个非常大的数字时,误差就会增加

我是否计算错误,或者只是错误永远不会达到0.01

我认为在验证数据的错误最小化时停止训练是最好的做法

编辑:添加一些与语言无关的伪代码:

while continueTraining is true
do
    for each rowOfData in trainingDataset
        neuralNetwork.train(rowOfData)

    error = 0

    for each rowOfData in validationDataset
        error = error + neuralNetwork.validate(rowOfData)

    error = error / numberOfRowsOfDataInValidationDataset

    if error <= 0.01
        continueTraining = false

是的,实际上有可能误差永远不会低于某一水平。神经网络以及其他机器学习算法不能保证结果


如果有更多数据,您可以尝试增加您的训练集以提高网络性能。

交叉验证集上的错误通常表现为这样,因为在某些点NN开始过度拟合之后,NN模型开始学习训练集中的噪声-随机规律,而不是您感兴趣的问题。这就是您首先需要验证数据集的原因。因此,当验证数据的误差最小化时停止训练是最好的做法,这是完全正确的做法。还存在其他防止拟合的方法,例如添加正则化或获取更多训练样本


关于您的代码,它似乎是正确的,假设您想要计算均方根误差,那么可以使用其他误差函数,例如用于分类任务的MSE或交叉熵误差,因此在询问代码正确性时,有必要指定您想要计算的误差类型。

不,它不是JavaScript。这是Java。请确保标记您将来使用的语言。我已经标记了该语言。但是忽略语言,误差是否可能永远不会小于0.01?太好了。谢谢你的评论。我将尝试不同数量的输入,看看哪个模型的误差最小——希望是0.01!
error = 0
for each output
    error = error + (idealOutput - calculatedOutput)^2

error = error / numberOfOutputs

return sqrt(error)