问题描述:
本人使用pytorch1.5版本,构建EfficientNet网络,在训练之前使用model.train()设置为训练模式。每次训练结束后进行验证集的推理测试;对于含有dropout和batchnorm层的神经网络在推理前需要用model.eval()设置dropout和batchnorm的冻结。但是对于推理结果,不同的输入,具有相同的输出;错误率很高,并且loss值也于训练时差距巨大。
解决方法:
这个错误可能是由于在batchnorm中的动量(momentum)设置而导致。在进行推理时,设置较大的动量值可以解决这个问题。如下:
nn.BatchNorm2d(out_planes, eps=1e-3, momentum=1))
参考:
[1] https://www.kaggle.com/c/recursion-cellular-image-classification/discussion/101997
[2] https://github.com/pytorch/pytorch/issues/4741
[3] https://discuss.pytorch.org/t/model-eval-gives-incorrect-loss-for-model-with-batchnorm-layers/7561/22