Pytorch踩坑记录:关于用net.eval()和with no grad装饰器计算结果不一样的问题

Pytorch踩坑记录

相同点
net.eval()和with toch.no_grad()的相同点:都停止反向传播

不同点:
1、net.eval()
用net.eval(),此时BN层会用训练时的均值和方差。不重新计算输入数据的均值和方差,dropout会让所有激活单元都通过。

2、with toch.no_grad()
用with no grad(),BN层仍会计算输入数据的方差和均值,DropOut会按照设定的比例停止某些激活单元的传输。

对于测试集来说,要使用net.eval,因为使用with no_grad()计算了BN层会导致数据泄露的问题。
对于验证集来说,则使用哪个都可以。

经过我个人测试发现,在使用with toch.no_grad(),和net,eval()上的精度完全不一样。
如果训练的时候把测试集当作验证集,此时使用with toch.no_grad()来阻止反向传播,保存的模型,加载时调用test文件时使用net,eval,测试的精度会更低。

因此,如果把测试集做验证集使用,应该使用net,eval()。而如果是使用了验证集,验证集的数据不与测试集交叉,则用哪个都行。

仅个人拙见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值