无法使用ReadBinaryProto Tensorflow加载协议缓冲区

时间:2018-08-14 13:58:36

标签: c++ tensorflow protocol-buffers

我在加载从C ++中的tensorflow模型保存的协议缓冲区文件时遇到问题。我可以完全没有问题地在Python中加载和执行.pb文件,但是当尝试使用ReadBinaryProto函数在C ++中加载该文件时,出现错误:

String field'tensorflow.MetaGraphDef.MetaInfoDef.tensorflow_version' 
   contains invalid UTF-8 data when parsing a protocol buffer. Use the 'bytes' 
   type if you intend to send raw bytes.

   Non-OK-status: LoadModel(session_inception, pathToGraph ) status: Data loss: 
   Can't parse E:/Projects/SampleTensorflow/tmp/latestmodel.pb as binary proto

我正在使用 Tensorflow v1.10 ,下面发布了一个C ++代码示例,我尝试了许多其他方法来保存.pb文件,包括使用Frozen_graph方法和{{1 }}方法,似乎都无法解决问题。

tf.write_graph

谢谢您的帮助!

1 个答案:

答案 0 :(得分:2)

一个可能的错误是.pb文件包含一个GraphDef而不是一个MetaGraphDef

要阅读GraphDef,只需切换到

tensorflow::GraphDef graph_def;
status = ReadBinaryProto(tensorflow::Env::Default(), graph_fn, 
                        &graph_def);

protobuf格式确实只是一个容器,没有说明它包含的内容。在tensorflow中,这种格式通常用于包含图和元图,这可能会造成混淆。