【问题标题】:Create a torch::Tensor from C/C++ array without using "from_blob(...)..."在不使用“from_blob(...)...”的情况下从 C/C++ 数组创建一个 torch::Tensor
【发布时间】:2022-01-28 07:36:36
【问题描述】:

Pytorch 使用 C++ libtorch 前端

我想从 C++ double[] 数组创建一个 torch::Tensor。来自旧版 C/C++ API。 我在docs 和论坛中都找不到有关该主题的简单文档。

类似:

double array[5] = {1, 2, 3, 4, 5};   // or double *array;
auto tharray = torch::Tensor(array, 5, torch::Device(torch::kCUDA));

我发现的唯一方法是使用torch::from_blob,但如果我想将它与CUDA 一起使用,我将不得不使用clone() 并使用to(device)

double array[] = { 1, 2, 3, 4, 5};. // or double *array;
auto options = torch::TensorOptions().dtype(torch::kFloat64);
torch::Tensor tharray = torch::from_blob(array, {5}, options);

有没有更清洁的方法?

【问题讨论】:

  • 您可以在创建张量的同时使用TensorOptions 设置设备吗?类似auto options = torch::TensorOptions().dtype(torch::kFloat64).device(torch::kCUDA, 1)

标签: c++ pytorch libtorch


【解决方案1】:

您可以在此处阅读有关张量创建的更多信息:https://pytorch.org/cppdocs/notes/tensor_creation.html

我不知道有什么方法可以在不使用 from_blob 的情况下从数组创建张量,但您可以使用 TensorOptions 来控制有关张量的各种事情,包括其设备。

根据您的示例,您可以按如下方式在 GPU 上创建张量:

double array[] = { 1, 2, 3, 4, 5};
auto options = torch::TensorOptions().dtype(torch::kFloat64).device(torch::kCUDA, 1);
torch::Tensor tharray = torch::from_blob(array, {5}, options);

【讨论】:

【解决方案2】:

我通常使用:

torch::Tensor tharray = torch::tensor({1, 2, 3, 4, 5}, {torch::kFloat64});

【讨论】:

  • 很好,人们对您的回答很满意,但问题是关于旧版 C/C++ 数组指针。
【解决方案3】:

我没有更清洁的方法,但我会给你另一种方法。

double array[5] = {1, 2, 3, 4, 5};
auto tharray = torch::zeros(5,torch::kFloat64) //or use kF64
std::memcpy(tharray.data_ptr(),array,sizeof(double)*tharray.numel())

希望对您有所帮助。

KF64 更正为kFloat64,因为KF64 在torch 中不存在

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    相关资源
    最近更新 更多