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()
...
|
|
---|---|
在 train 模式下设置模型: • 归一化层1 使用每批次统计数据 • 激活 层2 |
将模型设置为 evaluation(推理)模式: • 归一化层使用运行统计数据 • 停用 层 |
相当于 。 |
您可以通过运行
model.train()
关闭评估模式。当您的模型作为推理引擎运行时,即测试、验证和预测时,您应该使用它(尽管实际上,如果您的模型不包含任何行为不同的层,这不会有什么区别)。
BatchNorm
,InstanceNorm
model.eval
是 torch.nn.Module
: 的一种方法
eval()
将模块设置为评估模式。
这仅对某些模块有影响。请参阅特定模块的文档,了解其在培训/评估模式下的行为详细信息(如果它们受到影响),例如
、Dropout
等BatchNorm
。self.train(False)
model.train
Umang Gupta 很好地解释了。
对上述答案的额外补充:
我最近开始使用 Pytorch-lightning,它将大部分样板包含在训练-验证-测试管道中。
除此之外,它还允许包装
model.eval()
和 model.train()
的 train_step
和 validation_step
回调,使 eval
和 train
几乎是多余的,这样你就永远不会忘记。
GFG对此有非常清楚的解释。
在我看来,这在 pytorch 中确实是一个糟糕的命名。 我建议改用 set_mode('eval') 或 set_mode('train') 之类的东西。