问题描述
我有一个std::vector<std::vector<double>>
,我想在libtorch中将其转换为torch::Tensor
。但是,看来torch::tensor()
或torch::from_blob()
不能用于此目的!
我尝试使用c10::ArrayRef
,然后通过执行torch::Tensor
将其用于将数据转换为c10::ArrayRef<std::vector<std::vector<double>>> res(myvecs)
,但这似乎也没有用,因为我似乎找不到方法将其转换为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;
}
,
最简单的方法是使用简单的export interface Polygon {
id: string;
coordinate: Coordinate[];
item: Item;
}
export interface Something extends Polygon {
color: string;
}
而不是向量的向量。您将拥有连续的内存,而std::vector<double>
可以正常工作(如其他答案所述)。
如果这不可能/不方便,我建议采用以下解决方法。我假设您的向量是一个torch::from_blob
矩阵(即所有(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
没有所有权,因此在以下情况下其数据将被删除)向量被破坏了