0

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

4

1 回答 1

0

然后,如果您再次使用 chainer.using_config('train', False) 评估训练拆分,则统计信息将被重置,因此纯粹来自训练拆分。

我想这种理解是错误的。正如BarchNormalization的文档字符串中所写,

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)在评估期间使用。

请注意,在训练模式下,

In training mode, it normalizes the input by *batch statistics*. It also
maintains approximated population statistics by moving averages, which can
be used for instant evaluation in testing mode.

因此,不使用整体统计信息,而是使用批量统计信息

于 2018-04-13T02:41:47.973 回答