Добавление полностью подключенного слоя после слоя lstm в keras

#python #keras #lstm

#python #keras #lstm

Вопрос:

Я пытаюсь построить модель, используя LSTM using keras . Структура модели, которую я хочу построить, описана на рисунке. Первый слой - это слой LSTM

Я знаю, что в keras для создания такого типа слоя LSTM мне нужен следующий код.

 model = Sequential()
model.add(LSTM(4, input_shape=(3,1), return_sequences=True))
  

4 — это выходной размер каждой ячейки LSTM. return_sequence настройте many to many структуру. Но я не знаю, как мне следует добавить плотный слой, чтобы получать всю информацию из ячеек LSTM и выводить несколько нейронов. Я даже не знаю, возможно ли это или нет. Я был бы признателен за любую помощь.

Ответ №1:

Этот ответ основан на ответе SimonC. Вы можете добавить слой выравнивания. В зависимости от вашей цели, у этого могут быть разные способы

 def model():
    model = Sequential()
    model.add(Dense(128, input_shape = (LSTM_WINDOW_SIZE,1)))
    model.add(LSTM(units=5,
                   return_sequences=True))

    model.add(Dense(1, activation = 'linear'))
    model.add(Flatten())

    model.add(Dense(1))
    return model
LSTM_WINDOW_SIZE = 5
model3 = model()
model3.summary()
  

или (переместить Flatten слой перед Dense слоем)

 def model():
    model = Sequential()
    model.add(Dense(128, input_shape = (LSTM_WINDOW_SIZE,1)))
    model.add(LSTM(units=5,
                   return_sequences=True))
    model.add(Flatten())

    model.add(Dense(1, activation = 'linear'))

    model.add(Dense(1)) # redundant for this model, just for illustration
    return model
LSTM_WINDOW_SIZE = 5
model3 = model()
model3.summary()
  

Комментарии:

1. Добавление слоя flatten решило мою проблему. Слой Flatten полностью подключен к следующему плотному слою. Спасибо за вашу помощь!

Ответ №2:

Если вы также хотите получить результат «много ко многим», вы могли бы использовать плотные слои с распределением во времени. Если можно просто посмотреть на последний вывод (с последнего временного шага), вы можете удалить return_sequences = True и просто подключить плотный слой (хотя это было бы больше, чем много к одному)

Комментарии:

1. Спасибо, это альтернативная модель, которую я пробую. Но я хочу создать этот. Выходные данные поступают из каждой ячейки LSTM, а затем из полностью подключенного слоя, который получает всю информацию.

Ответ №3:

Вы можете просто добавить плотный слой после вашего слоя LSTM, не устанавливая для ‘return_sequences’ значение False (это необходимо только в том случае, если у вас есть второй слой LSTM после другого слоя LSTM). Недавно я создал модель LSTM, чтобы предсказать некоторые будущие значения, в зависимости от истории этой переменной. У меня это отлично сработало:

 def model():
    model = Sequential()
    model.add(Dense(128, input_shape = (LSTM_WINDOW_SIZE,1)))
    model.add(LSTM(units=5,
                   return_sequences=False)
    model.add(Dense(1))
    model.add(Activation('linear'))

return model
  

Вы можете удалить первый плотный слой, если хотите.

Комментарии:

1. Меня интересует модель, описанная на рисунке, если это возможно.

2. Я не могу дать вам полное задание, поскольку оно было сделано для университетских целей. Могу ли я помочь вам, ответив на дополнительные вопросы?

3. Мой главный вопрос заключается в том, как добавить полностью подключенный слой после слоя lstm, как на картинке, которую я описал. Я даже не уверен, возможно ли это построить. Но задача состоит в том, чтобы найти его.

4. model = Sequential() model.add(LSTM(4, input_shape=(3,1), return_sequences=True)) model.add(Dense(1))

5. здесь последний плотный слой выдает по одному выводу из каждой ячейки LSTM, но не по одному выводу из всех ячеек LSTM