Python model.eval()在pytorch中做什么?
我正在使用,在某些情况下看到了Python model.eval()在pytorch中做什么?,python,machine-learning,deep-learning,pytorch,Python,Machine Learning,Deep Learning,Pytorch,我正在使用,在某些情况下看到了model.eval() 我知道它应该允许我“评估我的模型”,但我不知道什么时候应该和不应该使用它,或者如果关闭它,如何关闭它 我想运行上面的代码来训练网络,并且能够在每个阶段运行验证。我仍然无法执行此操作。model.eval()是模型中某些特定层/部分的一种开关,这些层/部分在训练和推理(评估)期间表现不同。例如,退出层、BatchNorm层等。您需要在模型求值期间关闭它们,.eval()将为您执行此操作。此外,评估/验证的常见做法是使用torch.no_gra
model.eval()
我知道它应该允许我“评估我的模型”,但我不知道什么时候应该和不应该使用它,或者如果关闭它,如何关闭它
我想运行上面的代码来训练网络,并且能够在每个阶段运行验证。我仍然无法执行此操作。model.eval()
是模型中某些特定层/部分的一种开关,这些层/部分在训练和推理(评估)期间表现不同。例如,退出层、BatchNorm层等。您需要在模型求值期间关闭它们,.eval()
将为您执行此操作。此外,评估/验证的常见做法是使用torch.no_grad()
与model.eval()
配合使用来关闭梯度计算:
#评估模型:
model.eval()
使用手电筒。无梯度()
...
输出数据=模型(数据)
...
但是,不要忘记在评估步骤后返回到培训
模式:
#培训步骤
...
模型列车()
...
是一种:
eval()
将模块设置为评估模式
这仅对某些模块有任何影响。有关特定模块在培训/评估模式下的行为的详细信息,请参阅特定模块的文档,如果它们受到影响,例如,BatchNorm
等
这相当于
Umang Gupta很好地解释了相反的方法。对上述答案的额外补充: 我最近开始使用,它在培训验证测试管道中封装了很多样板文件 除此之外,它允许
train\u步骤
和validation\u步骤
回调来包装eval
和train
,从而使model.eval()和model.train()
近乎冗余,因此您永远不会忘记
model.eval()
在训练模式下设置模型:
标准化层1使用每批统计数据
•激活退出层2
在评估(推断)模式下设置模型:
•标准化层使用运行统计信息
•取消激活退出层
相当于模型。训练(错误)
。
torch.no_grad()
是一个上下文管理器,因此您应该以的形式与torch一起使用它。no_grad():
,这保证了在离开时,块模型将自动打开梯度计算,因此,model.train()
和model.eval()
仅对层有效,对梯度无效,默认情况下,渐变补偿是打开的,但在评估过程中使用上下文管理器torch.no_grad()
可以轻松关闭渐变补偿,然后在末尾自动打开渐变补偿为什么我们需要在评估时关闭渐变补偿?@shtse8我们在评估过程中不计算或使用渐变,因此,关闭自动加载将加快执行速度并减少内存usage@NagabhushanSN对它们是递归工作的,对于self.children():module.train(False)
和self.children():module.train(True)
的.train(),.train()这是否回答了您的问题?是否有用于检测模型是否处于评估模式的标志?e、 g.mdl.is_eval()
?你能详细说明你的第二点吗?对不起,我看到删除而不是详细说明。对于这个问题,有点难选:Lightning为您处理训练/测试循环,您只需定义train\u step
和val\u step
等等。model.eval()
和model.train()
都是在后台完成的,您不必担心它们。我建议你看一些他们的视频,这是一个值得30分钟的投资。是否有一个标志来检测模型是否处于评估模式?e、 g.mdl.is_eval()
?是的,@CharlieParkerself.training
标志如所述