我想创建和训练模型,导出它并在C ++中运行推理。
我按照此处列出的教程进行操作:https://www.tensorflow.org/tutorials/wide_and_deep
我也尝试使用此处所述的 SavedModel 方法,因为这是导出TensorFlow图表进行服务的规范方法: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/README.md
最后,我按如下方式导出已保存的模型:
feature_spec = tf.contrib.layers.create_feature_spec_for_parsing(feature_columns)
serving_input_fn = input_fn_utils.build_parsing_serving_input_fn(feature_spec)
output = model.export_savedmodel(model_dir, serving_input_fn, as_text=True)
print('Model saved to {}'.format(output))
我看到saved_model.pbtxt具有以下签名定义。
signature_def {
key: "serving_default"
value {
inputs {
key: "inputs"
value {
name: "input_example_tensor:0"
dtype: DT_STRING
tensor_shape {
dim {
size: -1
}
}
}
}
outputs {
...
我可以在C ++端加载保存的模型
SavedModelBundle bundle;
const std::string graph_path = "models/1498572863";
const std::unordered_set<std::string> tags = {"serve"};
Status status = LoadSavedModel(session_options,
run_options, graph_path,
tags, &bundle);
我被困在最后一部分,我需要将输入提供给这个模型。
Run函数要求输入参数的格式为:std::vector<std::pair<string, Tensor>>
。
我原本以为这是一个对向量,其中键是python代码中使用的特征名称,Tensor是该特征的多个值。
然而,似乎期望字符串是&#34; input_example_tensor&#34;。 我不确定我现在应该如何使用单个Tensor为不同的功能提供模型。
std::vector<string> output_tensor_names = {
"binary_logistic_head/_classification_output_alternatives/classes_tensor"};
// How do I create input_tensor?
status = bundle.session->Run({{"input_example_tensor", input_tensor}}
output_tensor_names, {}, &outputs);
解决方案
我做了类似的事
tensorflow::Example example;
auto& tf_feature_map = *(example.mutable_features()->mutable_feature());
tf_feature_map["name"].mutable_int64_list()->add_value(15);
const std::string& serialized = example.SerializeAsString();
tensorflow::Input input({serialized});
status = bundle.session->Run({{"input_example_tensor", input.tensor()}}
output_tensor_names, {}, &outputs);
答案 0 :(得分:0)
您的模型签名表明它期望DT_STRING
张量作为输入。使用tensorflow::Example
时,这通常意味着需要将协议缓冲区序列化为张量,并将字符串作为其元素的类型。
要将tensorflow::Example
对象转换为字符串,可以使用协议缓冲区方法,例如SerializeToString
, SerializeAsString
etc.
希望有所帮助。