model.eval() 在 pytorch 中有什么作用?

Gul*_*zar 93 python machine-learning deep-learning pytorch

我正在使用此代码,并且model.eval()在某些情况下看到了。

我知道它应该允许我“评估我的模型”,但我不明白什么时候应该和不应该使用它,或者如果关闭如何关闭。

我想运行上面的代码来训练网络,并且还能够在每个时期运行验证。我还是做不到。

trs*_*chn 152

model.eval()是模型的某些特定层/部分的一种开关,在训练和推理(评估)期间表现不同。例如,Dropouts Layers、BatchNorm Layers 等。您需要在模型评估期间关闭它们,并.eval()会为您完成。此外,评估/验证的常见做法是torch.no_grad()成对使用model.eval()以关闭梯度计算:

# evaluate model:
model.eval()

with torch.no_grad():
    ...
    out_data = model(data)
    ...
Run Code Online (Sandbox Code Playgroud)

但是,不要忘记training在 eval 步骤后返回模式:

# training step
...
model.train()
...
Run Code Online (Sandbox Code Playgroud)

  • `torch.no_grad()` 是一个上下文管理器,因此您应该以 `with torch.no_grad():` 的形式使用它,保证在离开 `with ...` 块模型时自动打开梯度计算 (11认同)
  • 因此,“model.train()”和“model.eval()”仅对图层起作用,而不对渐变起作用,默认情况下,梯度补偿处于打开状态,但在评估期间使用上下文管理器“torch.no_grad()”允许您轻松关闭然后在最后自动打开渐变补偿 (10认同)
  • @shtse8,我们在评估期间不计算或使用梯度,因此关闭自动梯度将加快执行速度并减少内存使用 (7认同)
  • 为什么我们需要在 Eval 上关闭 grad comp? (4认同)
  • @NagabhushanSN 是的!它们递归地工作,`.eval()`看起来像这样:`for module in self.children(): module.train(False)`和`for module in self.children(): module.train(True) ` 对于 `.train()` (3认同)
  • 是否有一个标志来检测模型是否处于评估模式?例如`mdl.is_eval()`? (2认同)

uke*_*emi 12

model.train() model.eval()
训练模式下设置模型:

• 标准化层1使用每批统计信息
• 激活Dropout2


集模型中的eval uation(推断)模式:

•规范化层使用运行统计
•去激活Dropout

相当于model.train(False)

您可以通过运行关闭评估模式model.train()。您应该在将模型作为推理引擎运行时使用它 - 即在测试、验证和预测时(尽管实际上如果您的模型不包含任何不同行为的层,它不会有任何区别)。


  1. 例如BatchNormInstanceNorm
  2. 这包括 RNN 模块等的子模块。


pro*_*sti 10

model.eval是一种方法torch.nn.Module

eval()

将模块设置为评估模式。

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

这相当于self.train(False).

model.trainUmang Gupta 很好地解释了相反的方法。

  • 是否有一个标志来检测模型是否处于评估模式?例如`mdl.is_eval()`? (2认同)
  • 是的,@CharlieParker `self.training` 标志如所解释的 /sf/answers/3977998321/ (2认同)