Pytorch:含BatchNorm的模型的loss在train和eval时差太远?可能是summary搞的鬼...

结论:

在Pytorch中,如果神经网络中使用了BatchNorm,那么在测试时,在你执行model.eval()之前,不要喂给网络任何数据,也不要使用torchsummary的summary函数测试网络参数量。

细节:

训练了一个模型,训练集loss0.05,测试集loss0.15,差了好远。。
仔细核对了一下,网络结构一样,载入参数一样,pipeline一样,数据一样,全是一样的,结果输出差了很多。调试一天后定位问题,出在BatchNorm上。

我们在测试模型时,首先会实例化一个model,然后为这个model加载训练时生成的权重数据,然后再使用这个model做测试(即喂给数据、计算loss)。

特别值得提出的是,如果在load了权重之后马上使用summary查看网络结构,summary函数会给模型送入一个测试变量。显然,这个测试变量是要经过BN层的;如果此时你的model不是eval模式,而是train模式,那么这个测试变量将会立刻改变模型的BatchNorm层参数(主要是改变running_var和running_mean,而且无需step,在forward的时候就会给你改了),从而导致模型测试时loss大幅提升。

你可能感兴趣的:(python踩坑,pytorch,深度学习,神经网络)