5

Keras でステートフル LSTM を構築しようとしていますが、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(...)

Embedding レイヤーを追加するとき、batch_input_shapeパラメーターを Embedding レイヤーに移動します。つまり、形状を知る必要があるのは最初のレイヤーだけですか? このような:

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 に結合するトリックは何ですか?

4

1 に答える 1

4

Embedding レイヤーの 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)
)

Keras のステートフル LSTM を説明する優れたブログ投稿があります。また、埋め込みレイヤーを使用したステートフル LSTM の簡単な例を含む要点をアップロードしました。

于 2016-12-01T14:12:05.900 に答える