我正在尝试使用基于API tf.estimator的Tensorflow(r1.4)构建CNN。这是一个罐头模型。我的想法是使用python中的估计器来训练和评估网络,并通过加载训练后生成的pb文件,在没有估计器的情况下使用C ++中的预测。
我的第一个问题是,有可能吗?
如果是,则训练部分工作,预测部分也可以工作(生成的pb文件没有估计器)但是当我从估算器加载pb文件时它不起作用。
我收到此错误:"Data loss: Can't parse saved_model.pb as binary proto"
我的pyhon代码导出我的模型:
feature_spec = {'input_image': parsing_ops.FixedLenFeature(dtype=dtypes.float32, shape=[1, 48 * 48])}
export_input_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec)
input_fn = tf.estimator.inputs.numpy_input_fn(self.eval_features,
self.eval_label,
shuffle=False,
num_epochs=1)
eval_result = self.model.evaluate(input_fn=input_fn, name='eval')
exporter = tf.estimator.FinalExporter('save_model', export_input_fn)
exporter.export(estimator=self.model, export_path=MODEL_DIR,
checkpoint_path=self.model.latest_checkpoint(),
eval_result=eval_result,
is_the_final_export=True)
它既不适用于tf.estimator.Estimator.export_savedmodel()
如果你们中的一个人知道有关罐装模型的估算师的明确教程以及如何将其导出,我很感兴趣
答案 0 :(得分:2)
请查看github上的this issue,看起来你有同样的问题。显然(至少在使用estimator.export_savedmodel
时),您应该使用LoadSavedModel而不是ReadBinaryProto加载图表,因为它不会保存为graphdef文件。
您会发现here有关如何使用它的更多说明:
const string export_dir = ...
SavedModelBundle bundle;
...
LoadSavedModel(session_options, run_options, export_dir, {kSavedModelTagTrain},
&bundle);
我似乎无法找到c ++的SavedModelBundle
文档以便以后使用它,但它可能接近the same class in Java,在这种情况下它基本上包含会话和您正在使用的图表。