我正在尝试从检查点恢复图形。检查点由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
好像操作和相应的变量之间没有连接。
答案 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程序。