为什么经过预培训的ResNet18的验证准确性要高于培训?

时间:2019-11-16 22:29:52

标签: machine-learning deep-learning computer-vision pytorch transfer-learning

对于PyTorch的关于为计算机视觉执行转移学习(https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html)的教程,我们可以看到验证精度比训练精度更高。将相同的步骤应用于自己的数据集,我会看到类似的结果。为什么会这样呢?它与ResNet 18的体系结构有关吗? enter image description here

2 个答案:

答案 0 :(得分:1)

假设您的代码中没有错误,并且训练和验证数据位于同一域中,那么可能有两个原因。

  1. 训练损失/ acc被计算为整个训练时期的平均值。网络以一组权重开始该时期,并以另一组(希望更好!)权重结束该时期。在验证期间,您仅使用最新权重评估所有内容。这意味着验证与训练精度之间的比较会产生误导,因为训练精度/损失是根据模型潜在更差状态的样本计算得出的。这通常在训练开始时或在调整学习率之后立即最为明显,因为网络通常以比结束更差的状态开始新纪元。当训练数据相对较小时(例如您的示例),通常也很容易注意到。

  2. 另一个差异是训练期间使用的数据扩充,验证期间未使用。在训练过程中,您会随机裁剪和翻转训练图像。尽管这些随机增强有助于提高网络的泛化能力,但它们在验证过程中不会执行,因为它们会降低性能。

如果您真的有动力并且不介意花费额外的计算能力,则可以通过在每个纪元末使用与验证相同的数据转换,通过网络运行训练数据来获得更有意义的比较。 / p>

答案 1 :(得分:0)

简短的答案是训练和验证数据来自不同的分布,模型更容易在验证数据中预测目标,然后再进行训练。

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

其他体系结构可以使用Dropout(或其修改),这故意“破坏”了训练性能,从而减少了过度拟合的可能性。

注意,您正在使用预训练的模型,该模型已经包含有关如何解决分类问题的信息。如果您的域与训练的数据没有太大不同,则可以期望获得现成的良好性能。