Pytorch - неверные размеры при использовании сети LSTM - PullRequest
0 голосов
/ 28 мая 2018

Я начал работать с pytorch и использовал несколько преобразований для построения следующей модели, используя в качестве справки одно из руководств:

model = torch.nn.Sequential( 
     torch.nn.Linear(D_in, H),
     torch.nn.ReLU(),
     torch.nn.Linear(H, D_out),
)

Я хочу использовать сеть LSTM, поэтому я попыталсявыполните следующее:

model = torch.nn.Sequential(
      torch.nn.LSTM(D_in, H),
      torch.nn.Linear(H, D_out) 
)

, что дает мне эту ошибку:

RuntimeError: вход должен иметь 3 измерения, получил 2

Почему явидя эту ошибку?Я предполагаю, что в моем понимании того, как преобразования (сети?) Могут быть связаны цепью в pytorch ...

РЕДАКТИРОВАТЬ

После следования предложению @ esBee яобнаружил, что следующий работает правильно.Это связано с тем, что LSTM ожидает, что вход имеет следующий размер:

вход формы (seq_len, batch, input_size): тензор, содержащий функции входной последовательности.Входными данными также может быть упакованная последовательность переменной длины

local_x = local_x.unsqueeze(0)
y_pred, (hn, cn) = layerA(local_x)
y_pred = y_pred.squeeze(0)
y_pred = layerB(y_pred)

Однако тот факт, что мой исходный набор данных обучения / тестирования имеет только длину последовательности 1, заставляет меня чувствовать, что я что-то делаю неправильно.Какова цель этого параметра в контексте нейронных сетей?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Здесь следует обратить внимание на то, что в отличие от линейных слоев, таких как torch.nn.Linear, для повторяющихся слоев имеется более 1 выхода, например torch.nn.LSTM.

Хотя torch.nn.Linear возвращает просто y в y = Ax + b, torch.nn.LSTM s return output, (h_n, c_n) (более подробно объяснено в документации ), чтобы вы могли выбрать, какой вывод вы хотите обработать.Итак, что происходит в вашем примере, вы вводите все эти несколько типов выходных данных в слой после слоя LSTM (что приводит к появившейся ошибке).Вместо этого вам следует выбрать конкретную часть вывода вашего LSTM и передать только ее на следующий слой.

К сожалению, я не знаю, как выбрать вывод LSTM в Sequential (предложения приветствуются), но вы можете переписать

model = torch.nn.Sequential(
    torch.nn.LSTM(D_in, H),
    torch.nn.Linear(H, D_out) 
)

model(x)

как

layerA = torch.nn.LSTM(D_in, H)
layerB = torch.nn.Linear(H, D_out)

x = layerA(x)
x = layerB(x)

и затем исправить его, выбрав выходные свойства (h_n) последнего слоя вашего LSTM, написав

layerA = torch.nn.LSTM(D_in, H)
layerB = torch.nn.Linear(H, D_out)

x = layerA(x)[0]
x = layerB(x)
0 голосов
/ 28 мая 2018

В сообщении об ошибке указывается, что для ввода требуется три измерения.

Глядя на документацию для pytorch , они приводят следующий пример:

lstm = nn.LSTM(3, 3)  # Input dim is 3, output dim is 3

Либо D_in, либо H не имеет трех измерений.

...