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

Rik*_*ika 7 c++ torch libtorch

我有一个std::vector<std::vector<double>>地方想将它转换成torch::Tensorlibtorch 。然而,torch::tensor()、 或torch::from_blob()、 似乎不能用于此目的!

我尝试使用c10::ArrayRef然后使用它来将数据转换为 by torch::Tensordo 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];
   }
}
Run Code Online (Sandbox Code Playgroud)

tri*_*ror 6

最简单的方法是使用一个简单的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);
Run Code Online (Sandbox Code Playgroud)

编辑:您可能需要添加一个调用,clone以防您无法确保向量的寿命比张量长(因为from_blob不取得所有权,因此当向量被销毁时,其数据将被删除)