モデルをトレーニングして株価を予測し、入力データは終値です。 45日のデータを使用して、46日目の終値と経済指標を2番目の特徴として予測します。モデルは次のとおりです。
model = Sequential()
model.add( LSTM( 512, input_shape=(45, 2), return_sequences=True))
model.add( LSTM( 512, return_sequences=True))
model.add( (Dense(1)))
model.compile(loss='mse', optimizer='adam')
history = model.fit( X_train, y_train, batch_size = batchSize, epochs=epochs, shuffle = False)
これを実行すると、次のエラーが表示されます。
ValueError:ターゲットのチェック中にエラーが発生しました:dense_1は3次元であると予想されましたが、形状(118、1)の配列を取得しました
ただし、データの形状はprint
であり、次のとおりです。
X_train:(118, 45, 2)
y_train:(118, 1)
Y_trainが(118、1)のときにモデルが3次元の出力を期待する理由はわかりません。私はどこが間違っているのですか?
2番目のLSTMレイヤーもシーケンスを返し、密なレイヤーはデフォルトですべてのタイムステップにカーネルを適用してシーケンスも生成します。
# (bs, 45, 2)
model.add( LSTM( 512, input_shape=(45, 2), return_sequences=True))
# (bs, 45, 512)
model.add( LSTM( 512, return_sequences=True))
# (bs, 45, 512)
model.add( (Dense(1)))
# (bs, 45, 1)
したがって、出力はshape (bs, 45, 1)
です。問題を解決するには、シーケンスを圧縮する2番目のLSTMレイヤーにreturn_sequences=False
を設定する必要があります。
# (bs, 45, 2)
model.add( LSTM( 512, input_shape=(45, 2), return_sequences=True))
# (bs, 45, 512)
model.add( LSTM( 512, return_sequences=False)) # SET HERE
# (bs, 512)
model.add( (Dense(1)))
# (bs, 1)
そして、目的の出力が得られます。注bs
はバッチサイズです。