model.eval()在pytorch中做什么?

问题描述 投票:0回答:6

我什么时候应该使用

.eval()
?我知道它应该让我“评估我的模型”。如何在训练时将其关闭?

使用 .eval() 进行训练示例

代码

python machine-learning deep-learning pytorch
6个回答
393
投票

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

# evaluate model:
model.eval()

with torch.no_grad():
    ...
    out_data = model(data)
    ...

但是,请不要忘记在评估步骤后返回到

training
模式:

# training step
...
model.train()
...

92
投票
model.train()
model.eval()
train 模式下设置模型:

• 归一化层1 使用每批次统计数据
• 激活
Dropout
2
将模型设置为 evaluation(推理)模式:

• 归一化层使用运行统计数据
• 停用
Dropout
相当于
model.train(False)

您可以通过运行

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


  1. 例如
    BatchNorm
    InstanceNorm
  2. 这包括 RNN 模块的子模块 etc

22
投票

model.eval
torch.nn.Module
:

的一种方法

eval()

将模块设置为评估模式。

这仅对某些模块有影响。请参阅特定模块的文档,了解其在培训/评估模式下的行为详细信息(如果它们受到影响),例如

Dropout
BatchNorm

这相当于

self.train(False)

相反的方法是

model.train
Umang Gupta 很好地解释了。


3
投票

对上述答案的额外补充:

我最近开始使用 Pytorch-lightning,它将大部分样板包含在训练-验证-测试管道中。

除此之外,它还允许包装

model.eval()
model.train()
train_step
validation_step
回调,使
eval
train
几乎是多余的,这样你就永远不会忘记。


0
投票

模型.eval()

GFG对此有非常清楚的解释。

  • 将 PyTorch 模型设置为评估模式,禁用 dropout 等操作,对于推理和测试很有用。
  • 该方法在确保推理和测试过程中模型行为一致且可靠方面发挥着关键作用。

0
投票

在我看来,这在 pytorch 中确实是一个糟糕的命名。 我建议改用 set_mode('eval') 或 set_mode('train') 之类的东西。

© www.soinside.com 2019 - 2024. All rights reserved.