如何将 std::vector<std::vector<double>> 转换为 torch::Tensor?
How is it possible to convert a std::vector<std::vector<double>> to a torch::Tensor?
我有一个 std::vector<std::vector<double>>
,我想在 libtorch 中将其转换为 torch::Tensor
。然而,torch::tensor()
或 torch::from_blob()
似乎不能用于此目的!
我尝试使用 c10::ArrayRef
,然后通过执行 c10::ArrayRef<std::vector<std::vector<double>>> res(myvecs)
将其用于将数据转换为 torch::Tensor
,但这似乎也没有用,因为我似乎找不到将其转换为 torch::Tensor
.
的方法
我应该如何在 libtorch 中进行这种转换?除了例如:
,我还有其他选择吗?
auto tensor = torch::zeros({ 46,85 });
for (size_t i = 0; i < 46; i++)
{
for (size_t j = 0; j < 85; j++)
{
tensor[i][j] = probs[i][j];
}
}
我没有使用过你提到的任何库,但如果我猜的话,这些库可能需要一个连续的数组,而不是散布在堆周围的小内存段。
因此将 std::vector<std::vector<double>>
转换为 std::vector<double>
并将 vec.data()
指针传递给 torch
std::vector<double> linearize(const std::vector<std::vector<double>>& vec_vec) {
std::vector<double> vec;
for (const auto& v : vec_vec) {
for (auto d : v) {
vec.push_back(d);
}
}
return vec;
}
最简单的方法是使用简单的 std::vector<double>
而不是向量的向量。您将拥有连续的内存,并且 torch::from_blob
可以工作(如其他答案中所述)。
如果不是 possible/convenient,我建议采用以下解决方法。我假设你的向量是一个 (n,m)
矩阵(即所有 n
向量具有相同的大小 m
):
int n = 5, m = 4;
// Just creating some dummy data for example
std::vector<std::vector<double>> vect(n, std::vector<double>(m, 0));
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
vect[i][j] = i+j;
// Copying into a tensor
auto options = torch::TensorOptions().dtype(at::kDouble);
auto tensor = torch::zeros({n,m}, options);
for (int i = 0; i < n; i++)
tensor.slice(0, i,i+1) = torch::from_blob(vect[i].data(), {m}, options);
编辑:您可能需要添加对 clone
的调用,以防您无法确保向量的寿命超过张量(因为 from_blob
不取得所有权,所以它的数据将是当矢量被破坏时被擦除)
我有一个 std::vector<std::vector<double>>
,我想在 libtorch 中将其转换为 torch::Tensor
。然而,torch::tensor()
或 torch::from_blob()
似乎不能用于此目的!
我尝试使用 c10::ArrayRef
,然后通过执行 c10::ArrayRef<std::vector<std::vector<double>>> res(myvecs)
将其用于将数据转换为 torch::Tensor
,但这似乎也没有用,因为我似乎找不到将其转换为 torch::Tensor
.
我应该如何在 libtorch 中进行这种转换?除了例如:
,我还有其他选择吗?auto tensor = torch::zeros({ 46,85 });
for (size_t i = 0; i < 46; i++)
{
for (size_t j = 0; j < 85; j++)
{
tensor[i][j] = probs[i][j];
}
}
我没有使用过你提到的任何库,但如果我猜的话,这些库可能需要一个连续的数组,而不是散布在堆周围的小内存段。
因此将 std::vector<std::vector<double>>
转换为 std::vector<double>
并将 vec.data()
指针传递给 torch
std::vector<double> linearize(const std::vector<std::vector<double>>& vec_vec) {
std::vector<double> vec;
for (const auto& v : vec_vec) {
for (auto d : v) {
vec.push_back(d);
}
}
return vec;
}
最简单的方法是使用简单的 std::vector<double>
而不是向量的向量。您将拥有连续的内存,并且 torch::from_blob
可以工作(如其他答案中所述)。
如果不是 possible/convenient,我建议采用以下解决方法。我假设你的向量是一个 (n,m)
矩阵(即所有 n
向量具有相同的大小 m
):
int n = 5, m = 4;
// Just creating some dummy data for example
std::vector<std::vector<double>> vect(n, std::vector<double>(m, 0));
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
vect[i][j] = i+j;
// Copying into a tensor
auto options = torch::TensorOptions().dtype(at::kDouble);
auto tensor = torch::zeros({n,m}, options);
for (int i = 0; i < n; i++)
tensor.slice(0, i,i+1) = torch::from_blob(vect[i].data(), {m}, options);
编辑:您可能需要添加对 clone
的调用,以防您无法确保向量的寿命超过张量(因为 from_blob
不取得所有权,所以它的数据将是当矢量被破坏时被擦除)