如何使用 C++ 数组填充 torch::tensor?

Dor*_*ian 3 c++ arrays eigen tensor libtorch

这是非常基本的:我通常使用 Eigen3 进行数学运算,但需要使用 libtorch 进行网络前向传递。现在我想用torch::tensor我的 Eigen3 (或纯 C++ )中的数据填充array,但没有for循环。我怎样才能做到这一点?

这是带有循环的解决方案:

Eigen::Matrix<double, N, 1> inputEigen;  // previously initialized

torch::Tensor inputTorch = torch::ones({1, N});  // my torch tensor for the forward pass
for (int i = 0; i < N; i++) {
  inputTorch[0][i] = inputEigen[i];  // batch size == 1
}

std::vector<torch::jit::IValue> inputs;
inputs.push_back(inputTorch);
at::Tensor output = net.forward(inputs).toTensor();
Run Code Online (Sandbox Code Playgroud)

目前效果很好,但N可能会变得非常大,我只是在寻找一种方法来直接torch::tensor使用以前使用过的 C++设置我的底层数据array

tri*_*ror 5

Libtorch 提供了该torch::from_blob函数(请参阅此线程),它要求提供指向void*某些数据的指针并IntArrayRef了解解释数据的维度。所以这会给出类似的东西:

Eigen::Matrix<double, N, 1> inputEigen; // previously initialized;
torch::Tensor inputElement = torch::from_blob(inputEigen.data(), {1,N}).clone();             // dims
Run Code Online (Sandbox Code Playgroud)

请注意clone您可能需要或可能不需要的调用,具体取决于您的用例:基本上from_blob不拥有底层数据的所有权,因此如果没有克隆,它将与您的特征矩阵共享(并可能被特征矩阵破坏)