我使用预训练的 imagenet 模型来使用 ResNet101 和 BN 层来训练另一个数据集。
训练结束后,我应该如何评估模型?我不应该设置chainer.using_config('train', False)
吗?
我发现即使我在训练数据集上评估(仅达到 80%)而不是验证数据集,评估的准确性也太低了。但是当我切换到 时chainer.using_config('train', True)
,准确率可以达到 99%。
我也在https://github.com/chainer/chainer/issues/4553上提出了这个问题
审稿人评论之一:
我认为问题是由于 BatchNorm 使用不同的统计数据进行训练和测试。
我的回答是基于您在新数据集(包括训练/验证/测试集)上应用预训练模型的假设。也许我错了
具体来说,如果您使用预训练模型,那么原始数据集(可能是 ImageNet)中批次的统计信息会被重用。因此,在训练期间,统计数据(均值、标准差)实际上是先前数据集和当前训练拆分的组合。然后,如果您再次使用 chainer.using_config('train', False) 评估训练拆分,则统计信息将被重置,因此纯粹来自训练拆分。正如我之前遇到的那样,这些差异可能会导致性能下降。
无论如何,我认为重要的是要考虑使用哪些数据来计算 BatchNorm 的统计数据的运行平均值,因为即使使用相同的数据,这也会对评估产生很大的影响。