我很抱歉,因为我的问题可能听起来很愚蠢。但我在深度学习和 caffe 方面还很陌生。我们如何检测在我们自己的数据集上微调预训练需要多少次迭代?例如,我正在为我自己的数据运行 fcn32,其中包含 5 个类。我什么时候可以通过查看训练阶段的损失和准确性来停止微调过程?
非常感谢
我很抱歉,因为我的问题可能听起来很愚蠢。但我在深度学习和 caffe 方面还很陌生。我们如何检测在我们自己的数据集上微调预训练需要多少次迭代?例如,我正在为我自己的数据运行 fcn32,其中包含 5 个类。我什么时候可以通过查看训练阶段的损失和准确性来停止微调过程?
非常感谢
您不应该通过查看训练阶段的损失或准确性来做到这一点。从理论上讲,训练准确度应该始终在增加(也意味着训练损失应该始终在减少),因为您训练网络以减少训练损失。但训练准确率高并不一定意味着测试准确率高,这就是我们所说的过拟合问题。因此,您需要找到测试集(或验证集,如果有的话)的准确性停止增加的点。您可以通过首先指定相对较大的迭代次数来简单地做到这一点,然后监控测试准确度或测试损失,如果测试准确度在一致的 N 次迭代(或时期)中停止增加(或损失停止减少),其中 N可以是 10 或您指定的其他数字,然后停止训练过程。
最好的办法是跟踪训练和验证的准确性,并存储每 k 次迭代的权重快照。要计算验证准确度,您需要拥有一组不用于训练的独立数据。然后,一旦验证准确度停止增加或开始减少,您就可以停止。这在文献中被称为早期停止。例如,Keras 为此提供了功能:https ://keras.io/callbacks/#earlystopping
此外,绘制上述数量是一种很好的做法,因为它可以让您深入了解培训过程。请参阅http://cs231n.github.io/neural-networks-3/#accuracy以获得很好的说明(并非特定于提前停止)。
希望这可以帮助
通常,您会收敛到模型的特定验证准确性。在实践中,如果验证损失在 x 个时期内没有增加,您通常会停止训练。根据您的纪元持续时间,x 可能最常见地在 5 到 20 之间变化。
编辑:
一个 epoch 是对数据集的一次迭代,用于 ML 术语中的训练。您似乎没有验证集。通常,数据会分为训练数据和验证数据,因此您可以查看模型在看不见的数据上的表现,并通过查看这些数据来决定采用哪个模型。您可能想查看http://caffe.berkeleyvision.org/gathered/examples/mnist.html以了解验证集的用法,即使他们称其为测试集。