对于PyTorch的关于为计算机视觉执行转移学习(https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html)的教程,我们可以看到验证精度比训练精度更高。将相同的步骤应用于自己的数据集,我会看到类似的结果。为什么会这样呢?它与ResNet 18的体系结构有关吗?
答案 0 :(得分:1)
假设您的代码中没有错误,并且训练和验证数据位于同一域中,那么可能有两个原因。
训练损失/ acc被计算为整个训练时期的平均值。网络以一组权重开始该时期,并以另一组(希望更好!)权重结束该时期。在验证期间,您仅使用最新权重评估所有内容。这意味着验证与训练精度之间的比较会产生误导,因为训练精度/损失是根据模型潜在更差状态的样本计算得出的。这通常在训练开始时或在调整学习率之后立即最为明显,因为网络通常以比结束更差的状态开始新纪元。当训练数据相对较小时(例如您的示例),通常也很容易注意到。
另一个差异是训练期间使用的数据扩充,验证期间未使用。在训练过程中,您会随机裁剪和翻转训练图像。尽管这些随机增强有助于提高网络的泛化能力,但它们在验证过程中不会执行,因为它们会降低性能。
如果您真的有动力并且不介意花费额外的计算能力,则可以通过在每个纪元末使用与验证相同的数据转换,通过网络运行训练数据来获得更有意义的比较。 / p>
答案 1 :(得分:0)