Tensorflow saver.restore()不还原我的模型检查点

2024-06-16 10:36:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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()函数,因为它还保存了培训中使用的变量的值?使用上面的示例代码,我可以如何实现它?谢谢


Tags: 模型selflayertargetoutputsizetflearning
1条回答
网友
1楼 · 发布于 2024-06-16 10:36:40

我认为问题在于,当您使用self.sess = tf.InteractiveSession() # Start the session还原模型时,您会创建一个新的sessionSaver用于保存模型的session应与用于恢复模型的tensorflow图位于session

下面是一个可以修改的工作示例

import numpy as np
import tensorflow as tf 

tf.reset_default_graph()

class Model():

    def __init__(self):
        
        self.x = tf.placeholder('float32',shape=[None,1])
        self.y = tf.placeholder('float32',shape=[None,1])
        
        self.w1 = tf.get_variable('w1',initializer=tf.zeros([1, 20]))
        self.b1 = tf.get_variable('b1',initializer=tf.zeros([20]))
        self.w2 = tf.get_variable('w2',initializer=tf.zeros([20, 1]))
        self.b2 = tf.get_variable('b2',initializer=tf.zeros([1]))
        
        self.y1 = tf.matmul(self.x, self.w1) + self.b1
        self.y2 = tf.matmul(self.y1, self.w2) + self.b2
        self.loss = tf.reduce_mean(tf.square(self.y - self.y2))
        
        self.train_step = tf.train.AdamOptimizer(0.01).minimize(self.loss)
        
        self.sess = tf.InteractiveSession()
        self.saver = tf.train.Saver()
        
    def train(self,x_train,y_train):
        
        self.sess.run(tf.global_variables_initializer())
        for iter in range(100):
            for _ in range(10):
                batch_xs, batch_ys = x_train[_*10:(_+1)*10][:,None],y_train[_*10:(_+1)*10][:,None]
                self.sess.run(self.train_step, feed_dict={self.x: batch_xs, self.y: batch_ys})
            if iter == 50:
                self.saver.save(self.sess, 'tmp/model.ckpt')
                self.inside_val = self.sess.run(self.loss, feed_dict={self.x:x_train[:,None],self.y:y_train[:,None]})
                
        print(self.sess.run(self.loss, feed_dict={self.x:x_train[:,None],self.y:y_train[:,None]}))

    def test(self,x_test,y_test):
        print(self.sess.run(self.loss, feed_dict={self.x: x_test[:,None], self.y: y_test[:,None]}))
        
    def reload(self,model_path,x_test,y_test):
        self.saver.restore(self.sess, model_path)
        return self.sess.run(self.loss, feed_dict={self.x: x_test[:,None], self.y: y_test[:,None]})
        
        
x_train = np.linspace(1, 6, 101)
y_train = 2 * x_train + 3 + 0.1 * np.random.random(101)

m = Model()
m.train(x_train,y_train)
# test
m.test(x_train,y_train)

try:
    assert m.inside_val == m.reload('tmp/model.ckpt',x_train,y_train)
    print('checked')
except AssertionError:
    print('The values are different.')

运行此脚本,您将发现已成功恢复经过训练的模型

相关问题 更多 >