如何将std :: vector <std :: vector <double >>转换为Torch :: Tensor?

问题描述

我有一个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没有所有权,因此在以下情况下其数据将被删除)向量被破坏了