TensorFlow:eval恢复图

时间:2017-03-04 11:38:25

标签: tensorflow

我正在尝试从检查点恢复图形。检查点由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。我期待看到的是1-D Tensor。 我使用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

好像操作和相应的变量之间没有连接。

1 个答案:

答案 0 :(得分:4)

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程序。