错误:张量的图与会话的图不同

问题描述 投票:0回答:2

我正在尝试从检查点文件加载之前训练过的张量训练模型,现在这些检查点文件中包含 op 变量,因此要加载图表,我必须首先从 **ckpt.meta 文件加载 graph_def :

graph = tf.Graph()
sess = tf.InteractiveSession(graph=graph)
saver = tf.train.import_meta_graph('/data/model_cache/model.ckpt-39.meta')
    ckpt = tf.train.get_checkpoint_state(FLAGS.checkpoint_dir)
    if ckpt and ckpt.model_checkpoint_path:
       if os.path.isabs(ckpt.model_checkpoint_path):
          saver.restore(sess, ckpt.model_checkpoint_path)

加载模型后,我有一个方法,使用该模型进行推理来实现deep-dream。问题是当我使用默认会话调用 eval 时,出现以下错误:

File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 555, in eval
return _eval_using_default_session(self, feed_dict, self.graph, session)File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework   /ops.py", line 3495, in _eval_using_default_session
raise ValueError("Cannot use the given session to evaluate tensor: "
ValueError: Cannot use the given session to evaluate tensor: the tensor's graph is different from the session's graph.

我已经确认

tf.get_default_graph()
sess.graph
指向同一个内存地址。我一定缺少一些非常基本的东西。

python tensorflow machine-learning conv-neural-network deep-dream
2个回答
0
投票

您正在导入的元图(即 /data/model_cache/model.ckpt-39.meta)很可能与检查点

tf.train.get_checkpoint_state(FLAGS.checkpoint_dir)
使用的元图不同。

通常的做法是进行

get_checkpoint_state()
调用(或
tf.train.latest_checkpoint(FLAGS.checkpoint_dir)
)并在
import_meta_graph()
调用中使用它的输出,然后使用相同的检查点名称(和返回的保护程序)恢复会话中的变量。当然,如果元图保存在每个检查点中,就可以做到这一点。


0
投票

我认为你的问题是你混淆了“Python-name”“TensorFlow-name”。例如,当您创建:

W = tf.get_variable("weight", ...)
时,“Python-name”将是
W
,而“TensorFlow-name”将是
weight
。 加载模型时,它不知道最新的 python 名称。所以它永远不会知道
W
实际上是什么。

您应该首先取回您想要使用的张量和操作。您将它们列出来:

for tensor in tf.get_default_graph().get_operations():
    print (tensor.name)

然后使用

get_operation_by_name(name)
get_tensor_by_name(name)
取回你的东西。

例如,如果您想像我之前告诉您的那样获得权重,您应该这样做:

W = graph.get_tensor_by_name("weights:0")
print(W.eval())

我相信这应该有效。

© www.soinside.com 2019 - 2024. All rights reserved.