我们用pytorch搭建神经网络经常见到model.eval()与torch.no_grad(),它们有什么区别?是怎么工作的呢?现在就让我们来探究其中的奥秘
model.eval()
- 使用model.eval()切换到测试模式,不会更新模型的k,b参数
- 通知dropout层和batchnorm层在train和val中间进行切换
在train模式,dropout层会按照设定的参数p设置保留激活单元的概率(保留概率=p,比如keep_prob=0.8),batchnorm层会继续计算数据的mean和var并进行更新
在val模式下,dropout层会让所有的激活单元都通过,而batchnorm层会停止计算和更新mean和var,直接使用在训练阶段已经学出的mean和var值 - model.eval()不会影响各层的gradient计算行为,即gradient计算和存储与training模式一样,只是不进行反向传播(backprobagation)
torch.no_grad()
使用方法:
with torch.no_grad():