首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么时候在Pytoch中使用model.train()和model.eval()?

什么时候在Pytoch中使用model.train()和model.eval()?
EN

Data Science用户
提问于 2019-06-27 14:12:36
回答 2查看 4.1K关注 0票数 0

我有一个模型,它用于一个用于检查的强化学习算法,一个la AlphaZero。与该网络类似,在每个卷积层之后,地雷具有批量归一化的特点。我知道当使用.eval()和.train()时,这会导致不同的行为/输出。

但是,我不确定什么时候应该使用eval()和train()。该模型用于算法中的两个不同的点:首先,利用网络生成多个自玩游戏。其次,使用这些游戏的位置对网络进行训练,从游戏的终端值(-1,0,+1)获取评估标签,并将“改进策略”标签作为UCB树搜索后的访问计数。

在我看来,当网络得到充分的培训后,我将使用.eval(),因为这应该是‘网络真正的想法’。因此,对于自我游戏,我也应该使用.eval()。表面上,这将导致更强的自我博弈,从而提高数据的质量.最后,如果我在自我播放步骤中使用.eval(),我也必须在学习阶段使用它,否则如果网络输出不同,甚至不会使用实际输出计算损失!我知道网络从.train()中学习有价值的信息,因为批处理规范层了解数据宇宙的均值/方差。

当我键入这些内容时,我开始怀疑自己和学习阶段都应该使用.train()。然而,这似乎是错误的,因为对于给定的位置,train()和eval()之间的输出可能会有相当大的差异。

EN

回答 2

Data Science用户

回答已采纳

发布于 2019-06-27 15:25:24

我可以看到自玩阶段同时使用.train().eval()的参数,所以我看了一下facebook的精灵OpenGo的实现,并看到他们在自我游戏中采用了eval模式(参见selfplay.py)。我会像他们那样做,因为他们的软件似乎有效。

票数 1
EN

Data Science用户

发布于 2019-06-27 14:23:38

从PyTorch文档中可以看出,古旧火车也做了同样的事情。虽然它们没有明确提到它,但文档是相同的:

将模块设置为评估模式。这只对某些模块有任何影响。请参阅特定模块的文档,以了解它们在培训/评估模式中的行为细节,如果它们受到影响,例如Dropout、BatchNorm等。

来自这个PyTorch论坛的其他想法:

是的,它们是一样的。默认情况下,所有模块都被初始化为训练模式(self.training = True)。还要注意,在培训/和评估过程中,某些层有不同的行为(比如BatchNorm、Dropout),因此设置它很重要。此外,作为一般编程的经验规则,尝试显式地说明您的意图,并在必要时设置model.train()和model.eval()。

关于自我游戏和评估的情况,我个人会从在.eval()模式下进行自我游戏开始,以便在自我游戏和最终执行模式(即一个真正的游戏)之间保持最高的保真度。你所说的差异应该像模型一样趋同,但我同意,从一开始它可能是一个大问题。

一个想法是用一个温暖的开始..。在.train()模式下运行给定次数的迭代(练习游戏,或者只是几轮自我播放),然后逐步淘汰,因为模型有望开始收敛。

票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/54620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档