Python Tensorflow:保存和恢复变量问题
如何在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)
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
创建一个新的TensorFlowTensor
,并将其绑定到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。这非常有用