我已经在这方面工作了一段时间,似乎无法破解它。在其他问题中,我看到他们使用这些代码示例以使用元数据和检查点文件保存和恢复模型,但是当我做类似于此的事情时,它表示当我有savemodel时,w1
未定义将模型恢复为单独的python文件。当我只在保存部分结束时进行恢复时,它可以正常工作,但它无法在单独的文件中再次手动定义所有内容。我查看了检查点文件,它似乎很奇怪,它只有两行,它似乎没有引用任何变量或有任何值。它只有1kb。我试过投入' w1'相反,它是print函数中的一个字符串,它返回None而不是我要查找的值。这对其他人有用吗?如果是这样,你的检查点文件是什么样的?
#Saving
import tensorflow as tf
w1 = tf.Variable(tf.random_normal(shape=[2]), name='w1')
w2 = tf.Variable(tf.random_normal(shape=[5]), name='w2')
saver = tf.train.Saver([w1,w2])
sess = tf.Session()
sess.run(tf.global_variables_initializer())
saver.save(sess, 'my_test_model',global_step=1000)
#restoring
with tf.Session() as sess:
saver = tf.train.import_meta_graph('my_test_model-1000.meta',clear_devices=True)
saver.restore(sess,tf.train.latest_checkpoint('./'))
print sess.run(w1)
答案 0 :(得分:2)
您的图表已正确保存,但恢复它不会还原包含图表节点的变量。 w1是一个python变量,你从未在“恢复”部分代码中声明。要重新掌握你的重量,
您可以在TF图表中使用他们的名字:w1=get_variable(name='w1')
。问题是你必须密切注意你的名字范围,并确保你没有多个同名的变量(在这种情况下TF将'_1'加到他们的一个名字上,所以你可能会弄错了)。如果你这样做,张量板可以帮助你知道每个变量的确切名称。
您可以使用集合:保存集合中的有趣节点,并在恢复后从它们返回。在构建图表之前,在保存之前,请执行以下操作:tf.add_to_collection('weights', w1)
和tf.add_to_collection('weights', w2)
,以及恢复代码:[w1, w2] = tf.get_collection('weights1')
。然后你就可以正常使用w1和w2了。
我认为后者虽然更详细,但对于未来架构的变化可能会更好。我知道所有这些看起来都很冗长,但请记住,通常你不必回到所有变量上的句柄,但是很少有变量:输入,输出和训练步骤通常都足够了。