我使用预训练的imagenet模型来使用ResNet101和BN层来训练另一个数据集。
训练结束后,我应该如何评估模型?我不应该设置chainer.using_config('train', False)
??
我发现评估准确性太低,即使我在列车数据集上评估不是(仅达到80%)而不是验证数据集。但当我切换到chainer.using_config('train', True)
时,准确度达到99%。
我也把问题放在https://github.com/chainer/chainer/issues/4553
上评论员评论之一:
我认为问题是由于BatchNorm使用不同的统计数据进行培训和测试。
我的回答是基于您在新数据集上应用预训练模型(包括训练/验证/测试集)的假设。也许我错了
具体而言,如果您使用预先训练的模型,则会重复使用原始数据集(可能是ImageNet)中批次的统计信息。因此,在训练期间,统计数据(mean,std)实际上是先前数据集与当前训练分组的组合。然后,如果您使用chainer.using_config('train',False)再次评估训练分组,则统计信息将重置,因此纯粹来自训练分组。正如我之前遇到的那样,这些差异可能会导致性能下降。
无论如何,我认为考虑使用哪些数据来计算BatchNorm的统计数据的运行平均值非常重要,因为即使使用相同的数据,这也会对评估产生很大的影响。
答案 0 :(得分:0)
然后,如果您使用chainer.using_config('train',False)再次评估训练分组,则统计信息将被重置,因此纯粹来自训练分组。
我猜这种理解是错误的。正如docstring of BarchNormalization中所述,
dept_no,dt,hello 1,20180411,hello its me 2,20180412,here has tab 3,20180412,"here, is, commas"
因此,当您使用In testing mode, it uses pre-computed population statistics to normalize
the input variable. The population statistics is approximated if it is
computed by training mode, or accurate if it is correctly computed by
fine-tuning mode.
语句时,将使用在培训时学习的统计信息。
因此,结论是您应该在评估期间使用with chainer.using_config('train', False)
。
请注意,在训练模式中,
with chainer.using_config('train', False)
因此,未使用整个统计信息 ,而是使用批量统计。