【问题标题】:How to use chainer.links.BatchNormalization when loading pretrained parameter then evaluating validation dataset加载预训练参数然后评估验证数据集时如何使用chainer.links.BatchNormalization
【发布时间】:2023-03-27 10:42:01
【问题描述】:

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

【问题讨论】:

    标签: batch-normalization chainer


    【解决方案1】:

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

    我猜这种理解是错误的。如docstring of 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.
    

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

    【讨论】:

    • 但是我的实验结果告诉我,当我与chainer.using_config('train', False)一起使用时,准确率下降了很多。
    • 但是如何评价呢?你还是不回答我的问题
    猜你喜欢
    • 2012-08-27
    • 2021-10-22
    • 2020-02-29
    • 2022-10-24
    • 2019-05-01
    • 2020-09-14
    • 1970-01-01
    • 2017-08-20
    • 2018-05-06
    相关资源
    最近更新 更多