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()