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

Aer*_*rin 31 python pytorch

它调用forward()nn.Module?我想当我们调用模型时,forward正在使用方法.为什么我们需要指定train()?

Uma*_*pta 39

model.train()告诉你的模型你正在训练模型.因此,有效的层次如辍学,蝙蝠侠等在火车和测试程序上表现不同,知道发生了什么,因此可以相应地表现.

更多细节:它设置训练模式(参见源代码).您可以调用model.eval()或model.train(mode = False)来告诉您正在测试.期望model.eval()功能训练模型有点直观,但它没有这样做.它只是设置模式.

  • 是否有一个标志来检测模型是否处于评估模式?例如`mdl.is_eval()`? (4认同)
  • 使用“model.training”标志。当处于“eval”模式时,它是“False”。 (2认同)
  • @UmangGupta-实际上我现在才知道发生了什么。我的 model.train() 实际上影响了 batchnorm 和 dropout 层 - 这反过来又影响了模型性能。 (2认同)

小智 13

有两种方法可以让模型知道您的意图,即您是要训练模型还是要使用模型进行评估。如果model.train()模型知道它必须学习层,并且当我们使用model.eval()它时表明模型不需要学习任何新东西并且模型用于测试。 model.eval()也是必要的,因为在 pytorch 中,如果我们使用的是 batchnorm,而在测试期间如果我们只想传递单个图像,如果model.eval()未指定,pytorch 会抛出错误。


pro*_*sti 9

这是以下代码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)

模式traineval是我们可以在其中设置模块的仅有的两种模式,它们是完全相反的。

那只是一个self.training标志,目前 辍学bachnorm关心该标志。

默认情况下,此标志设置为True


uke*_*emi 9

model.train() model.eval()
将您的模型设置为训练模式,即

BatchNorm层使用每批统计数据
Dropout层已激活


设置你的模型中的eval uation(推理)模式即

BatchNorm层使用运行统计
Dropout层去激活等

等价于model.train(False)

注意:这些函数调用都没有向前/向后传递。他们告诉模型运行如何行动。

这是重要的,因为一些模块(层)(例如DropoutBatchNorm)设计培训VS推理过程中的行为方式不同,因此,该模型会产生意想不到的结果,如果在错误的模式下运行。