Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tensorflow:保存和恢复变量问题_Python_Tensorflow - Fatal编程技术网

Python Tensorflow:保存和恢复变量问题

Python Tensorflow:保存和恢复变量问题,python,tensorflow,Python,Tensorflow,如何在tensorflow中保存和恢复变量 我有个问题。我的代码: import tensorflow as tf v1 = tf.Variable(tf.zeros([2, 2], dtype=tf.float32, name='v1')) saver = tf.train.Saver() with tf.Session() as sess: sess.run(tf.global_variables_initializer()) print sess.run(v1)

如何在tensorflow中保存和恢复变量

我有个问题。我的代码:

import tensorflow as tf

v1 = tf.Variable(tf.zeros([2, 2], dtype=tf.float32, name='v1'))
saver = tf.train.Saver()

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print sess.run(v1)
    save_path = saver.save(sess, 'model.ckpt')
    print "model saved in file:", save_path
    v1 = v1 + 1
    print sess.run(v1)
    saver = tf.train.import_meta_graph('model.ckpt.meta')
    saver.restore(sess, tf.train.latest_checkpoint('./'))
    print sess.run(v1)
结果:

[[ 0.  0.]
 [ 0.  0.]]

[[ 1.  1.]
 [ 1.  1.]]

[[ 1.  1.]
 [ 1.  1.]]
我希望得到:

[[ 0.  0.]
 [ 0.  0.]]

[[ 1.  1.]
 [ 1.  1.]]

[[ 0.  0.]
 [ 0.  0.]]
我犯了什么错误


请帮助我理解。

您的代码中有两个主要问题:

  • v1=v1+1
    创建一个新的TensorFlow
    Tensor
    ,并将其绑定到Python变量
    v1
    ,但不会更改使用名称
    “v1”
    创建的TensorFlow
    变量中的值。因此,当您稍后调用
    sess.run(v1)
    时,您正在计算新的张量,该张量将向原始变量添加1,而不是从张量中读取值

    相反,要向变量中添加变量,应使用以下命令:

    increment_op = v1.assign_add(tf.ones([2, 2]))
    sess.run(increment_op)
    
  • 调用将重新创建原始图,并在创建过程中向图中添加新节点,包括新节点。当您还没有构建图形(或者没有可用的程序)时,它非常有用。因为您已经构建了图形,所以只需要使用
    saver.restore(sess,'model.ckpt')

  • 以下程序应产生您预期的行为:

    import tensorflow as tf
    
    v1 = tf.Variable(tf.zeros([2, 2], dtype=tf.float32, name='v1'))
    saver = tf.train.Saver()
    
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        print sess.run(v1)
        save_path = saver.save(sess, './model.ckpt')
        print "model saved in file:", save_path
    
        # Create an op to increment v1, run it, and print the result.   
        increment_op = v1.assign_add(tf.ones([2, 2]))
        sess.run(increment_op)
        print sess.run(v1)
    
        # Restore from the checkpoint saved above.
        saver.restore(sess, './model.ckpt')
        print sess.run(v1)
    
    这项研究可能会对此有所启发。我对您的文件进行了一两次修改:

    import tensorflow as tf
    
    v1 = tf.Variable(tf.zeros([2, 2], dtype=tf.float32, name='v1'))
    saver = tf.train.Saver()
    
    tf.add_to_collection('v1', v1)
    
    with tf.Session() as sess:
        sess.run(tf.initialize_all_variables())
        print sess.run(v1)
        save_path = saver.save(sess, 'model.ckpt')
        print "model saved in file:", save_path
        v1 = v1 + 1
        print sess.run(v1)
        saver = tf.train.import_meta_graph('model.ckpt.meta')
        saver.restore(sess, tf.train.latest_checkpoint('./'))
        print sess.run(v1)
    
    注意
    tf.add\u to\u collection
    调用。之后,我运行了以下命令:

    import tensorflow as tf
    
    sess = tf.Session()
    saver = tf.train.import_meta_graph('model.ckpt.meta')
    saver.restore(sess, tf.train.latest_checkpoint('./'))
    print sess.run(tf.get_collection('v1')[0])
    
    输出:

    [[ 0.  0.]
     [ 0.  0.]]
    

    看起来恢复内容实际上不会修改您当前的计算图表,您需要使用集合来获得所需的内容。

    虽然,选定的答案告诉我们应该做什么,但没有解释您获得意外答案的确切原因。我要为以后来这里的人解释

    在Tensorflow中,如果您已经有一个图形,并且在保存后再次导入相同的图形,则不会替换图形操作,而是Tensorflow旨在通过添加后缀(如_1、_2等)来创建新变量。例如,在您的情况下,在您这样做之前: saver=tf.train.import\u meta\u图('model.ckpt.meta') saver.restore(sess、tf.train.latest_checkpoint('./')) 您的图形有一个名为v1的变量。导入同一图形后,不会替换变量v1,而是将新变量v1_1添加到图形中。因此,图形的大小将增加一倍。由于加载图形时v1没有改变,所以仍然会得到v1的旧值(全部为1)

    如果要重置图形,必须使用tf.reset\u default\u graph()
    如中所述,再次导入图形之前。如果在此之后进行导入并打印v1,您将得到一个全部为0的v1。

    这非常有用