Kerasで双方向LSTMを使う方法(エラーの回避方法)
ここでは,Kerasで双方向LSTM(Bidirectional LSTM)を用いる方法を紹介します。
With a Bidirectional LSTM layer, you can see the improvement in accuracy with fewer epochs.
双方向LSTM層を用いると,より少ないエポック数で精度の改善を得ることができます。
ただし,私が実験した限りでは,通常のLSTM層を単に双方向LSTMに変えただけでは,予測結果の著しい改善は見られませんでした。
model = Sequential()
model.add(Embedding(len(char_indices)+1,
300,
batch_size=(seq_length-time_step)*batch_size,
weights=[embedding_matrix],
mask_zero=True,
trainable=False))
model.add(Bidirectional(LSTM(512,
dropout=0.15,
return_sequences=True),
merge_mode='concat'))
model.add(Bidirectional(LSTM(512,dropout=0.15),merge_mode='concat'))
model.add(Dense(len(char_indices)+1, activation='softmax'))
双方向LSTM層がエラーを出すという書き込みがネット上に多くあるようですが,原因は双方向LSTM層ではなくreturn_sequences
です。
Dense層は二次元配列のみ受け取ることができます。しかし,LSTM層のreturn_sequences=True
とすると, 3 次元の配列を出力します。これは,return_sequences
が一つのシーケンスに対して複数の出力を持つからです。その結果,以下のようなエラーを出します。
ValueError: Shapes (None, None) and (3500, None, 10500) are incompatible
これを解決する一つの方法は,LSTM層をもう一つ置くことです。2 つ目のLSTM層は 1 つ目のLSTM層から 3 次元の配列を受け取り,2 次元の配列を出力します。
2 つ目のLSTM層は 3 次元のデータを 2 次元に変換するためのものであり,学習にはあまり関係していないようです。しかし,エラーを回避するために必要です。このあたりは,今後Kerasがバージョンアップしたときに改善するかもしれません。
SNSでシェア