在C ++中使用Tensor浮点值

时间:2018-03-10 21:01:34

标签: c++ tensorflow

我在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找到了一些听起来不错的功能,但我不明白如何使用它。

有没有人对如何处理这种情况有一些代码片段?

1 个答案:

答案 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的更多信息。

希望这可以提供帮助。