【问题标题】:TensorFlow: eval restored graphTensorFlow:评估恢复图
【发布时间】:2017-03-04 11:38:24
【问题描述】:

我正在尝试从检查点恢复图形。检查点由tf.Supervisor 创建。有meta 文件和检查点。

我试图实现的是从单独的应用程序加载此图以运行某些操作(即恢复现有模型)。

我按照以下方式执行此操作(如此处所述:https://www.tensorflow.org/api_docs/python/tf/train/import_meta_graph):

meta = 'path/to/file.meta'

my_graph = tf.Graph()
with my_graph.as_default():
        with tf.Session() as sess:
                saver = tf.train.import_meta_graph(meta)
                saver.restore(sess, tf.train.latest_checkpoint(os.path.dirname(meta)))
                op = my_graph.get_operation_by_name("op")
                print(sess.run(op))

我看到的是None。我期望看到的是一维张量。 我使用 get_collection 检查了my_graph 对象,发现op 运行所需的所有变量都使用从检查点恢复的值正确初始化。 我怎样才能弄清楚为什么操作没有被正确评估?我真的被困在这里了。

以下代码:

print(sess.run(my_graph.get_operation_by_name("Variable_2")))
print(sess.run(my_graph.get_tensor_by_name("Variable_2:0")))

打印

None
4818800

好像一个操作和对应的变量之间没有联系。

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    tf.Graph.get_operation_by_name() 方法总是返回一个tf.Operation 对象。当您将 tf.Operation 对象传递给 tf.Session.run() 时,TensorFlow 将执行该操作(以及它所依赖的所有内容)并丢弃其输出(如果有)。

    如果您对特定输出的值感兴趣,则必须告诉 TensorFlow 您对哪个输出(tf.Tensor)感兴趣。主要有两个选项:

    • 从图中获取tf.Operation,然后选择其中一个outputs:

      op = my_graph.get_operation_by_name("op")
      output = op.outputs[0]
      print(sess.run(output))
      
    • 通过调用tf.Graph.get_tensor_by_name()从图中获取tf.Tensor,并将":<output index>"附加到操作的名称:

      output = my_graph.get_tensor_by_name("op:0")
      print(sess.run(output))
      

    为什么 TensorFlow 会做出这种区分?一方面,一个操作可以有多个输出,因此有时需要具体说明要获取的输出。另一方面,操作可能会产生副作用并产生较大的输出(例如,请参阅tf.assign()),并且将tf.Operation 传递给sess.run() 通常更有效,这样该值就不会被复制回Python 程序。

    【讨论】:

      猜你喜欢
      • 2018-05-16
      • 2016-10-05
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      • 2017-06-16
      • 2019-07-29
      • 2018-06-27
      • 2017-03-04
      相关资源
      最近更新 更多