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