【问题标题】:Why does pre-trained ResNet18 have a higher validation accuracy than training?为什么预训练的 ResNet18 的验证准确率比训练高?
【发布时间】:2020-03-12 17:10:08
【问题描述】:
【问题讨论】:
标签:
machine-learning
deep-learning
computer-vision
pytorch
transfer-learning
【解决方案1】:
假设您的代码中没有错误,并且训练和验证数据在同一个域中,那么可能会发生这种情况有几个原因。
训练损失/acc 计算为整个训练时期的平均值。网络以一组权重开始时代,并以不同的(希望更好!)一组权重结束时代。在验证期间,您仅使用最新的权重来评估所有内容。这意味着验证和训练准确度之间的比较具有误导性,因为训练准确度/损失是使用来自模型可能更糟糕状态的样本计算的。这通常在训练开始时或学习率调整后最明显,因为网络通常以比结束时更糟糕的状态开始 epoch。当训练数据相对较小时(如您的示例中的情况),它通常也很明显。
另一个区别是训练期间使用的数据扩充在验证期间未使用。在训练期间,您随机裁剪和翻转训练图像。虽然这些随机增强对于提高网络的泛化能力很有用,但它们不会在验证期间执行,因为它们会降低性能。
如果您真的有动力并且不介意花费额外的计算能力,您可以通过在每个 epoch 结束时使用用于验证的相同数据转换通过您的网络运行训练数据来获得更有意义的比较。
【解决方案2】:
简短的回答是训练和验证数据来自不同的分布,模型预测验证数据中的目标比训练更“容易”。
this 回答指出,这种特殊情况的可能原因是训练期间的数据扩充。这是一种通过增加训练数据的可变性来规范模型的方法。
其他架构可以使用Dropout(或其修改),它们会故意“损害”训练性能,降低过度拟合的可能性。
请注意,您使用的是预训练模型,该模型已经包含有关如何解决分类问题的一些信息。如果您的域与其训练的数据没有太大差异,那么您可以期待现成的良好性能。