Каков вклад каждого слоя LSTM в сложенную сеть LSTM? - PullRequest
0 голосов
/ 27 марта 2019

У меня возникли трудности с пониманием потока ввода-вывода слоев в стековых сетях LSTM. Допустим, я создал сложенную сеть LSTM, как показано ниже:

# parameters
time_steps = 10
features = 2
input_shape = [time_steps, features]
batch_size = 32

# model
model = Sequential()
model.add(LSTM(64, input_shape=input_shape,  return_sequences=True))
model.add(LSTM(32,input_shape=input_shape))

, где наша сеть с накоплением LSTM состоит из 2 уровней LSTM с 64 и 32 скрытыми модулями соответственно. В этом сценарии мы ожидаем, что на каждом временном шаге 1-й уровень LSTM -LSTM (64) - будет передаваться в качестве входных данных на 2-й уровень LSTM -LSTM (32) - вектор размером [batch_size, time-step, hidden_unit_length], который будет представлять скрытый состояние 1-го уровня LSTM на текущем временном шаге. Что смущает меня:

  1. Получает ли 2-й слой LSTM -LSTM (32) - X(t) (в качестве входа) скрытое состояние 1-го слоя -LSTM (64) - имеет размер [batch_size, time-step, hidden_unit_length] и пропускает его через свой скрытый сеть - в данном случае состоящая из 32 узлов -?
  2. Если первое верно, почему input_shape 1-го LSTM (64) - и 2-го LSTM (32) - одинаково, когда 2-й обрабатывает только скрытое состояние 1-го уровня? Разве в нашем случае input_shape не должно быть [32, 10, 64]?

Мне показалось, что приведенная ниже визуализация LSTM очень полезна (найдено здесь ), но она не распространяется на сети Stacked-lstm: LSTM workings

Любая помощь будет принята с благодарностью. Спасибо!

1 Ответ

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

input_shape требуется только для первого слоя.Последующие слои принимают выходные данные предыдущего слоя в качестве входных данных (так что их значение аргумента input_shape игнорируется)

Модель ниже

model = Sequential()
model.add(LSTM(64, return_sequences=True, input_shape=(5, 2)))
model.add(LSTM(32))

представляет нижеприведенную архитектуру

enter image description here

Который вы можете проверить это по model.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_26 (LSTM)               (None, 5, 64)             17152     
_________________________________________________________________
lstm_27 (LSTM)               (None, 32)                12416     
=================================================================

Замена строки

model.add(LSTM(32))

на

model.add(LSTM(32, input_shape=(1000000, 200000)))

все равно предоставит вам ту же архитектуру (проверьте, используя model.summary()), потому что input_shape игнорируется, поскольку он принимает в качестве входных данных тензорный выход предыдущего слоя.

И если вам нужна последовательность для последовательности архитектуры, как показано ниже

enter image description here

, вы должны использовать код:

model = Sequential()
model.add(LSTM(64, return_sequences=True, input_shape=(5, 2)))
model.add(LSTM(32, return_sequences=True))

который должен вернуть модель

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_32 (LSTM)               (None, 5, 64)             17152     
_________________________________________________________________
lstm_33 (LSTM)               (None, 5, 32)             12416     
=================================================================
...