我想使用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 ++中加载它的方法。