如何在加载预训练参数然后评估验证数据集时使用chainer.links.BatchNormalization

时间:2018-04-13 02:14:15

标签: batch-normalization chainer

我使用预训练的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的统计数据的运行平均值非常重要,因为即使使用相同的数据,这也会对评估产生很大的影响。

1 个答案:

答案 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)

因此,未使用整个统计信息 ,而是使用批量统计