我正在为Pytorch的强化学习训练一些简单的神经网络。在训练结束时,我将模型保存为:
torch.save(self.policy_NN.state_dict(), self.model_fname)
在这一点上,它做得很好。然后,在另一个脚本中,我再次加载它,如下所示:
self.policy_NN.load_state_dict(torch.load(model_fname))
然后播放一段情节,就像训练从未停止一样(除非我不再进行DQN学习,而是在每一点上都采取贪婪的行动)。因此,我希望它的行为基本上与保存它时的行为相同。
但是,每当我加载它时,它的行为都完全不同,以至于在保存之前似乎根本没有学过。例如,如果我查看培训课程的最后1000个时间步,它将获得很多奖励,但是在加载之后,基本上没有任何奖励。
我已经验证(通过执行print(self.policy_NN.state_dict())
),在保存模型和再次加载模型时,权重和偏差实际上是相同的。
可能会发生什么?网络上还有其他可能无法以某种方式保存的东西吗?
答案 0 :(得分:0)
在eval
和train
模式下,下降层和其他一些层的行为不同。您可以在model.train()
和model.eval()
之间进行切换。
我记得读过RL通常会受到脆性学习的困扰,在该学习中,即使稍微改变输入也会导致性能大不相同。该示例是在Atari游戏上训练算法时,仅通过将屏幕右移一个像素就可以使网络失去所有性能提升。
您可能希望检查两种模式下您的环境的行为是否相似。