Подтвердить что ты не робот

Как уложить несколько 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

4b9b3361

Ответ 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). Так что дается только один числовой вывод.