我正在尝试从检查点文件加载以前训练过的受过训练的张量训练模型,现在这些检查点文件中有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指向相同的内存地址。我必须要有一些非常基本的东西。
我是张力流的新手,所以在这方面的任何帮助都会非常感激。感谢
答案 0 :(得分:0)
您导入的元图很可能是 /data/model_cache/model.ckpt-39.meta 与检查点{{1}不同的元图。正在使用。
通常的做法是tf.train.get_checkpoint_state(FLAGS.checkpoint_dir)
调用(或get_checkpoint_state()
)并在tf.train.latest_checkpoint(FLAGS.checkpoint_dir)
调用中使用它的输出,然后使用相同的检查点名称(并返回保护程序) )恢复会话中的变量。当然,如果在每个检查点中保存元图,则可以完成此操作。
答案 1 :(得分:0)
我认为您的问题是您混淆了“ Python名称” 和“ TensorFlow名称” 。例如,当您创建:W = tf.get_variable("weight", ...)
时,“ Python名称” 将是W
,而“ TensorFlow名称” 将是{{1 }}。
加载模型时,它不了解最新的python名称。因此它将永远不知道weight
到底是什么。
您首先应该找回要使用的张量和运算。您将它们列出为:
W
然后同时使用for tensor in tf.get_default_graph().get_operations():
print (tensor.name)
和get_operation_by_name(name)
将您的东西找回来。
例如,如果您想按我告诉您的方式获得体重,则应该这样做:
get_tensor_by_name(name)
我认为应该可以。