Пытаясь понять реализацию Pytorch LSTM - PullRequest
0 голосов
/ 29 марта 2019

У меня есть набор данных, содержащий 1000 примеров, где каждый пример имеет 5 признаков (a, b, c, d, e). Я хочу передать 7 примеров в LSTM, чтобы он предсказывал особенность (а) восьмого дня.

Чтение документации Pytorchs для nn.LSTM () Я придумал следующее:

input_size = 5
hidden_size = 10
num_layers = 1
output_size = 1

lstm = nn.LSTM(input_size, hidden_size, num_layers)
fc = nn.Linear(hidden_size, output_size)

out, hidden = lstm(X)  # Where X's shape is ([7,1,5])
output = fc(out[-1])

output  # output's shape is ([7,1])

Согласно документам:

Вход nn.LSTM - это " вход формы ( seq_len, batch, input_size )" с " input_size - количество ожидаемых объектов на входе х",

И вывод: «вывод формы ( seq_len, batch, num_directions * hidden_size ): тензор, содержащий выходные объекты (h_t) из последнего слоя LSTM, для каждого t."

В этом случае я думал, что seq_len будет последовательностью из 7 примеров, batch - это 1, а input_size - это 5. Таким образом, lstm будет использовать каждый пример, содержащий 5 объектов, ссылающихся на скрытый слой на каждой итерации.

Чего мне не хватает?

1 Ответ

1 голос
/ 29 марта 2019

Когда я расширяю ваш код до полного примера - я также добавил несколько комментариев, которые могут помочь - я получаю следующее:

import torch
import torch.nn as nn

input_size = 5
hidden_size = 10
num_layers = 1
output_size = 1

lstm = nn.LSTM(input_size, hidden_size, num_layers)
fc = nn.Linear(hidden_size, output_size)

X = [
    [[1,2,3,4,5]],
    [[1,2,3,4,5]],
    [[1,2,3,4,5]],
    [[1,2,3,4,5]],
    [[1,2,3,4,5]],
    [[1,2,3,4,5]],
    [[1,2,3,4,5]],
]

X = torch.tensor(X, dtype=torch.float32)

print(X.shape)         # (seq_len, batch_size, input_size) = (7, 1, 5)
out, hidden = lstm(X)  # Where X's shape is ([7,1,5])
print(out.shape)       # (seq_len, batch_size, hidden_size) = (7, 1, 10)
out = out[-1]          # Get output of last step
print(out.shape)       # (batch, hidden_size) = (1, 10)
out = fc(out)          # Push through linear layer
print(out.shape)       # (batch_size, output_size) = (1, 1)

Это имеет смысл для меня, учитывая ваши batch_size = 1 иoutput_size = 1 (я полагаю, вы делаете регресс).Я не знаю, откуда ваш output.shape = (7, 1).

Вы уверены, что ваш X имеет правильные размеры?Вы создали nn.LSTM возможно с batch_first=True?Есть много мелочей, которые могут проникнуть внутрь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...