Основы LSTM
Примечание: Нижеследующее объяснение для pytorch, когда batch_first=True
Давайте начнем с того, как выглядит развернутый LSTM
Выше приведен пакетный однонаправленный LSTM.
- LSTM с накоплением имеет несколько ячеек LSTM, расположенных друг над другом. Количество уложенных LSTM определяется количеством слоев (
no:of_layers
). - Ячейка LSTM разворачивается во времени на входе. Количество развертываний определяется длиной входной последовательности (
seq_len
) - Каждый вход в развернутый LSTM представляет собой вектор определенного размера (как определено
input_size
) - Выход развернутого LSTM представляет собой вектор определенного размера (как определено
hidden_size
). Это рассчитывается с использованием серьезной операции на входе, последнего скрытого состояния и текущего состояния ячейки. - Обычно обучение происходит на пакете данных (прямая и обратная поддержка), а не для одной входной выборки за раз.
Определение
Так что использовать\ определить LSTM, нам нужно определить ниже информацию
- Вход: размер
batch_size x seq_len x input_size
- Выход: размер
batch_size x seq_len x hidden_size
LSTM естьопределяется размером вектора, заданного для развернутой ячейки LSTM, а размер выходного вектора, возвращаемого из развернутой ячейки LSTM
lstm = nn.LSTM(2, 5, batch_first=True)
, определяет LSTM, который принимает вектор или размер 2 (за развертывание) и возвращаетвектор размера 5 (за развертывание)
Развертывание
Мы вычисляем выходной сигнал LSTM, подавая ему пакет данных и давая необязательное начальное скрытое состояние и состояние ячейки.
Начальное скрытое состояние: в двунаправленном LSTM одна роль LSTM слева направо, а другая справа налево. Таким образом, исходное скрытое состояние имеет размер no:of_layers X no:of_directions X hidden_size
. Это то же самое и для состояния ячейки.
Теперь давайте создадим данные для batch_size=32
, который имеет последовательность 10 и вектор 2 на вход.
X = torch.randn(32,10,2)
Оптиналскрытое состояние и состояние ячейки
h = torch.randn(1*1, 32, 5)
c = torch.randn(1*1, 32, 5)
Наконец, давайте развернем и вычислим вывод
out, hidden = lstm(X, (h,c))
Ваша проблема
В вашем случае у вас есть список тензоров, каждый тензор которого соответствуетк особенностям образца. Нам нужно преобразовать его в тензор формы batch_size x seq_len x input_size
, где batch_size
- это число тензоров seq_len=2
и input_size=1
Рабочий код
class CustomModel(nn.Module):
def __init__(self):
super(CustomModel, self).__init__()
input_size = 1
hidden_size = 6
target_size = 2
self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)
self.linear = nn.Linear(hidden_size, target_size)
def forward(self, X):
out, hidden = self.lstm(X)
y_hat = self.linear(hidden[0][0])
y_hat = F.log_softmax(y_hat, dim=1)
return y_hat
data = [torch.randn(2) for i in range(100)]
X = torch.stack(data)
X = X.unsqueeze(-1)
model = CustomModel()
for epoch in range(1):
tag_scores = model(X)
print (tag_scores)