评估pytorch模型:`with torch.no_grad` vs`model.eval()`

Tom*_*ale 8 machine-learning deep-learning pytorch autograd

当我想在验证集上评估模型的性能时,最好使用:

  • with torch.no_grad:

要么

  • model.eval()

Tom*_*ale 12

TL; DR:

使用这两种。他们做不同的事情,并且有不同的范围。

  • with torch.no_grad-禁用跟踪中的渐变autograd
  • model.eval()更改forward()被调用模块的行为
    • 例如,它禁用辍学并具有批处理规范使用整个人口统计信息

with torch.no_grad

torch.autograd.no_grad文件 说:

禁用[原文]梯度计算的上下文管理器。

当您确定不会调用时,禁用梯度计算对于推断很有用Tensor.backward()。它将减少原本会具有的计算的内存消耗requires_grad=True。在这种模式下,requires_grad=False即使输入具有,每次计算的结果也将具有requires_grad=True

model.eval()

nn.Module.eval文件说:

将模块设置为评估模式。

这仅对某些模块有影响。见特定模块的单证在培训/评估模式及其行为的详细信息,如果他们受到影响,例如DropoutBatchNorm等等。


pytorch的创建者说,应该对文档进行更新以建议两者的用法


uke*_*emi 5

with torch.no_grad:禁用向后传递的梯度计算。由于这些计算在推理过程中是不必要的,并且增加了不小的计算开销,因此在评估模型的速度时必须使用此上下文。但不会影响结果。

model.eval()确保在推理的前向传递过程中适当定义在训练与推理中表现不同的某些模块(例如 Dropout 和 BatchNorm) 。因此,如果您的模型包含此类模块,则必须启用此模块。

由于上述原因,在推理过程中同时使用两者是一种很好的做法。