Индексы вне диапазона для MaxUnpool2d - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь понять unpooling в Pytorch, потому что я хочу построить сверточный авто-кодировщик.

У меня есть следующий код

from torch.autograd import Variable

data = Variable(torch.rand(1, 73, 480))
pool_t = nn.MaxPool2d(2, 2, return_indices=True)
unpool_t = nn.MaxUnpool2d(2, 2)
out, indices1 = pool_t(data)
out = unpool_t(out, indices1)

Но я постоянно получаю эту ошибку в последней строке (отмена).

IndexError: tuple index out of range

Хотя в этом примере моделируются данные, входные данные должны иметь такую ​​форму из-за предварительной обработки, которая должна быть выполнена.

Я довольно новичок в сверточных сетях, но я даже пытался использовать ReLU и сверточный 2D-слой перед пулированием, однако индексы всегда кажутся неправильными при разгрузке для этой фигуры.

1 Ответ

1 голос
/ 16 октября 2019

Ваши данные являются одномерными, и вы используете двумерные операции объединения и удаления из пулов.

PyTorch интерпретирует первые два измерения тензоров как "измерение пакета" и "пространство канала" / "пространство объектов". Остальные измерения обрабатываются как пространственные измерения.
Итак, в вашем примере data является трехмерным тензором размера (1, 73, 480) и интерпретируется Pytorch как одна партия («размер партии» = 1) с 73каналов на выборку и 480 выборок.
По какой-то причине MaxPool2d работает для вас и рассматривает измерение канала как пространственное измерение, а также сэмплирует его - я не уверен, что это ошибка или особенность.

Если вы хотите произвести выборку по второму измерению, вы можете добавить дополнительное измерение, сделав data тензор 4D:

out, indices1 = pool_t(data[None,...])
In [11]: out = unpool_t(out, indices1, data[None,...].size())
...