我在StackOverflow上见过几次提到这个问题,但没有一个解决方案对我有帮助
我在tensorflow.compat.v1
中训练了一个演员-评论家强化学习网络,并在整个训练过程中使用saver.save()
函数来保存模型文件,因此我最终得到了.index
、.meta
和.data
文件。在Windows中使用Python 3.6
现在在第二个脚本中,我想重新加载这个使用完全相同的体系结构和数据集的模型,但是当我运行它时,我得到了完全不同的结果,我想这表明我没有正确加载模型。注意,我正在使用self.sess = tf.InteractiveSession()
,所以我没有在with sess
循环中运行它
因此,在培训脚本中,我参考了我的演员和评论家网络,开始课程:
tf.reset_default_graph()
self.actor = Actor("actor-original", self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE)
self.actor_target = Actor("actor-target", self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE)
self.critic = Critic("critic-original", self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE)
self.critic_target = Critic("critic-target", self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE)
self.grad_critic = tf.gradients(self.critic.logits, self.critic.Y)
self.actor_critic_grad = tf.placeholder(tf.float32, [None, self.OUTPUT_SIZE])
weights_actor = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope="actor")
self.grad_actor = tf.gradients(self.actor.logits, weights_actor, -self.actor_critic_grad)
grads = zip(self.grad_actor, weights_actor)
self.optimizer = tf.train.AdamOptimizer(self.LEARNING_RATE).apply_gradients(grads) # Adam optimizer
self.sess = tf.InteractiveSession() # Start the session
self.sess.run(tf.global_variables_initializer())
然后,当满足某些指标时,我在培训期间使用下面的saver.save()
函数:
saver = tf.train.Saver(max_to_keep=1)
save_path = saver.save(self.sess, "./model_checkpoint_files"))
现在,在我的第二个脚本中,我想重新加载这个模型。到目前为止,我得到的是:
tf.reset_default_graph()
self.actor = Actor("actor-original", self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE)
self.actor_target = Actor("actor-target", self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE)
self.critic = Critic("critic-original", self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE)
self.critic_target = Critic("critic-target", self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE)
self.grad_critic = tf.gradients(self.critic.logits, self.critic.Y)
self.actor_critic_grad = tf.placeholder(tf.float32, [None, self.OUTPUT_SIZE])
weights_actor = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope="actor")
self.grad_actor = tf.gradients(self.actor.logits, weights_actor, -self.actor_critic_grad)
grads = zip(self.grad_actor, weights_actor)
self.optimizer = tf.train.AdamOptimizer(self.LEARNING_RATE).apply_gradients(grads) # Adam optimizer
self.sess = tf.InteractiveSession() # Start the session
#self.sess.run(tf.global_variables_initializer())
saver = tf.compat.v1.train.Saver()
#saver = tf.compat.v1.train.import_meta_graph("./model_checkpoint_files.meta")
saver.restore(self.sess, "./model_checkpoint_files")
#self.sess.run(tf.local_variables_initializer()) # tf.initialize_all_variables() # tf.local_variables_initializer() # tf.global_variables_initializer()
如您所见,我尝试了一些不同的模型加载组合,以尝试使其正常工作。在我的第二个脚本中,我只是调用self.sess.run()
以获得最佳操作
有人看到我丢失的东西吗?只需加载模型并在同一数据集上使用它即可获得可重复的结果。谢谢
更新
我读得越多,我就想原因是一些值没有使用tf.saver()
函数保存,我应该做的是使用saved_model()
函数,因为它还保存了培训中使用的变量的值?使用上面的示例代码,我可以如何实现它?谢谢
我认为问题在于,当您使用
self.sess = tf.InteractiveSession() # Start the session
还原模型时,您会创建一个新的session
。Saver
用于保存模型的session
应与用于恢复模型的tensorflow
图位于session
内下面是一个可以修改的工作示例
运行此脚本,您将发现已成功恢复经过训练的模型
相关问题 更多 >
编程相关推荐