mac*_*ion 14 python protocol-buffers tensorflow
我目前正在尝试将训练有素的TensorFlow模型导出为ProtoBuf文件,以便在Android上使用TensorFlow C++ API.因此,我正在使用该freeze_graph.py脚本.
我使用tf.train.write_graph以下方式导出模型:
tf.train.write_graph(graph_def, FLAGS.save_path, out_name, as_text=True)
我正在使用保存的检查点tf.train.Saver.
我freeze_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
Run Code Online (Sandbox Code Playgroud)
这给我以下错误信息:
TypeError: Cannot interpret feed_dict key as Tensor: The name 'save/Const:0' refers to a Tensor which does not exist. The operation, 'save/Const', does not exist in the graph.
Run Code Online (Sandbox Code Playgroud)
由于错误状态我save/Const:0在导出的模型中没有张量.但是,代码freeze_graph.py表示可以通过标志指定此张量名称filename_tensor_name.不幸的是,我找不到任何关于这个张量应该是什么的信息以及如何为我的模型正确设置它.
有人可以告诉我如何save/Const:0在我导出的ProtoBuf模型中产生张量或如何filename_tensor_name正确设置标志?
该--filename_tensor_name标志用于指定在tf.train.Saver为模型构建模型时创建的占位符张量的名称.*
在原始程序中,您可以打印出值saver.saver_def.filename_tensor_name以获取您应该为此标志传递的值.您可能还希望打印值saver.saver_def.restore_op_name以获取--restore_op_name标志的值(因为我怀疑图表的默认值不正确).
或者,tf.train.SaverDef协议缓冲区包含重建这些标志的相关信息所需的所有信息.如果您愿意,可以写入saver.saver_def文件,并将该文件的名称作为--input_saver标志传递给freeze_graph.py.
*为默认名称的范围tf.train.Saver是"save/"和占位符是实际上是一个tf.constant()名字默认为"Const:0",这解释了为什么标志默认为"save/Const:0".