我使用预训练的imagenet模型来使用ResNet101和BN层来训练另一个数据集。
训练结束后,我应该如何评估模型??我应该不设置chainer.using_config('train', False)吗??
我发现,即使我在训练数据集上进行评估,也发现评估准确率太低,不是(只达到80%),不是验证数据集。但是当我切换到chainer.using_config('train', True)时,准确率达到了99%。
我也把这个问题放到了https://github.com/chainer/chainer/issues/4553上
审阅者评论之一:
我认为问题是因为BatchNorm在训练和测试中使用了不同的统计数据。
我的答案是基于这样的假设,即您正在新数据集(包括训练/验证/测试集)上应用预训练模型。也许我错了
具体地说,如果使用预训练模型,则会重用原始数据集中批处理的统计信息(可能是ImageNet)。因此,在训练期间,统计数据(平均值,std)实际上是先前数据集和当前训练拆分的组合。然后,如果您再次使用chainer.using_config('train',False)评估训练分割,则会重置统计信息,因此完全来自训练分割。这些差异可能会导致性能下降,就像我之前遇到的那样。
无论如何,我认为重要的是要考虑使用什么数据来计算BatchNorm的统计数据的运行平均值,因为即使使用相同的数据,这也会对评估产生很大的影响。
发布于 2018-04-13 10:41:48
然后,如果您使用chainer.using_config(‘
’,False)再次评估训练分割,则会重置统计信息,因此它纯粹来自训练分割。
我想这种理解是错误的。正如在docstring of BarchNormalization中所写的,
在测试模式下,它使用预先计算的总体统计信息来归一化输入变量。如果人口统计信息是通过训练模式计算的,则是近似的,如果通过微调模式计算正确,则是精确的。
因此,当您使用with chainer.using_config('train', False)语句时,将使用在训练时学习到的统计信息。因此,结论是您应该在评估过程中使用with chainer.using_config('train', False)。
注意,在训练模式中,
在训练模式下,通过*批量统计*来归一化输入。它还通过移动平均值维护近似的总体统计数据,可用于测试模式下的即时评估。
因此,不使用整个统计数据,而是使用批处理统计数据。
https://stackoverflow.com/questions/49808312
复制相似问题