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()。因此,如果您的模型包含此类模块,则必须启用此功能

出于上述原因,在推理过程中使用这两种方法是一种很好的做法。

此处的类似讨论: