#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, спасибо, что указали на это. Теперь это работает 🙂