Объединение для 1D тензора

#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. Это неверно, посмотрите на форму результирующего тензора: он пустой. Дополнительное измерение должно быть добавлено первым , а не последним .