如何用 C++ 数组填充 torch::tensor?
How to populate torch::tensor with c++ array?
这是非常基础的:我通常使用 Eigen3 进行数学运算,但需要使用 libtorch 进行网络前向传递。现在我想用我的 Eigen3(或纯 C++ array
)中的数据填充 torch::tensor
,但没有 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
可能会变得非常大,我只是在寻找一种方法来直接使用以前使用的 C++ [=] 设置我的 torch::tensor
的基础数据13=]
Libtorch 提供了 torch::from_blob
函数(参见 this thread),它需要一个指向某些数据的 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
不会取得基础数据的所有权,因此如果没有克隆,它将保留与您的特征矩阵共享(并可能被其破坏)
这是非常基础的:我通常使用 Eigen3 进行数学运算,但需要使用 libtorch 进行网络前向传递。现在我想用我的 Eigen3(或纯 C++ array
)中的数据填充 torch::tensor
,但没有 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
可能会变得非常大,我只是在寻找一种方法来直接使用以前使用的 C++ [=] 设置我的 torch::tensor
的基础数据13=]
Libtorch 提供了 torch::from_blob
函数(参见 this thread),它需要一个指向某些数据的 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
不会取得基础数据的所有权,因此如果没有克隆,它将保留与您的特征矩阵共享(并可能被其破坏)