昨天在跑一个强化学习模型的测试时,发现测试结果与TensorBoard可视化出来的reward相去甚远,遂查找错误。
查了模型Save和Restore的代码,没有发现问题,查了TensorBoard可视化的代码,没有发现问题。最后发现是环境的代码没有更新(忘记把新的gym环境代码更新到Anaconda中),导致Train和Test时的随机数种子不一样,生成的环境也不同。
引以为戒,以后要注意代码同步。
记录一下tensorflow中模型持久化和tensorboard可视化的方法
1. 模型存储
在网络的构造函数中创建一个saver成员变量,其中max_to_keep参数是保存模型文件数量的最大上限,设为None则无上限。
1 | self.saver = tf.train.Saver(max_to_keep=None) |
需要存储模型时,调用其save方法,将模型存储到ckpt文件中。一般会在训练N个周期后(如每100次更新)存储一次。
1 | ppo.saver.save(ppo.sess, model_dir + "/" + str(EP_NO) + ".ckpt") |
2. 模型恢复
模型恢复时(如Test或者继续训练现有模型时)调用saver的restore方法,path是ckpt文件的路径。
1 | ppo.saver.restore(ppo.sess, path) |
3. TensorBoard训练过程可视化
一般也是在网络的构造函数中定义好需要可视化的量。
1 | tf.summary.scalar("reward", self.reward) |
并定义一个merge之前所有summary的op
1 | self.merged_summary_op = tf.summary.merge_all() |
在需要可视化时run这个op,一般存储模型的同时也将该模型的一些指标如reward、loss等可视化到TensorBoard上,方便测试时选择效果较好的模型。
1 | _, summary = ppo.sess.run([ppo.reward, ppo.merged_summary_op], feed_dict={ |
之所以要传一个feed_dict是因为reward不是网络在运算过程中产生的,而是环境返回的,因此定义了一个placeholder,通过这样的方式将reward传回去,再传给TensorBoard可视化。