我正在尝试从检查点恢复图形。检查点由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))
Run Code Online (Sandbox Code Playgroud)
我看到的是None
. 我希望看到的是一维张量。我my_graph
使用 get_collection检查了对象,发现我的所有变量都需要op
使用从检查点恢复的值正确初始化。我怎样才能弄清楚为什么没有正确评估操作?我真的被困在这里了。
以下代码:
print(sess.run(my_graph.get_operation_by_name("Variable_2")))
print(sess.run(my_graph.get_tensor_by_name("Variable_2:0")))
Run Code Online (Sandbox Code Playgroud)
印刷
None
4818800
Run Code Online (Sandbox Code Playgroud)
就好像一个操作和相应的变量之间没有联系。
该tf.Graph.get_operation_by_name()
方法总是返回一个tf.Operation
对象。当您将tf.Operation
对象传递给 时tf.Session.run()
,TensorFlow 将执行该操作(以及它所依赖的一切)并丢弃其输出(如果有)。
如果您对特定输出的值感兴趣,则必须告诉 TensorFlow 您对哪个输出 (a tf.Tensor
) 感兴趣。有两个主要选项:
tf.Operation
从图中获取 a ,然后选择其中之一outputs
:
op = my_graph.get_operation_by_name("op")
output = op.outputs[0]
print(sess.run(output))
Run Code Online (Sandbox Code Playgroud)tf.Tensor
通过调用从图中获取 a tf.Graph.get_tensor_by_name()
,并附":<output index>"
加到操作的名称:
output = my_graph.get_tensor_by_name("op:0")
print(sess.run(output))
Run Code Online (Sandbox Code Playgroud)为什么 TensorFlow 会做出这种区分?一方面,一个操作可以有多个输出,因此有时需要具体说明您想要获取哪个输出。另一方面,操作可能会产生副作用并产生大量输出(参见tf.assign()
示例),并且通常将 传递tf.Operation
给更有效,sess.run()
这样该值就不会被复制回 Python 程序。
归档时间: |
|
查看次数: |
1448 次 |
最近记录: |