web-dev-qa-db-ja.com

Keras LSTM入力寸法設定

ケラスを使用してLSTMモデルをトレーニングしようとしましたが、ここで何か問題が発生したと思います。

エラーが発生しました

ValueError:入力チェック時のエラー:lstm_17_inputは3次元であることが期待されましたが、形状(10000、0、20)の配列を取得しました

私のコードは次のようになりますが

model = Sequential()
model.add(LSTM(256, activation="relu", dropout=0.25, recurrent_dropout=0.25, input_shape=(None, 20, 64)))
model.add(Dense(1, activation="sigmoid"))
model.compile(loss='binary_crossentropy',
          optimizer='adam',
          metrics=['accuracy'])
model.fit(X_train, y_train,
      batch_size=batch_size,
      epochs=10)

どこ X_trainの形状は(10000, 20)と最初のいくつかのデータポイントは

array([[ 0,  0,  0, ..., 40, 40,  9],
   [ 0,  0,  0, ..., 33, 20, 51],
   [ 0,  0,  0, ..., 54, 54, 50],
...

およびy_trainの形状は(10000, )、これはバイナリ(0/1)ラベル配列です。

誰かが私がここで間違っていたことを指摘できますか?

8
Mr.cysl

完全を期すために、ここで何が起こったのかを示します。

まず、LSTMは、Kerasのすべてのレイヤーと同様に、_input_shape_と_batch_input_shape_の2つの引数を受け入れます。違いは、慣例では_input_shape_ バッチサイズを含まないですが、_batch_input_shape_はバッチサイズを含む完全な入力形状です。

したがって、仕様input_shape=(None, 20, 64)は、4次元の入力を期待するようにkerasに指示しますが、これは必要なことではありません。正しいのは単に_(20,)_でした。

しかし、それだけではありません。 LSTMレイヤーはリカレントレイヤーであるため、3次元の入力_(batch_size, timesteps, input_dim)_が必要です。そのため、正しい指定はinput_shape=(20, 1)またはbatch_input_shape=(10000, 20, 1)です。さらに、トレーニング配列は、各ステップごとに_20_タイムステップと_1_入力機能があることを示すように再形成する必要もあります。

したがって、ソリューション:

_X_train = np.expand_dims(X_train, 2)  # makes it (10000,20,1)
...
model = Sequential()
model.add(LSTM(..., input_shape=(20, 1)))
_
21
Maxim