【问题标题】:Loading metagraph and checkpoints in tensorflow在张量流中加载元图和检查点
【发布时间】:2017-05-11 02:43:47
【问题描述】:

我已经为此工作了一段时间,但似乎无法破解它。在其他问题中,我看到他们使用这些代码示例来使用元图和检查点文件保存和恢复模型,但是当我做类似的事情时,它说 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)

【问题讨论】:

标签: python tensorflow


【解决方案1】:

您的图表已正确保存,但恢复它不会恢复包含图表节点的变量。 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了。

我认为后者虽然更冗长,但对于您的架构的未来变化可能更好。我知道所有这些看起来都非常冗长,但请记住,通常您不必获取所有变量的句柄,但只需获取其中少数变量的句柄:输入、输出和训练步骤通常就足够了。

【讨论】:

  • 谢谢。我现在就试试这个。您是否偶然知道为什么这段代码 sn-p 会被普遍共享?如果它只在同一个文件中工作,它似乎并不是特别有用。
  • 让它工作。只需对您的代码稍作更正。它是tf.get_collection 而不是tf.get_from_collection。感谢您的帮助。我不知道为什么它对其他人有用,但对我无效。
  • 我认为旧的做事方式是重新创建图,然后加载检查点,而不使用元图。在这种情况下,您可以直接使用 w1(因为它是在您构建图形时定义的)。我们实际上仍然可以这样做,我忘了在我的回答中提到它。但是,当您加载它时,您仍然需要访问图形构建功能,并且您需要与保存的图形完全相同,因此它再次不如当前方法健壮:如果您在代码中更改 1 个节点名称例如,您将无法加载旧的 ckpt...
  • 某处我遇到了同样的问题,你可以在这里看到解决方案,lifesaver.codes/answer/…
猜你喜欢
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 2021-10-22
  • 2020-02-22
相关资源
最近更新 更多