train()与eval()

文章目录

  • Fluid Model train()与eval()

Fluid Model train()与eval()

在浏览PaddlePaddle的动态图源码时,一定 会看到在生成train()函数时,首先会调用model.train(),中间每个epoch后会调用model.eval(),一段代码之后,又再调用modle.train().我对PaddlePaddle的架构还不熟悉,一直纳闷为啥用这样做。通过跟一位朋友讨论之后,终于明白了原因。

原来利用PaddlePaddle生成的网络,可以实时的在训练和预测模式下转换, train()转成训练模式,而eval()转成预测模式。那为什么要在中间进行模式的转换?因为在预测模式下,为了节省时间,有一些步骤可以省去,比如batch normalization 和dropout, 这一点在eval()源码中写的很清楚:

def eval(self):
        """
        Sets this Layer and all its sublayers to evaluation mode.
        This only effects certain modules like `Dropout` and `BatchNorm`.
        Returns:
            None
        """
        # global setting
        framework._dygraph_tracer().eval_mode()
        # Layer-level setting
        self.training = False
        for layer in self.sublayers():
            layer.eval()           

因此在检测已学到的参数的性能时,要调用model.eval()转换模式。在检测完成之后,继续训练过程,要将batch normalization 和dropout重新加入网络,所以要再次调用model.train()。

假如在网络中没有用到batch normalization 和dropout,我们就不需要调用train()和eval()进行转换。
有时为了快速得到最终的训练结果,不需要边训练,边测试,那也不需要调用train()和eval()进行转换。

你可能感兴趣的:(深度学习,神经网络)