它调用forward()的nn.Module?我想当我们调用模型时,forward正在使用方法.为什么我们需要指定train()?
Uma*_*pta 39
model.train()告诉你的模型你正在训练模型.因此,有效的层次如辍学,蝙蝠侠等在火车和测试程序上表现不同,知道发生了什么,因此可以相应地表现.
更多细节:它设置训练模式(参见源代码).您可以调用model.eval()或model.train(mode = False)来告诉您正在测试.期望model.eval()功能训练模型有点直观,但它没有这样做.它只是设置模式.
小智 13
有两种方法可以让模型知道您的意图,即您是要训练模型还是要使用模型进行评估。如果model.train()模型知道它必须学习层,并且当我们使用model.eval()它时表明模型不需要学习任何新东西并且模型用于测试。
model.eval()也是必要的,因为在 pytorch 中,如果我们使用的是 batchnorm,而在测试期间如果我们只想传递单个图像,如果model.eval()未指定,pytorch 会抛出错误。
这是以下代码module.train():
def train(self, mode=True):
r"""Sets the module in training mode."""
self.training = mode
for module in self.children():
module.train(mode)
return self
Run Code Online (Sandbox Code Playgroud)
这是module.eval。
def eval(self):
r"""Sets the module in evaluation mode."""
return self.train(False)
Run Code Online (Sandbox Code Playgroud)
模式train和eval是我们可以在其中设置模块的仅有的两种模式,它们是完全相反的。
那只是一个self.training标志,目前仅 辍学,bachnorm关心该标志。
默认情况下,此标志设置为True。
model.train() |
model.eval() |
|---|---|
| 将您的模型设置为训练模式,即 • BatchNorm层使用每批统计数据• Dropout层已激活等 |
设置你的模型中的eval uation(推理)模式即 • BatchNorm层使用运行统计• Dropout层去激活等等价于 model.train(False)。 |
注意:这些函数调用都没有向前/向后传递。他们告诉模型在运行时如何行动。
这是重要的,因为一些模块(层)(例如Dropout,BatchNorm)设计培训VS推理过程中的行为方式不同,因此,该模型会产生意想不到的结果,如果在错误的模式下运行。
| 归档时间: |
|
| 查看次数: |
19869 次 |
| 最近记录: |