Encog - 使用交叉验证方法训练神经网络并验证训练
Encog - Training a neural network with Cross-validation methods and validating the training
一旦我看到从验证集计算的误差开始增加,我就想停止训练网络。我使用带有 RPROP 的 BasicNetwork 作为训练算法,我有以下训练迭代:
void trainCrossValidation(BasicNetwork network, MLDataSet training, MLDataSet validation) {
FoldedDataSet folded = new FoldedDataSet(training);
Train train = new ResilientPropagation(network, folded);
CrossValidationKFold trainFolded = new CrossValidationKFold(train, KFOLDS);
trainFolded.addStrategy(new SimpleEarlyStoppingStrategy(validation));
int epoch = 1;
do {
trainFolded.iteration();
logger.debug("Iter. " + epoch + ": Erro = " + trainFolded.getError());
epoch++;
} while (!trainFolded.isTrainingDone() && epoch < MAX_ITERATIONS);
trainFolded.finishTraining();
}
不幸的是,它没有按预期工作。该方法需要很长时间才能执行,而且似乎不会在正确的时刻停止。我希望训练在验证错误开始增长的那一刻就中止,也就是说,在理想的训练迭代次数中。
有没有办法直接从折叠的交叉验证中提取验证数据,而不是创建另一个 MLDataSet 专门用于验证?如果是,该怎么做?
我应该使用哪个参数来停止训练?你能告诉我必要的修改来做预期的事情吗?我怎样才能同时使用交叉验证和 SimpleEarlyStoppingStrategy?我很困惑
非常感谢您的帮助。
我认为这里有几个混淆点。
一件事是当错误开始在不同的(!)数据集中增加时停止训练。这组数据通常称为验证数据集。这对每次训练都是有效的,即对于达到最大纪元数的每个循环(您的 do-while 循环)。为此,您需要跟踪上一次迭代的测量误差:运行 验证数据集 上的网络,获取误差并与下一个 epoch 的误差进行比较.
另一件事是交叉验证。在这里,您多次训练网络。从整个培训程序中,您 估计 网络的优度。这是一种更复杂、更稳健的方法,具有不同的变体。我喜欢 this diagram.
最后:您在错误开始增加的点停止训练并不意味着您找到了理想的训练量 epochs .您可能会陷入局部最小值,这是这些模型中的常见问题。
希望对您有所帮助:)
一旦我看到从验证集计算的误差开始增加,我就想停止训练网络。我使用带有 RPROP 的 BasicNetwork 作为训练算法,我有以下训练迭代:
void trainCrossValidation(BasicNetwork network, MLDataSet training, MLDataSet validation) {
FoldedDataSet folded = new FoldedDataSet(training);
Train train = new ResilientPropagation(network, folded);
CrossValidationKFold trainFolded = new CrossValidationKFold(train, KFOLDS);
trainFolded.addStrategy(new SimpleEarlyStoppingStrategy(validation));
int epoch = 1;
do {
trainFolded.iteration();
logger.debug("Iter. " + epoch + ": Erro = " + trainFolded.getError());
epoch++;
} while (!trainFolded.isTrainingDone() && epoch < MAX_ITERATIONS);
trainFolded.finishTraining();
}
不幸的是,它没有按预期工作。该方法需要很长时间才能执行,而且似乎不会在正确的时刻停止。我希望训练在验证错误开始增长的那一刻就中止,也就是说,在理想的训练迭代次数中。
有没有办法直接从折叠的交叉验证中提取验证数据,而不是创建另一个 MLDataSet 专门用于验证?如果是,该怎么做?
我应该使用哪个参数来停止训练?你能告诉我必要的修改来做预期的事情吗?我怎样才能同时使用交叉验证和 SimpleEarlyStoppingStrategy?我很困惑
非常感谢您的帮助。
我认为这里有几个混淆点。
一件事是当错误开始在不同的(!)数据集中增加时停止训练。这组数据通常称为验证数据集。这对每次训练都是有效的,即对于达到最大纪元数的每个循环(您的 do-while 循环)。为此,您需要跟踪上一次迭代的测量误差:运行 验证数据集 上的网络,获取误差并与下一个 epoch 的误差进行比较.
另一件事是交叉验证。在这里,您多次训练网络。从整个培训程序中,您 估计 网络的优度。这是一种更复杂、更稳健的方法,具有不同的变体。我喜欢 this diagram.
最后:您在错误开始增加的点停止训练并不意味着您找到了理想的训练量 epochs .您可能会陷入局部最小值,这是这些模型中的常见问题。
希望对您有所帮助:)