2016-11-19 2 views
4

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

рабочее с сохранением состояния 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 с состоянием?

ответ

2

Параметр 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) 
) 

Существует отличный blog post, который объясняет отслеживанием состояния LSTMs в Keras. Кроме того, я загрузил gist, который содержит простой пример состояния LSTM с состоянием с уровнем вложения.

+0

Как вы определяете embedding_size или узнаете размер встроенных векторов? – naisanza

+0

@naisanza Значение embedding_size является гиперпараметром. Это означает, что embedding_size зависит от вашей проблемы, и вы можете выбрать ее. К сожалению, я не могу дать вам общий ответ о том, как выбрать хорошие гиперпараметры, но https://arxiv.org/pdf/1206.5533.pdf дает хорошее начало по этой теме. – bruThaler

Смежные вопросы