Python TensorFlow freeze_graph.py:名称';保存/常量:0';指不存在的张量

Python TensorFlow freeze_graph.py:名称';保存/常量:0';指不存在的张量,python,tensorflow,protocol-buffers,Python,Tensorflow,Protocol Buffers,我目前正试图导出一个经过训练的TysFooFrm模型作为一个原始BUBF文件,并将其与Android上的TysFooS+C++ API一起使用。因此,我正在使用脚本 我使用tf.train.write\u graph导出了我的模型: tf.train.write_graph(graph_def,FLAGS.save_path,out_name,as_text=True) 我正在使用一个用tf.train.Saver保存的检查点 我调用脚本顶部描述的freeze\u graph.py。编译后,我

我目前正试图导出一个经过训练的TysFooFrm模型作为一个原始BUBF文件,并将其与Android上的TysFooS+C++ API一起使用。因此,我正在使用脚本

我使用
tf.train.write\u graph
导出了我的模型:

tf.train.write_graph(graph_def,FLAGS.save_path,out_name,as_text=True)

我正在使用一个用
tf.train.Saver
保存的检查点

我调用脚本顶部描述的
freeze\u graph.py
。编译后,我运行

bazel-bin/tensorflow/python/tools/freeze_graph \
--input_graph=<path_to_protobuf_file> \
--input_checkpoint=<model_name>.ckpt-10000 \
--output_graph=<output_protobuf_file_path> \
--output_node_names=dropout/mul_1
正如错误所述,我在导出的模型中没有张量
save/Const:0
。但是,
freeze\u graph.py
的代码表示,可以通过标志
filename\u tensor\u name
指定此张量名称。不幸的是,我找不到关于这个张量应该是什么以及如何为我的模型正确设置它的任何信息

有人能告诉我如何在导出的ProtoBuf模型中生成一个
save/Const:0
张量,或者如何正确设置标志
filename\u tensor\u name
-filename\u tensor\u name
标志用于指定为模型构造一个表达式时创建的占位符张量的名称*

在原始程序中,您可以打印出
saver.saver\u def.filename\u tensor\u name
的值,以获取应传递给此标志的值。您可能还需要打印
saver.saver\u def.restore\u op\u name
的值,以获取
--restore\u op\u name
标志的值(因为我怀疑默认值对您的图形不正确)

或者,包含重建这些标志的相关信息所需的所有信息。如果愿意,可以将
saver.saver\u def
写入文件,并将该文件的名称作为
--input\u saver
标志传递到
freeze\u graph.py



*
tf.train.Saver
的默认名称范围是
“save/”
,占位符是其名称默认为
“Const:0”
,这解释了为什么标志默认为
“save/Const:0”

我注意到,当我将代码按如下方式排列时,发生了一个错误:

sess = tf.Session()
tf.train.write_graph(sess.graph_def, '', '/tmp/train.pbtxt')
init = tf.initialize_all_variables()
saver = tf.train.Saver()
sess.run(init)
# Add ops to save and restore all the variables.
saver = tf.train.Saver()    
init = tf.initialize_all_variables()
sess = tf.Session()
tf.train.write_graph(sess.graph_def, '', '/tmp/train.pbtxt')
sess.run(init)
在我更改代码布局后,它工作如下:

sess = tf.Session()
tf.train.write_graph(sess.graph_def, '', '/tmp/train.pbtxt')
init = tf.initialize_all_variables()
saver = tf.train.Saver()
sess.run(init)
# Add ops to save and restore all the variables.
saver = tf.train.Saver()    
init = tf.initialize_all_variables()
sess = tf.Session()
tf.train.write_graph(sess.graph_def, '', '/tmp/train.pbtxt')
sess.run(init)

我不太清楚这是为什么@mrry您能再解释一下吗?

在最新的freeze\u graph.py中应该没有问题,因为我可以看到这些被删除了:

del restore\u op\u name、filename\u tensor\u name#未被更新的加载代码使用。

在早期版本中,它使用restore_op来恢复模型

sess.run([restore\u op\u name],{filename\u tensor\u name:input\u checkpoint})

因此,对于以前的版本,如果您在实例化saver op之前在.pb文件中编写图形,则会出现问题。例如:

tf.train.write_graph(sess.graph_def, "./logs", "test2.pb", False)
saver = tf.train.Saver()
saver.save(sess, "./logs/hello_ck.ckpt", meta_graph_suffix='meta', write_meta_graph=True)
这是因为图形不会有任何用于恢复模型的保存/恢复操作。要解决此问题,请在保存.ckpt文件后编写图形

saver = tf.train.Saver()
saver.save(sess, "./logs/hello_ck.ckpt", meta_graph_suffix='meta', write_meta_graph=True)
tf.train.write_graph(sess.graph_def, "./logs", "test2.pb", False)

@李先生,如果我解释错了,请引导。我最近才开始研究tensorflow代码。

对@Drag0的答案以及新代码布局修复错误的原因进行了一些后续研究

调用
saver=tf.train.saver()
时,将与
tf.train.saver()
相关的不同变量添加到默认图形中,例如
'save/Const:0'


在第一个代码排列中,图形在此之前保存,没有
tf.train.Saver()
变量。在第二个代码排列中,它是在之后保存的,因此操作
save/Const
将存在于图形中。

+1有相同的问题,以与您编写的完全相同的方式更改了行顺序,也为我解决了问题。也希望得到一些澄清:)似乎
保存程序
需要在
sess
之外,以便在不同的会话中重复使用。