我有一个模型,它用于一个用于检查的强化学习算法,一个la AlphaZero。与该网络类似,在每个卷积层之后,地雷具有批量归一化的特点。我知道当使用.eval()和.train()时,这会导致不同的行为/输出。
但是,我不确定什么时候应该使用eval()和train()。该模型用于算法中的两个不同的点:首先,利用网络生成多个自玩游戏。其次,使用这些游戏的位置对网络进行训练,从游戏的终端值(-1,0,+1)获取评估标签,并将“改进策略”标签作为UCB树搜索后的访问计数。
在我看来,当网络得到充分的培训后,我将使用.eval(),因为这应该是‘网络真正的想法’。因此,对于自我游戏,我也应该使用.eval()。表面上,这将导致更强的自我博弈,从而提高数据的质量.最后,如果我在自我播放步骤中使用.eval(),我也必须在学习阶段使用它,否则如果网络输出不同,甚至不会使用实际输出计算损失!我知道网络从.train()中学习有价值的信息,因为批处理规范层了解数据宇宙的均值/方差。
当我键入这些内容时,我开始怀疑自己和学习阶段都应该使用.train()。然而,这似乎是错误的,因为对于给定的位置,train()和eval()之间的输出可能会有相当大的差异。
发布于 2019-06-27 15:25:24
我可以看到自玩阶段同时使用.train()
和.eval()
的参数,所以我看了一下facebook的精灵OpenGo的实现,并看到他们在自我游戏中采用了eval
模式(参见selfplay.py)。我会像他们那样做,因为他们的软件似乎有效。
发布于 2019-06-27 14:23:38
从PyTorch文档中可以看出,古旧和火车也做了同样的事情。虽然它们没有明确提到它,但文档是相同的:
将模块设置为评估模式。这只对某些模块有任何影响。请参阅特定模块的文档,以了解它们在培训/评估模式中的行为细节,如果它们受到影响,例如Dropout、BatchNorm等。
来自这个PyTorch论坛的其他想法:
是的,它们是一样的。默认情况下,所有模块都被初始化为训练模式(self.training = True)。还要注意,在培训/和评估过程中,某些层有不同的行为(比如BatchNorm、Dropout),因此设置它很重要。此外,作为一般编程的经验规则,尝试显式地说明您的意图,并在必要时设置model.train()和model.eval()。
关于自我游戏和评估的情况,我个人会从在.eval()
模式下进行自我游戏开始,以便在自我游戏和最终执行模式(即一个真正的游戏)之间保持最高的保真度。你所说的差异应该像模型一样趋同,但我同意,从一开始它可能是一个大问题。
一个想法是用一个温暖的开始..。在.train()
模式下运行给定次数的迭代(练习游戏,或者只是几轮自我播放),然后逐步淘汰,因为模型有望开始收敛。
https://datascience.stackexchange.com/questions/54620
复制相似问题