我在C ++中使用TensorFlow,使用自定义训练模型进行预测。我可以加载这个模型,对单个图像进行预测,返回这个张量类型:
Tensor<type: float shape: [1,22] values: [0.00760295521 9.67324567e-08 4.19238063e-07]...>
我可以通过使用另一个TensorFlow会话从此表中创建最大值indice来提取预测类,就像在this tutorial中一样。
现在,我尝试批量处理图像,总是做预测,一切都很好,但我有这个输出Tensor:
Tensor<type: float shape: [2,22] values: [0.00760294124 9.6732272e-08 4.19237637e-07]...>
事实上,现在的形状是[2,22]因为我有2个图像和22个类。现在,我会知道如何在经典C ++代码中从这个张量中提取两个22元素浮点向量,而不使用Tensorflow。我在API doc找到了一些听起来不错的功能,但我不明白如何使用它。
有没有人对如何处理这种情况有一些代码片段?
答案 0 :(得分:0)
我已经能够这样做了:
std::vector<Tensor> outputs;
Status run_status = session->Run(feed_dict, {"fc2/Softmax"}, {}, &outputs);
if (!run_status.ok()) {
cout << "Running model failed: " << run_status;
return -1;
}
for (auto &t : outputs) // access by reference to avoid copying
{
cout << t.DebugString() + "\n";
tensorflow::TTypes<float, 2>::Tensor scores = t.flat_inner_dims<float>();
auto dims = scores.dimensions();
int imgCount = dims[0];
int classesCount = dims[1];
for(int i = 0; i<imgCount; i++) {
float maxVal = scores(i,0);
int maxIndex = 0;
for(int j = 1; j<classesCount; j++) {
float val = scores(i,j);
if(val > maxVal) {
maxVal = val;
maxIndex = j;
}
}
cout << "Img" + to_string(i) + " prediction: " + to_string(maxIndex) + ", score: " + to_string(maxVal) + "\n";
}
}
函数flat_inner_dims()
允许检索Eigen :: Tensor,其中给定的形状<float, 2>
表示浮动的2D数组。然后,我跑过这个阵列。
您可以找到有关如何使用Eigen :: Tensor here的更多信息。
希望这可以提供帮助。