将 std::vector<std::tuple<>> 转换为 torch::Tensor 的最有效方法是什么?

What is the most efficient way of converting a std::vector<std::tuple<>> to a torch::Tensor?

我有一个元组向量,我需要将其转换为 torch::Tensor。到目前为止,我想出的是香草方法,如下所示:

std::vector<torch::Tensor> anchors;
std::vector<std::tuple<float, float, float, float>> anchors_raw;

//...
for (auto& rows: anchors_raw)
    {
        auto& [cx, cy, s_kx, s_ky] = rows;
        anchors.emplace_back(std::move(torch::stack({ std::move(torch::tensor(cx)),
                                                     std::move(torch::tensor(cy)),
                                                     std::move(torch::tensor(s_kx)),
                                                     std::move(torch::tensor(s_ky))
                                                    }, 0)));
    }
    outo output = std::move(torch::stack(std::move(anchor)).view({ -1,4 }));
    //...

我使用的是 Torch 1.7。还有其他可能更有效的方法吗?

我不知道有任何 libtorch 功能可以轻松做到这一点。我建议使用 torch::from_blob,希望数据连续存储,但我发现 this thread 另有说明。

所以如果可能,我的建议是用std::array<float, 4>替换你的tuple<float, float...>(内存布局是连续的),然后做类似的事情

std::vector<std::array<float,4>> anchors_raw;
// ...
auto options = torch::TensorOptions().dtype(at::kFloat);
auto anchors = torch::from_blob(&anchors_raw[0][0], {anchors_raw.size(), 4}, options).clone()

我目前无法尝试,所以我希望它可以编译并且 运行 没问题,但我相信它应该可以工作,所有浮点值都应该连续存储在向量和数组中,所以 from_blob会工作。

与往常一样,如果 anchors_raw 在您完成 anchors 之前有超出范围的风险,则需要调用 clone。如果您确定 anchors_raw 会比 anchors 活得更久,您可以取消通话。