3

这是非常基本的:我通常使用 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();

这目前工作正常,但N可能会变得非常大,我只是在寻找一种方法来直接torch::tensor使用以前使用的 C++设置我的基础数据array

4

1 回答 1

4

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

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

于 2020-07-29T13:36:52.333 回答