Создайте torch :: Tensor в C ++ для изменения формы

У меня есть тензорный массив, и я хочу изменить его форму. Я попытался использовать torch.view, но возникло исключение, что «shape [1] недопустим для ввода размера 10000». Кто-нибудь может дать мне советы по поводу информации об ошибке?

int shape[] = {1,1,100,100};
torch::Tensor img = torch::zeros((100,100),torch::KF32);
torch::Tensor tmg = img.view(*shape);

person helloswift123    schedule 01.04.2020    source источник


Ответы (1)


C++ не python, поэтому конструкции типа unpacking с * явно не будут работать. То же самое и для (, ), вы должны использовать объект, который может быть "автоматически преобразован" в IntArrayRef.

Основы создания объектов

ArrayRef - это класс шаблона, что означает, что он может содержать различные Типы C ++, а IntArrayRef - это псевдоним для ArrayRef<int>. Этот класс имеет несколько конструкторов (например, из стандартного массива в стиле C, std::vector, std::array или std::initializer_list).

И torch::zeros, и view метод torch::Tensor требует именно этого объекта .

Что вы можете сделать:

/* auto to feel more "Pythonic" */
auto img = torch::zeros({100, 100}, torch::kF32);
auto tmg = img.view({1, 1, 100, 100});

{1, 1, 100, 100} относится к типу std::initializer_list<int>, поэтому ArrayRef<int> (он же IntArrayRef) может быть построен из него (возможно, перемещен, поскольку этот объект является rvalue).

То же самое происходит с torch::zeros.

Более простой способ для этого случая

То, что у вас здесь, можно было бы сделать проще с помощью unsqueeze вот так:

auto img = torch::zeros({100, 100}, torch::kF32);
auto unsqueezed = img.unsqueeze(0).unsqueeze(0);

Где 0 в размерности.

О libtorch

В общем, прочтите справочник и проверьте типы хотя бы, если вы хотите работать с C ++. Я согласен, что с документами можно поработать, но если вы что-то знаете о C ++, это не должно быть слишком сложно следовать даже в исходный код, который иногда может понадобиться.

person Szymon Maszke    schedule 01.04.2020
comment
Большое спасибо за ваш ответ. Я новичок в Libtorch из python, и я нашел очень мало информации в документации (сравните с python)。 Я думаю, что вы правы, я должен сначала проверить типы и следовать исходному коду, когда у меня возникнет проблема. - person helloswift123; 02.04.2020