Создайте torch :: Tensor из массива C / C ++ без использования from_blob ()

Использование внешнего интерфейса C ++ libtorch для Pytorch

Я хочу создать torch::Tensor из массива C ++ double[]. Исходя из устаревшего API C / C ++. Мне не удалось найти простую документацию по этому вопросу ни в документах, ни на форумах.

Что-то вроде:

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

Единственное, что я нашел, - это использовать torch::from_blob, но тогда мне пришлось бы clone() и использовать to(device), если бы я хотел использовать его с CUDA.

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

Есть ли более чистый способ сделать это?


person eusoubrasileiro    schedule 30.10.2019    source источник
comment
Можете ли вы использовать TensorOptions, чтобы настроить устройство на в то же время вы создаете свой тензор? Что-то вроде auto options = torch::TensorOptions().dtype(torch::kFloat64).device(torch::kCUDA, 1)   -  person JoshVarty    schedule 30.10.2019


Ответы (3)


Вы можете узнать больше о создании тензора здесь: https://pytorch.org/cppdocs/notes/tensor_creation.html

Я не знаю способа создать тензор из массива без использования from_blob, но вы можете использовать TensorOptions для управления различными вещами о тензоре, включая его устройство.

На основе вашего примера вы можете создать свой тензор на графическом процессоре следующим образом:

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);
person JoshVarty    schedule 30.10.2019
comment
нет, это не работает, все еще создается на ЦП, по-прежнему требуется to.device - person eusoubrasileiro; 24.01.2020
comment
Является ли? Как узнать, на CPU или на GPU? - person JacKeown; 07.02.2020
comment
Да, это работает! вы правы @JacKeown Меня смутила эта проблема здесь github.com/pytorch/ pytorch / issues / 12506 # issuecomment-429573396 - person eusoubrasileiro; 14.02.2020
comment
Похоже, у меня это больше не работает ... Я поднял вопрос по этому поводу: Discussion.pytorch.org/t/create-tensor-on-cuda-device-in-c/113232 - person JoshVarty; 28.02.2021

Обычно я использую:

torch::Tensor tharray = torch::tensor({1, 2, 3, 4, 5}, {torch::kFloat64});
person Sholto Armstrong    schedule 23.07.2020

У меня нет более чистого способа, но я бы дал вам другой способ сделать это.

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

person helloswift123    schedule 01.04.2020