ケラスを使用して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)ラベル配列です。
誰かが私がここで間違っていたことを指摘できますか?
完全を期すために、ここで何が起こったのかを示します。
まず、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)))
_