web-dev-qa-db-ja.com

ターゲットをチェックする際のエラー:dense_1には3次元が必要ですが、形状(118、1)の配列を取得しました

モデルをトレーニングして株価を予測し、入力データは終値です。 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次元の出力を期待する理由はわかりません。私はどこが間違っているのですか?

9
Deus

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はバッチサイズです。

7
nuric