многослойная сеть LSTM с сохранением состояния = True - PullRequest
0 голосов
/ 26 октября 2018

Мой вопрос: имеет ли смысл этот код?И если это имеет смысл, что должно быть целью?

model.add(LSTM(18, return_sequences=True,batch_input_shape=(batch_size,look_back,dim_x), stateful=True))
model.add(Dropout(0.3))
model.add(LSTM(50,return_sequences=False,stateful=False))
model.add(Dropout(0.3))
model.add(Dense(1, activation='linear'))

Потому что, если мой первый уровень LSTM возвращает мое состояние от одного пакета к другому, почему бы не сделать мой второй уровень LSTM одинаковым?

Мне трудно понять механику LSTM в Керасе, поэтому я очень благодарен за любую помощь:)

И если вы проголосуете за этот пост, вы можете сказать мне, почему вкоманды?спасибо.

1 Ответ

0 голосов
/ 27 октября 2018

Ваша программа представляет собой проблему регрессии, когда ваша модель состоит из 2 слоев lstm с 18 и 50 слоями каждый и, наконец, плотного слоя для отображения значения регрессии.

LSTM требует трехмерного ввода. Так как выход вашего первого слоя LSTM поступает на вход для второго слоя LSTM. Вход второго слоя LSTM также должен быть в 3D. поэтому мы устанавливаем последовательность повторного запуска как истинную в 1-м, поскольку она будет возвращать 3D-вывод, который затем можно будет использовать в качестве ввода для второго LSTM.

Ваше второе значение LSTM не возвращает последовательность, потому что после второго LSTM у вас есть плотный слой, который не нуждается в 3D-значении в качестве входных данных.

[обновление]

В кератах по умолчанию состояния LSTM сбрасываются после каждой партии обучающих данных, поэтому, если вы не хотите, чтобы состояния сбрасывались после каждой партии, вы можете установить состояние = True. Если LSTM установлен с сохранением состояния, конечное состояние пакета будет использоваться в качестве исходного состояния для следующего пакета. Позже вы можете сбросить состояния, позвонив reset_states()

...