首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在加载预训练参数然后评估验证数据集时使用chainer.links.BatchNormalization

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

Stack Overflow用户
提问于 2018-04-13 10:14:15
回答 1查看 302关注 0票数 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)。因此,在训练期间,统计数据(平均值,std)实际上是先前数据集和当前训练拆分的组合。然后,如果您再次使用chainer.using_config('train',False)评估训练分割,则会重置统计信息,因此完全来自训练分割。这些差异可能会导致性能下降,就像我之前遇到的那样。

无论如何,我认为重要的是要考虑使用什么数据来计算BatchNorm的统计数据的运行平均值,因为即使使用相同的数据,这也会对评估产生很大的影响。

EN

回答 1

Stack Overflow用户

发布于 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)

注意,在训练模式中,

在训练模式下,通过*批量统计*来归一化输入。它还通过移动平均值维护近似的总体统计数据,可用于测试模式下的即时评估。

因此,不使用整个统计数据,而是使用批处理统计数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49808312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档