【问题标题】:Pytorch - going back and forth between eval() and train() modesPytorch - 在 eval() 和 train() 模式之间来回切换
【发布时间】:2020-02-15 06:37:01
【问题描述】:

我正在学习“深度强化学习”,并在 pytorch 的强化学习 (DQN) 教程之后构建自己的示例。

我正在执行演员的策略如下: 1.model.eval() 2. 从模型中获得最佳行动 3.self.net.train()

问题是: 在 eval() 和 train() 模式之间来回切换是否会对优化过程造成任何损害?

该模型仅包含 Linear 和 BatchNorm1d 层。 据我所知,使用 BatchNorm1d 时必须执行 model.eval() 才能使用模型,因为 eval() 和 train() 模式的结果不同。

训练分类神经网络时,model.eval()只在训练完成后执行,但在“深度强化学习”的情况下,通常使用策略,然后继续优化过程。

我想知道在模式之间来回切换是否对优化过程“无害”?

def strategy(self, state):
    # Explore or Exploit
    if self.epsilon > random():
        action = choice(self.actions)
    else:
        self.net.eval()
        action = self.net(state.unsqueeze(0)).max(1)[1].detach()
        self.net.train()

【问题讨论】:

  • eval 模式只是改变了 dropout 和 batch norm 之类的行为。例如,dropout 成为一个传递层,batch norm 使用正在运行的统计信息来规范化,而不是当前的批处理统计信息。 Batch norm 也不会更新 eval 模式下的运行统计信息。它不应该对训练产生任何负面影响。

标签: python neural-network deep-learning pytorch reinforcement-learning


【解决方案1】:

eval() 将模型置于评估模式。

  1. 在评估模式下,Dropout 层只是充当“passthrough”层。

  2. 在训练期间,BatchNorm 层对其计算的均值和方差保持运行估计。运行总和保持默认动量 0.1。在评估期间,此运行均值/方差用于归一化。

因此,在eval()train() 模式之间来回切换不会对优化过程造成任何损害。

【讨论】:

    猜你喜欢
    • 2019-10-17
    • 1970-01-01
    • 2022-08-08
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 2020-08-24
    • 2020-01-03
    • 1970-01-01
    相关资源
    最近更新 更多