Python 评估pytorch模型:`with torch.no_grad`vs`model.eval()`
当我想在验证集上评估我的模型的性能时,是否更倾向于将Python 评估pytorch模型:`with torch.no_grad`vs`model.eval()`,python,machine-learning,deep-learning,pytorch,autograd,Python,Machine Learning,Deep Learning,Pytorch,Autograd,当我想在验证集上评估我的模型的性能时,是否更倾向于将与torch.no_grad:或model.eval()?TL;博士: 。他们做不同的事情,有不同的范围 带火炬的。无梯度-在自动标记中禁用梯度跟踪 model.eval() 例如,它禁用辍学,并使用整个人口统计数据 带火炬。无梯度 报告说: 禁用[sic]渐变计算的上下文管理器 当您确定不会调用Tensor.backward()时,禁用渐变计算对于推理非常有用。它将减少原本需要requires_grad=True的计算的内存消耗。在此模
与torch.no_grad:
或model.eval()
?TL;博士:
。他们做不同的事情,有不同的范围
- 带火炬的
-在。无梯度
中禁用梯度跟踪自动标记
model.eval()
- 例如,它禁用辍学,并使用整个人口统计数据
带火炬。无梯度
报告说:
禁用[sic]渐变计算的上下文管理器
当您确定不会调用Tensor.backward()
时,禁用渐变计算对于推理非常有用。它将减少原本需要requires_grad=True的计算的内存消耗。在此模式下,每次计算的结果都将具有requires\u grad=False
,即使输入具有requires\u grad=True
model.eval()
报告说:
将模块设置为评估模式
这仅对某些模块有任何影响。请参阅特定模块的文档,了解其在培训/评估模式下的行为的详细信息,如果他们受到影响,例如辍学
,批处理规范
,等等
,我用火炬举起了。
。没有梯度:
禁止计算向后传球的梯度。由于这些计算在推理过程中是不必要的,并且增加了非平凡的计算开销,因此在评估模型的速度时,有必要使用此上下文。然而,这不会影响结果
model.eval()。因此,如果您的模型包含此类模块,则必须启用此功能
出于上述原因,在推理过程中使用这两种方法是一种很好的做法。此处的类似讨论: