Как объединить тензор формы (n, k) с тензорами формы (k) в libtorch?

#c #torch #libtorch

#c #факел #libtorch

Вопрос:

torch::stack принимает c10::TensorList и отлично работает, когда заданы тензоры одинаковой формы. Однако, когда вы пытаетесь отправить выходные данные ранее torch::stack отредактированного тензора, это приводит к сбою и нарушению доступа к памяти.

Чтобы быть более конкретным, давайте предположим, что у нас есть 3 тензора формы 4, например:

 torch::Tensor x1 = torch::randn({4});
torch::Tensor x2 = torch::randn({4});
torch::Tensor x3 = torch::randn({4});
torch::Tensor y = torch::randn({4});
  

Первый раунд сложения тривиален:

 torch::Tensor stacked_xs = torch::stack({x1,x2,x3});
  

Однако, пытаясь сделать :

 torch::Tensor stacked_result = torch::stack({y, stacked_xs});
  

произойдет сбой.
Я хочу получить такое же поведение, как в np.vstack в Python, где это разрешено и работает.
Как я должен это делать?

Комментарии:

1. Я не смог придумать лучшего названия! что могло бы быть лучшим названием? пожалуйста, предложите, чтобы было более понятно

Ответ №1:

Вы можете добавить измерение к y с torch::unsqueeze помощью. Затем конкатенация с помощью cat (не stack , сильно отличается от numpy, но результат будет таким, как вы просите) :

 torch::Tensor x1 = torch::randn({4});
torch::Tensor x2 = torch::randn({4});
torch::Tensor x3 = torch::randn({4});
torch::Tensor y = torch::randn({4});

torch::Tensor stacked_xs = torch::stack({x1,x2,x3});
torch::Tensor stacked_result = torch::cat({y.unsqueeze(0), stacked_xs});
  

Также возможно сгладить ваш первый стек, а затем изменить его форму в соответствии с вашими предпочтениями :

 torch::Tensor stacked_xs = torch::stack({x1,x2,x3});
torch::Tensor stacked_result = torch::cat({y, stacked_xs.view({-1}}).view({4,4});
  

Комментарии:

1. Большое спасибо. второй метод кажется мне более практичным . в любом случае, действительно ценю ваше время и любезный ответ

2. Ошибка проверки: решение view, похоже, не работает, поскольку это приводит к следующему исключению : stack expects each tensor to be equal size, but got [4] at entry 0 and [12] at entry 1

3. Да, небольшая ошибка, перепутал stack с cat, спасибо, что указали на это. Теперь это работает 🙂