如何使用C ++将输入提供给加载的Tensorflow模型

时间:2017-06-27 21:44:31

标签: tensorflow

我想创建和训练模型,导出它并在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);

1 个答案:

答案 0 :(得分:0)

您的模型签名表明它期望DT_STRING张量作为输入。使用tensorflow::Example时,这通常意味着需要将协议缓冲区序列化为张量,并将字符串作为其元素的类型。

要将tensorflow::Example对象转换为字符串,可以使用协议缓冲区方法,例如SerializeToString, SerializeAsString etc.

希望有所帮助。