LSTM с сохранением состояния и слоем встраивания (формы не совпадают)

Я пытаюсь создать LSTM с отслеживанием состояния с помощью Keras, и я не понимаю, как добавить слой встраивания перед запуском LSTM. Проблема, похоже, связана с флагом stateful. Если моя сеть не отслеживает состояние, добавление слоя внедрения довольно просто и работает.

Рабочий LSTM с сохранением состояния без встраиваемого слоя выглядит на данный момент так:

model = Sequential()
model.add(LSTM(EMBEDDING_DIM,
               batch_input_shape=(batchSize, longest_sequence, 1),
               return_sequences=True,
               stateful=True))
model.add(TimeDistributed(Dense(maximal_value)))
model.add(Activation('softmax'))
model.compile(...)

При добавлении слоя встраивания я перемещаю параметр batch_input_shape в слой встраивания, т.е. только первый слой должен знать форму? Нравится:

model = Sequential()
model.add(Embedding(vocabSize+1, EMBEDDING_DIM,batch_input_shape=(batchSize, longest_sequence, 1),))
model.add(LSTM(EMBEDDING_DIM,
               return_sequences=True,
               stateful=True))
model.add(TimeDistributed(Dense(maximal_value)))
model.add(Activation('softmax'))
model.compile(...)

Известное мне исключение Exception: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=4

Так что я застрял здесь в данный момент. Каков трюк, чтобы объединить вложения слов в LSTM с отслеживанием состояния?


person toobee    schedule 19.11.2016    source источник


Ответы (1)


Параметр batch_input_shape уровня внедрения должен быть (batch_size, time_steps), где time_steps - это длина развернутого LSTM / количество ячеек, а batch_size - количество примеров в пакете.

model = Sequential()
model.add(Embedding(
   input_dim=input_dim, # e.g, 10 if you have 10 words in your vocabulary
   output_dim=embedding_size, # size of the embedded vectors
   input_length=time_steps,
   batch_input_shape=(batch_size,time_steps)
))
model.add(LSTM(
   10, 
   batch_input_shape=(batch_size,time_steps,embedding_size),
   return_sequences=False, 
   stateful=True)
)

Есть отличная запись в блоге, в которой объясняются LSTM с отслеживанием состояния в Керасе. Кроме того, я загрузил gist, который содержит простой пример LSTM с отслеживанием состояния и уровнем встраивания. .

person Stefan    schedule 01.12.2016
comment
Как выбрать размер embedding_size или узнать размер встроенных векторов? - person naisanza; 05.09.2017
comment
@naisanza Embedding_size - это гиперпараметр. Это означает, что размер embedding_size зависит от вашей проблемы, и вы можете выбрать его. К сожалению, я не могу дать вам общий ответ о том, как выбрать хорошие гиперпараметры, но arxiv.org/pdf/ 1206.5533.pdf дает хорошее начало по этой теме. - person Stefan; 11.09.2017