Machine learning 为什么预先培训的ResNet18比培训具有更高的验证准确性?

Machine learning 为什么预先培训的ResNet18比培训具有更高的验证准确性?,machine-learning,deep-learning,computer-vision,pytorch,transfer-learning,Machine Learning,Deep Learning,Computer Vision,Pytorch,Transfer Learning,对于PyTorch关于为计算机视觉执行转移学习()的教程,我们可以看到验证精度高于培训精度。将相同的步骤应用到我自己的数据集,我看到了类似的结果。为什么会这样?它是否与ResNet 18的体系结构有关? 假设代码中没有bug,并且训练和验证数据在同一个域中,那么出现这种情况的原因有两个 训练损失/acc计算为整个训练期间的平均值。网络以一组权重开始新纪元,以另一组权重结束新纪元(希望更好!)。在验证过程中,您仅使用最新的权重来评估所有内容。这意味着验证和训练准确度之间的比较具有误导性,因为训练准

对于PyTorch关于为计算机视觉执行转移学习()的教程,我们可以看到验证精度高于培训精度。将相同的步骤应用到我自己的数据集,我看到了类似的结果。为什么会这样?它是否与ResNet 18的体系结构有关?

假设代码中没有bug,并且训练和验证数据在同一个域中,那么出现这种情况的原因有两个

  • 训练损失/acc计算为整个训练期间的平均值。网络以一组权重开始新纪元,以另一组权重结束新纪元(希望更好!)。在验证过程中,您仅使用最新的权重来评估所有内容。这意味着验证和训练准确度之间的比较具有误导性,因为训练准确度/损失是使用模型中可能更糟糕状态的样本计算的。这通常在训练开始时或学习率调整后最为明显,因为网络在开始新纪元时的状态往往比结束时糟糕得多。当训练数据相对较小时(如示例中所示),这一点也很明显

  • 另一个区别是,在培训期间使用的数据扩充在验证期间没有使用。在训练期间,您可以随机裁剪和翻转训练图像。虽然这些随机增强有助于提高网络的泛化能力,但它们不会在验证期间执行,因为它们会降低性能


  • 如果你真的很有动力,并且不介意花费额外的计算能力,你可以在每个历元结束时通过网络运行训练数据,使用用于验证的相同数据转换,从而获得更有意义的比较。

    简而言之,训练和验证数据来自不同的数据源模型在验证数据中预测目标比在训练中“更容易”

    如答案所示,这种特殊情况的可能原因是培训期间的数据增加。这是一种通过增加训练数据的可变性来规范模型的方法

    其他体系结构可以使用(或其修改),这会故意“损害”训练性能,减少过度装配的可能性

    注意,您使用的是预训练模型,它已经包含了一些关于如何解决分类问题的信息。如果您的域与培训时使用的数据没有太大差异,那么您可以期待现成的良好性能