tensorflow 错误:Tensor图形与会话图形不同

yyyllmsg  于 2023-02-19  发布在  其他
关注(0)|答案(2)|浏览(170)

我尝试从检查点文件加载之前训练的Tensor训练模型,现在这些检查点文件中有操作变量,因此要加载图形,我必须首先从**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指向相同的内存地址。一定有一些非常基本的东西我错过了。

xkftehaa

xkftehaa1#

您导入的元图(即 /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()调用中使用它的输出,然后用相同的检查点名称(和返回的saver)恢复会话中的变量。当然,如果每个检查点都保存了 meta图,就可以做到这一点。

4zcjmb1e

4zcjmb1e2#

我认为您的问题是混淆了**“Python名称”“TensorFlow名称”。例如,当您创建:W = tf.get_variable("weight", ...)“Python名称”将为W,而“TensorFlow名称”**将为weight。加载模型时,它不知道最新的Python名称。因此,它永远不会知道W实际上是什么。
首先,你应该取回你想要使用的Tensor和运算,你可以用以下方式列出它们:

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())

我相信这应该行得通。

相关问题