使用SaveModelBuilder在Python中保存张量流模型并在C ++中加载

时间:2019-09-10 19:15:06

标签: c++ tensorflow restore

我想使用SaveModelBuilder API在python中保存模型,然后在C ++中加载它。

我能够成功实现tensorflow label_image示例,并使用c ++加载下载的模型。尽管当我尝试使用自己的自定义模型执行相同操作时,它不起作用。然后,我实现了Tom's solution来导出我的.pb文件。在这里,我尝试加载示例,如label_image所示,并尝试使用Meta Graph,但是它没有用。

我加载Graph Def的代码是

 tensorflow::GraphDef graph_def;
  Status load_graph_status =  ReadBinaryProto(tensorflow::Env::Default(), graph_file_name, &graph_def);
  session->reset(tensorflow::NewSession(tensorflow::SessionOptions()));
  Status session_create_status = (*session)->Create(graph_def);

并且要加载Meta Graph Def是

 tensorflow::MetaGraphDef graph_def;
  Status load_graph_status =  ReadBinaryProto(tensorflow::Env::Default(), graph_file_name, &graph_def);
  session->reset(tensorflow::NewSession(tensorflow::SessionOptions()));
  Status session_create_status = (*session)->Create(graph_def.graph_def());

我按照Tom's article在python中将模型保存为:

prediction_signature = ( tf.saved_model.signature_def_utils.build_signature_def(
            inputs = {"inputs": model_input}, outputs = {"outputs":model_output}, method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME))            
builder.add_meta_graph_and_variables(sess, [tf.saved_model.tag_constants.SERVING], signature_def_map= { tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY:prediction_signature },)
builder.save()

运行代码时。我只是收到错误

 Failed to load compute graph

当我将图形定义为普通图形时,尽管如果将其定义为MetaGraph,也会出现以下错误:

[libprotobuf ERROR external/protobuf_archive/src/google/protobuf/wire_format_lite.cc:611] String field 'tensorflow.NodeDef.op' contains invalid UTF-8 data when parsing a protocol buffer. Use the 'bytes' type if you intend to send raw bytes.

请注意,我能够运行label_image示例,因此不会出现其他问题,例如模型路径错误或常规语法问题。

我想帮助理解和使用:

SavedModelBundle bundle;
...
LoadSavedModel(session_options, run_options, export_dir, {kSavedModelTagTrain},
               &bundle);

根据tensorflow提供的Save & Restore文档中的说明。

总而言之,我想要一种使用SaveModelBuilder在python中保存tensorflow模型并在c ++中加载它的方法。

0 个答案:

没有答案