2016-11-19 4 views
4

KerasでステートフルなLSTMを作成しようとしていますが、LSTMを実行する前に埋め込みレイヤーを追加する方法がわかりません。問題はstatefulフラグのようです。私のネットがステートフルでない場合、埋め込みレイヤーを追加することはかなり単純明快であり、機能します。層を埋め込むことなく埋め込みレイヤーを持つステートフルLSTM(シェイプは一致しません)

作業ステートフル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(...) 

I、即ち第1層のみが形状を知らする必要が埋め込み層に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に単語埋め込みを組み合わせる方法は何ですか? time_steps細胞とBATCH_SIZEのアンロールLSTM /番号の長さバッチの例の数である

答えて

2

埋め込み層のbatch_input_shapeパラメータは、(BATCH_SIZE、time_steps)であるべきです。

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) 
) 

はKerasでステートフルLSTMsを説明する優れたblog postがあります。また、gistをアップロードしました。これには埋め込みレイヤーを備えたステートフルLSTMの簡単な例が含まれています。

+0

embedding_sizeを決定するか、埋め込みベクトルのサイズを調べるにはどうすればよいですか? – naisanza

+0

@naisanza embedding_sizeはハイパーパラメータです。これはembedding_sizeがあなたの問題に依存し、自由に選択できることを意味します。 残念ながら、良いハイパーパラメータを選択する方法に関する一般的な回答は得られませんが、https://arxiv.org/pdf/1206.5533.pdfはそのトピックの良いスタートです。 – bruThaler

関連する問題