6

我正在尝试从检查点文件加载先前训练的张量训练模型,现在这些检查点文件中有操作变量,因此要加载图形我必须首先从 **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 algo 。问题是当我使用默认会话调用 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 指向相同的内存地址。我必须缺少一些非常基本的东西。

我是 tensorflow 的新手,所以在这方面的任何帮助将不胜感激。谢谢

4

2 回答 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()然后使用相同的检查点名称(和返回的保护程序)恢复会话中的变量。当然,如果元图保存在每个检查点中,就可以做到这一点。

于 2017-04-23T08:44:13.317 回答
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())

我相信这应该有效。

于 2019-07-26T09:07:01.357 回答