Encog:增量训练

Posted

技术标签:

【中文标题】Encog:增量训练【英文标题】:Encog: incremental training 【发布时间】:2015-10-27 19:33:22 【问题描述】:

我遇到了一个关于使用 Encog 进行神经网络在线学习的问题 (Encog: BasicNetwork: Online learning without preconstructed dataset)。我想问一个相关的问题。假设我有 x 个数据点来训练神经网络。训练后,我得到了 y 个新数据点。这个想法是有一个使用 x+y 数据点的神经网络。然而,由于这些 x 点已经用于训练网络,是否可以使用这些 y 数据点训练同一个网络而无需任何重置,并且效果就像使用 x 和 y 数据点训练网络一样,而不是花时间从头开始重新训练一切。还是这样完成的:https://github.com/encog/encog-java-examples/blob/master/src/main/java/org/encog/examples/neural/resume/TrainResume.java?

【问题讨论】:

【参考方案1】:

我认为正确的做法是使用 TrainingContinuation,因为它会传递有关培训的一些信息。但是,如果您没有序列化然后加载网络,则可以通过不调用 train.finalize() 来跳过它。这当然取决于您使用的训练方法和 YMMV。

【讨论】:

对于我的案例,我不太了解 TrainingContinuation 的想法。如果您想停止训练并稍后在完全相同的数据集上继续,那么使用这样的函数是有意义的。但是,当您想使用新数据集(例如旧数据集 + 新数据集)训练已经训练过的网络时,我怀疑 TrainingContinuation 是否有用。在以下情况下,看起来训练仍在继续,但新数据集不是旧数据集 + 新数据集,所以早期的训练丢失了,对吗? nnlearner.resume(trainContinuation); nnlearner.setTraining(newTrainingSet); 如果要使用两个训练集的总和,则必须将两者的组合传递给 setTrainingSet()。否则你会得到的是旧数据集被替换,但训练的权重被保留,随后将仅在新数据集上进行训练。 然后,培训变得过于昂贵,这是我想避免的。所以,这是不可能的。 不太清楚你在这里期待什么。你想同时训练两组,还是想训练一组,保留重量,然后再训练下一组? 首先在训练集 A 上训练,然后在 A+B 上训练,然后在 A+B+C 上训练,依此类推。正如预期的那样,这可能会很昂贵。因此,我想知道是否可以像在 A+B 上进行训练一样只在 B 上训练(仅在 A 上训练之后),然后像 A+B+C 一样在 C 上训练

以上是关于Encog:增量训练的主要内容,如果未能解决你的问题,请参考以下文章

增量学习中的自我训练

Ml.Net 图像分类增量学习

可增量训练的实体识别分类器

如何为 xgboost 实施增量训练?

“增量/减量”SVM 算法 - 可以在附加数据上进行训练

pytorch 手写数字识别项目 增量式训练