LSTM сделаны из нейронов, которые генерируют внутреннее состояние на основе обратной связи l oop из предыдущих обучающих данных. Каждый нейрон имеет четыре внутренних элемента, которые принимают несколько входов и генерируют несколько выходов. Это один из более сложных нейронов для работы и понимания, и я не достаточно опытен, чтобы дать исчерпывающий ответ.
То, что я вижу в вашем примере кода, - это отсутствие понимания того, как они работать, и кажется, что вы предполагаете, что они работают как линейный слой. Я говорю это, потому что ваш метод forward не обрабатывает внутреннее состояние 1006 * и вы не изменяете выходные данные.
Вы определяете LSTM следующим образом:
self.lstm = nn.LSTM(input_size=input_size, hidden_size=input_size, num_layers=2)
hidden_size
относится к тому, как память и функции работают с воротами.
Документация PyTorch гласит следующее:
hidden_size - Количество функций в скрытом состоянии h
Это относится к размеру скрытого состояния, используемого для обучения внутренних ворот для долговременной и кратковременной памяти. Ворота являются функцией скрытых функций, которые хранят предыдущих выходов гейта. Каждый раз, когда нейрон обучается, скрытое состояние обновляется и снова используется для следующих обучающих данных.
Так почему это так важно?
Вы выбрасываете данные о скрытом состоянии во время тренировки, и я не знаю, что произойдет, если вы не определите скрытое состояние. Я предполагаю, что LSTM работает так, как будто истории никогда не существует.
Функция пересылки должна выглядеть примерно так:
def forward(self, x, hidden):
lstm_output, hidden = self.lstm(x, hidden)
return lstm_output, hidden
Во время обучения вы должны самостоятельно отслеживать скрытое состояние.
for i in range(epochs):
hidden = (torch.zeros(num_layers, batch_size, num_hidden),
torch.zeros(num_layers, batch_size, num_hidden))
for x, y in generate_batches(...):
# missing code....
lstm_output, hidden = model.forward(x, hidden)
Обратите внимание на форму для скрытого состояния. Это отличается от того, что вы обычно делаете с линейными слоями.
Существует несколько шагов, пропущенных выше, которые относятся к сбросу скрытого состояния, но я не могу вспомнить, как эта часть работает.
LSTM сами по себе описывают только функции во многом как слои свертки Маловероятно, что вы будете использовать выходные данные LSTM.
Большинство моделей, использующих LSTM или свертки, будут иметь нижнюю часть полностью подключенных слоев (например: nn.Linear()
). Эти слои будут обучаться на функциях , чтобы предсказать интересующие вас результаты.
Проблема здесь в том, что выходы от LSTM имеют неправильную форму, и вы должны изменить форму тензоры, чтобы их можно было использовать в линейном слое.
Вот пример функции пересылки LSTM, которую я использовал:
def forward(self, x, hidden):
lstm_output, hidden = self.lstm(x, hidden)
drop_output = self.dropout(lstm_output)
drop_output = drop_output.contiguous().view(-1, self.num_hidden)
final_out = self.fc_linear(drop_output)
return final_out, hidden
LSTM, безусловно, являются продвинутой версией c в машинном обучении, и PyTorch - не простая библиотека для изучения с самого начала. Я бы порекомендовал прочитать LSTM с использованием документации TensorFlow и онлайн-блогов, чтобы лучше понять, как они работают.