Создайте torch :: Tensor в C ++, чтобы изменить форму - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть тензорный массив, и я хочу изменить форму тензорного. Я попытался использовать 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);

1 Ответ

1 голос
/ 01 апреля 2020

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> ( aka IntArrayRef) может быть построен из него (вероятно, перемещен, поскольку этот объект является rvalue).

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

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

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

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

Где 0 в измерении.

О libtorch

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

...