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大幅提升。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值