从批次中提取矩阵,表示为张量 我在C++中使用Tensorflow。我使用经过训练的模型从输入图像中提取面片

从批次中提取矩阵,表示为张量 我在C++中使用Tensorflow。我使用经过训练的模型从输入图像中提取面片,c++,tensorflow,eigen,C++,Tensorflow,Eigen,我的输出张量(会话运行后)是outputs,在outputs[0]中有一批N个补丁,mxd auto patches = outputs[0].tensor<float, 4>(); 那么,我如何从一个本征::张量(或tf::张量)中得到一个矩阵,我可以将其用于cv::本征2CV?环顾四周,考虑到张量流张量始终是行主张量,您应该能够执行以下操作: const auto patch_side = 256; int batch_id = 0; for (auto i = 0; i &l

我的输出张量(会话运行后)是
outputs
,在
outputs[0]
中有一批N个补丁,mxd

auto patches = outputs[0].tensor<float, 4>();
那么,我如何从一个本征::张量(或tf::张量)中得到一个矩阵,我可以将其用于
cv::本征2CV

环顾四周,考虑到张量流张量始终是行主张量,您应该能够执行以下操作:

const auto patch_side = 256;
int batch_id = 0;
for (auto i = 0; i < grid_shape.second; ++i) {
    for (auto j = 0; j < grid_shape.first; ++j) {
        auto size = patch_side * patch_side * depth;
        cv::Mat p(patch_side, patch_side, CV_32FC(depth), patches.data() + batch_id * size);
        cv::imshow("p", p);
        cv::waitKey();
        /*
        ml(cv::Rect(i * patch_side, j * patch_side, patch_side,
                    patch_side)) =
            cv::Mat(cv::Size(patch_side, patch_side), CV_32F, patches.slice
                    patches.data() + (i + j) * patch_side * patch_side);
                    */

        std::cout << "i,j" << i << "," << j << "\n";
        batch_id++;
    }
}
const auto patch_side=256;
int batch_id=0;
用于(自动i=0;istd::cout“一批N个补丁,MxMxD”->您的意思是“NxMxD”,还是每个补丁都是MxM,深度为D,输出张量为“nxmxmxmxd”?您还可以指出哪一行给您带来了编译错误吗?设置
自动补丁=输出[0].flat();
并运行上面的代码,返回错误(您尝试调用矩阵上的向量方法)位于
Eigen::Map(patches.data()+batch\u id*size,size)
行。一批N个面片:形状为(N,M,M,D)的张量啊,是的,似乎您没有为
映射提供正确的参数,您已经指出了数据源,但是您需要提供行数和列数(请参阅您链接的帖子)但是,我认为这只会为每个补丁提供第一个通道-我不确定是否有任何方法可以一次性从
Eigen::Matrix
创建多通道
cv::Mat
es…感谢您关于行/列参数的建议。它解决了我在这种特殊情况下的问题,因为D=1。但是,我让这个问题在这里被打开,因为一个更通用的解决方案可以处理D>1将是非常棒的。这是一个比在我的例子中使用Eigen::Map更好的解决方案,因为我需要速度和低内存使用率,所以使用指针而不复制值对我来说是完美的。谢谢
const auto patch_side = 256;
int batch_id = 0;
for (auto i = 0; i < grid_shape.second; ++i) {
    for (auto j = 0; j < grid_shape.first; ++j) {
        auto size = patch_side * patch_side * depth;
        cv::Mat p(patch_side, patch_side, CV_32FC(depth), patches.data() + batch_id * size);
        cv::imshow("p", p);
        cv::waitKey();
        /*
        ml(cv::Rect(i * patch_side, j * patch_side, patch_side,
                    patch_side)) =
            cv::Mat(cv::Size(patch_side, patch_side), CV_32F, patches.slice
                    patches.data() + (i + j) * patch_side * patch_side);
                    */

        std::cout << "i,j" << i << "," << j << "\n";
        batch_id++;
    }
}