如何将Python TensorFlow Session Run调用转为C++ API实现
如何用TensorFlow C++ API实现等价于Python的Session.run调用?
首先,先明确你Python代码的核心逻辑:给image_tensor喂入image_np_expanded数据,然后获取detection_boxes、detection_scores、detection_classes、num_detections这四个张量的计算结果。接下来我们对应C++ API的Session::Run方法,一步步实现等价逻辑。
先拆解C++ Session::Run的参数含义
你提到的C++方法签名:
virtual Status Run(const std::vector<std::pair<std::string, tensorflow::Tensor>>& inputs, const std::vector<std::string>& output_tensor_names, const std::vector<std::string>& target_node_names, std::vector<tensorflow::Tensor>* outputs) = 0;
每个参数对应Python代码的逻辑:
- inputs:对应Python里的
feed_dict,是一组「张量名称-Tensor对象」的键值对,用来给图中的输入张量喂数据 - output_tensor_names:对应Python里你要获取的张量列表,传入这些张量的名称字符串即可
- target_node_names:如果你不需要额外执行某些操作节点(比如训练op),这里传空向量就行
- outputs:用来接收计算结果的Tensor数组,顺序和
output_tensor_names完全对应
具体实现代码示例
下面是完整的等价实现步骤:
准备输入Tensor
首先把你的图像数据(对应Python里的image_np_expanded)转换成TensorFlow C++的Tensor对象,要注意形状和类型和Python里的image_tensor匹配(从你的输出看是uint8类型,形状(?, ?, ?, 3),实际喂入的应该是(1, height, width, 3)的批量数据):// 假设你已经有了图像数据,比如存放在uint8类型的数组里,height/width是图像尺寸 tensorflow::Tensor input_tensor(tensorflow::DT_UINT8, tensorflow::TensorShape({1, height, width, 3})); // 把图像数据拷贝到tensor的内存中 auto input_tensor_mapped = input_tensor.tensor<uint8, 4>(); // 这里根据你的图像数据格式完成拷贝,比如: for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { input_tensor_mapped(0, y, x, 0) = image_data[y*width*3 + x*3]; // R通道 input_tensor_mapped(0, y, x, 1) = image_data[y*width*3 + x*3 + 1]; // G通道 input_tensor_mapped(0, y, x, 2) = image_data[y*width*3 + x*3 + 2]; // B通道 } }构造Run方法的参数
// 输入:对应Python的feed_dict={image_tensor: image_np_expanded} std::vector<std::pair<std::string, tensorflow::Tensor>> inputs = { {"image_tensor:0", input_tensor} }; // 输出张量名称:对应Python里要获取的四个张量 std::vector<std::string> output_names = { "detection_boxes:0", "detection_scores:0", "detection_classes:0", "num_detections:0" }; // 接收结果的容器 std::vector<tensorflow::Tensor> outputs;调用Session::Run并检查状态
tensorflow::Status status = session->Run(inputs, output_names, {}, &outputs); if (!status.ok()) { std::cerr << "Run failed: " << status.ToString() << std::endl; return; // 处理错误 }获取结果
现在outputs里的元素顺序和output_names对应:// outputs[0] 对应 detection_boxes tensorflow::Tensor& boxes = outputs[0]; // outputs[1] 对应 detection_scores tensorflow::Tensor& scores = outputs[1]; // outputs[2] 对应 detection_classes tensorflow::Tensor& classes = outputs[2]; // outputs[3] 对应 num_detections tensorflow::Tensor& num = outputs[3]; // 可以进一步取出张量里的数据,比如打印num_detections的值: std::cout << "num_detections: " << num.scalar<float>() << std::endl;
注意事项
- 张量名称要和Python里输出的完全一致(比如
"image_tensor:0",末尾的:0是张量的输出索引,不能省略) - 输入Tensor的形状、数据类型必须和图中定义的
image_tensor完全匹配,否则会报错 - 记得在使用Session前要先加载模型(比如用
ReadBinaryProto读取pb模型文件,然后创建Session)
内容的提问来源于stack exchange,提问作者codepro
相关产品推荐
相关产品推荐

