python - Pytorch - 在 eval() 和 train() 模式之间来回切换
问题描述
我正在学习“深度强化学习”并在 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 层只是充当“通过”层。
在训练期间,一个
BatchNorm
层对其计算的均值和方差保持运行估计。运行总和保持默认动量 0.1。在评估期间,此运行均值/方差用于归一化。
eval()
因此,在和模式之间来回train()
切换不会对优化过程造成任何损害。
推荐阅读
- python - 如何使用 Python 显示实时数据
- android-webview - android,如何在不使用 javascript 的情况下监控 webview 内容大小的变化
- javascript - 尝试使用 HTML 在我的问题左侧添加“是”“否”标签
- kframework - # 关键字的文档,例如 #as?
- flutter - Flutter:如何制作一个更有深度的动画按钮?
- c# - 使用 azure storage tableapi 的控制台应用程序
- javascript - 修改另一个对象的一个对象的值,使用变量指向请求的属性
- flutter - FlutterError(在初始化绑定之前访问了ServicesBinding.defaultBinaryMessenger
- java - 文件存在于路径中,但不能仅在 android 10 中删除
- html - 如何使用 jquery 在数组中添加多个字符串?