前言
今天 debug 代码的时候发现同一个图片输出不同类,然后一直 debug,发现是 ResNet 里面 使用了 BatchNorm2d 原因。
同一个五张图片,一起输入和分别输如会输出不同的结果。
因为输入激活的归一化(BatchNorm2d)会根据 batch size 改变
测试预测值也是这样。

训练
net.trian()和测试net.eval()模式,在一般简单的神经网络中,这两种模式基本一样,但是当网络涉及到到dropout和batchnorm的时候就会产生区别。

这个我理解就就是输入的图片数目不同,最后正则化之后的分布也不同,所以会存在输出不同的情况。
解决方法
聪明的同学可能已经猜到了,就是添加一个 net.eval() 在测试之前就可以。
最后的结果就会相同了,这个问题困扰了我一天,以前用 Tensorflow 还没遇到过这个问题。
在调试代码时,发现由于ResNet网络中的BatchNorm2d层,同一图片在批量输入和单独输入时得到不同结果。这归因于BatchNorm2d层的归一化过程依赖于批次大小(batchsize)。在train()和eval()两种模式下,特别是在涉及dropout和batchnorm时,其行为有别。解决方案是在测试前添加net.eval(),以确保一致的输出。此问题在Tensorflow中不常见。
8万+

被折叠的 条评论
为什么被折叠?



