我编写了一个反向传播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;
}
}
权重/偏差仅在训练期间更新,然后一旦完成一个训练时期,验证开始(它不会改变权重/偏差 - 只是前向传递),这会返回错误。
validation
方法计算错误如下(在Java中):
double error = 0;
for (int i = 0; i < correctOutput.length; i++) {
error += Math.pow(correctOutput[i] - outputLayer.getNeuron(i).getValue(), 2);
}
error = error / correctOutput.length;
return Math.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
来自neuralNetwork.validate(rowOfData)
的回复计算如下:
error = 0
for each output
error = error + (idealOutput - calculatedOutput)^2
error = error / numberOfOutputs
return sqrt(error)
答案 0 :(得分:0)
是的,实际上错误可能永远不会低于某个水平。神经网络以及其他机器学习算法不能保证结果。
如果可能的话,您可以尝试增加训练集以提高网络性能(如果您有更多数据)。
答案 1 :(得分:0)
交叉验证集的错误通常表现得像那样,因为在某些点NN开始过度拟合之后(NN模型开始学习“噪音” - 训练集中的随机规律,而不是你正在进行的问题)。这就是您首先需要验证数据集的原因。因此,“当验证数据的错误被最小化时停止训练将是最好的事情”是完全正确的事情。存在其他防止过度拟合的方法,例如添加正则化或获得更多训练样本。
关于你的代码,似乎它是正确的,假设你想要计算均方根误差(可以使用其他错误函数,例如MSE或交叉熵错误的分类任务,因此值得指定什么样的在询问代码正确性时,您想要计算的错误。)