web-dev-qa-db-ja.com

Kerasで複数のLSTMをスタックする方法は?

私は深層学習ライブラリkerasを使用して、運のない複数のLSTMをスタックしようとしています。以下は私のコードです

model = Sequential()
model.add(LSTM(100,input_shape =(time_steps,vector_size)))
model.add(LSTM(100))

上記のコードは、3行目でエラーを返しますException: Input 0 is incompatible with layer lstm_28: expected ndim=3, found ndim=2

入力Xは、形状のテンソル(100,250,50)です。私はテンソルフローバックエンドでケラスを実行しています

46
Tamim Addari

最初のレイヤーにreturn_sequences=Trueを追加して、その出力テンソルがndim=3(つまり、バッチサイズ、タイムステップ、非表示状態)を持つようにする必要があります。

次の例をご覧ください。

# expected input data shape: (batch_size, timesteps, data_dim)
model = Sequential()
model.add(LSTM(32, return_sequences=True,
               input_shape=(timesteps, data_dim)))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32, return_sequences=True))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32))  # return a single vector of dimension 32
model.add(Dense(10, activation='softmax'))

From: https://keras.io/getting-started/sequential-model-guide/ (「stacked lstm」を検索)

74

@DanielAdiwardanaの回答の詳細な説明。最後のレイヤーを除くすべてのLSTMレイヤーにreturn_sequences = Trueを追加する必要があります。

このフラグをTrueに設定すると、KerasはLSTM出力にすべての履歴生成出力とタイムスタンプを含める必要があることを認識できます(D)。したがって、次のLSTMレイヤーはさらに機能しますデータについて。

このフラグがfalseの場合、LSTMは最後の出力のみを返します(2D)。このような出力は、十分ではない別のLSTMレイヤーの場合です。

# expected input data shape: (batch_size, timesteps, data_dim)
model = Sequential()
model.add(LSTM(32, return_sequences=True,
               input_shape=(timesteps, data_dim)))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32, return_sequences=True))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32))  # return a single vector of dimension 32
model.add(Dense(10, activation='softmax'))

オンサイド注:::ユーザーが必要とする形式で出力を取得するために、最後の高密度レイヤーが追加されます。ここで、Dense(10)は、softmaxアクティベーションを使用して10の異なるクラス出力が生成されることを意味します。

時系列にLSTMを使用している場合、Dense(1)が必要です。そのため、1つの数値出力のみが提供されます。

6
shantanu pathak