Как уложить несколько lstm в keras?
Я использую глубокую библиотеку keras и пытаюсь собрать несколько LSTM без везения.
Ниже мой код
model = Sequential()
model.add(LSTM(100,input_shape =(time_steps,vector_size)))
model.add(LSTM(100))
Вышеприведенный код возвращает ошибку в третьей строке Exception: Input 0 is incompatible with layer lstm_28: expected ndim=3, found ndim=2
Вход X является тензором формы (100, 250, 50). Я запускаю keras на бэкэнде endorflow
Ответы
Ответ 1
Вам необходимо добавить return_sequences=True
к первому слою, чтобы его выходной тензор имел ndim=3
(то есть размер пакета, временные шаги, скрытое состояние).
Пожалуйста, смотрите следующий пример:
# expected input data shape: (batch_size, timesteps, data_dim)
model = Sequential()
model.add(LSTM(32, return_sequences=True,
input_shape=(timesteps, data_dim))) # returns a sequence of vectors of dimension 32
model.add(LSTM(32, return_sequences=True)) # returns a sequence of vectors of dimension 32
model.add(LSTM(32)) # return a single vector of dimension 32
model.add(Dense(10, activation='softmax'))
От: https://keras.io/getting-started/sequential-model-guide/ (поиск по "сложенному lstm")
Ответ 2
Подробное объяснение @DanielAdiwardana ответа. Нам нужно добавить return_sequence = True для всех слоев LSTM, кроме последнего.
Установка этого флага в True позволяет Keras знать, что выходные данные LSTM должны содержать все исторические сгенерированные выходные данные вместе с метками времени (3D). Итак, следующий уровень LSTM может работать с данными дальше.
Если этот флаг имеет значение false, то LSTM возвращает только последний вывод (2D). Такой вывод недостаточно хорош для другого слоя LSTM.
# expected input data shape: (batch_size, timesteps, data_dim)
model = Sequential()
model.add(LSTM(32, return_sequences=True,
input_shape=(timesteps, data_dim))) # returns a sequence of vectors of dimension 32
model.add(LSTM(32, return_sequences=True)) # returns a sequence of vectors of dimension 32
model.add(LSTM(32)) # return a single vector of dimension 32
model.add(Dense(10, activation='softmax'))
На стороне NOTE :: last Dense слой добавлен, чтобы получить вывод в формате, необходимом пользователю. Здесь Dense (10) означает, что 10 различных выходных классов будут сгенерированы с помощью активации softmax.
Если вы используете LSTM для временных рядов, у вас должен быть Dense (1). Так что дается только один числовой вывод.