#python #pytorch #max-pooling
Вопрос:
Я ищу способ уменьшить длину 1D-тензора, применив операцию объединения. Как я могу это сделать? Если я подам MaxPool1d
заявку , я получу ошибку max_pool1d() input tensor must have 2 or 3 dimensions but got 1
.
Вот мой код:
import numpy as np
import torch
A = np.random.rand(768)
m = nn.MaxPool1d(4,4)
A_tensor = torch.from_numpy(A)
output = m(A_tensor)
Ответ №1:
Ваша инициализация в порядке, вы определили первые два параметра nn.MaxPool1d
: kernel_size
и stride
. Для одномерного максимального объединения оба должны быть целыми числами, а не кортежем s.
Проблема в том, что ваш ввод должен быть двумерным (ось пакета отсутствует).:
>>> m = nn.MaxPool1d(4, 4)
>>> A_tensor = torch.rand(1, 768)
Тогда вывод приведет к:
>>> output = m(A_tensor)
>>> output.shape
torch.Size([1, 192])
Ответ №2:
Я думаю, что вместо этого вы имели в виду следующее:
m = nn.MaxPool1d((4,), 4)
Как упоминалось в документах, аргументы таковы:
torch.nn.MaxPool1d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
Как вы можете видеть, это одно kernel_size
, это не что-то похожее kernel_size1
kernel_size2
. Вместо этого это просто только kernel_size
Комментарии:
1. Я не уверен, что понимаю вас. Я поставил два числа, чтобы указать как размер ядра, так и шаг.
2. Я все равно получу ту же ошибку, если добавлю новый набор скобок, который вы предложили.
3. @albus_c Отредактировал мой ответ
4. Я все еще получаю ту же ошибку. Я понимаю, что мне следует преобразовать массив numpy в 2D-тензор, у которого одно измерение равно единице.
5. @albus_c Да,
MaxPool1d
для этого требуется 2 или 3 измеренияkernel_size
Ответ №3:
Для потомков: решение состоит в том, чтобы изменить тензор с помощью A_tensor.reshape(768,1)
.
Комментарии:
1. Это неверно, посмотрите на форму результирующего тензора: он пустой. Дополнительное измерение должно быть добавлено первым , а не последним .