c++ - 转换 std::vector 的最有效方法是什么> 到火炬::张量?
问题描述
我有一个元组向量,需要将其转换为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 }));
//...
我正在使用火炬 1.7。还有其他可能更有效的方法吗?
解决方案
我不知道有任何 libtorch 功能可以轻松做到这一点。我会建议使用torch::from_blob
,希望数据连续存储,但我发现这个线程另有说明。
所以如果可能的话,我的建议是替换你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
推荐阅读
- django - 分页器功能在 django 中不起作用?
- python - python请求无法在下一次请求时设置cookie
- javascript - SyntaxError:异步函数中出现意外的保留字“等待”
- angular - 在 Angular 9 中,有没有办法将“策略”注入到路由组件中?
- ffmpeg - 将 RTSP 流添加到 Ant 媒体服务器时出错
- controls - 有人可以解释这个偏航角计算方程吗?
- android - Android Studio Arctic Fox (2020.3.1) RC 1 Mac (Apple Silicon) 预览版在 MacBook Pro 上首次启动时崩溃
- python - 如何从张量返回最大值及其邻居
- c# - UWP - How to read in a text file?
- android - 即使使用正确的注释,Firestore 数据也不会显示在 RecyclerView 中