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()。而如果是使用了验证集,验证集的数据不与测试集交叉,则用哪个都行。

仅个人拙见。

你可能感兴趣的:(pytorch,深度学习)