問題描述:
本人使用pytorch1.5版本槽驶,構(gòu)建EfficientNet網(wǎng)絡(luò)掂铐,在訓(xùn)練之前使用model.train()設(shè)置為訓(xùn)練模式。每次訓(xùn)練結(jié)束后進行驗證集的推理測試全陨;對于含有dropout和batchnorm層的神經(jīng)網(wǎng)絡(luò)在推理前需要用model.eval()設(shè)置dropout和batchnorm的凍結(jié)蒿秦。但是對于推理結(jié)果,不同的輸入棍鳖,具有相同的輸出;錯誤率很高镜悉,并且loss值也于訓(xùn)練時差距巨大。
解決方法:
這個錯誤可能是由于在batchnorm中的動量(momentum)設(shè)置而導(dǎo)致侣肄。在進行推理時醇份,設(shè)置較大的動量值可以解決這個問題。如下:
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