如何解决将 std::vector<std::tuple<>> 转换为 torch::Tensor 的最有效方法是什么?
我有一个元组向量,需要将其转换为 torch::Tensor
。
到目前为止,我想出的是香草方法,如下所示:
std::vector<torch::Tensor> anchors;
std::vector<std::tuple<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 }));
//...
我正在使用手电筒 1.7
。还有其他可能更有效的方法吗?
解决方法
我不知道有任何 libtorch 功能可以轻松做到这一点。我会建议使用 torch::from_blob
,希望数据能够连续存储,但我发现 this thread 另有说法。
所以如果可能,我的建议是将您的 tuple<float,float...>
替换为 std::array<float,4>
(内存布局是连续的),并执行类似的操作
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
会工作。
与往常一样,如果 clone
在您完成 anchors_raw
之前有超出范围的风险,则需要调用 anchors
。如果您确定 anchors_raw
的寿命比 anchors
长,您可以删除调用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。