web-dev-qa-db-fra.com

Erreur lors de la vérification de la cible: dense_1 devait avoir 3 dimensions, mais un tableau avec une forme (118, 1)

J'entraîne un modèle pour prédire le cours des actions et les données d'entrée sont des cours proches. J'utilise des données sur 45 jours pour prédire le cours de clôture du 46ème jour et un indicateur économique est la deuxième caractéristique. Voici le modèle:

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)

Quand j'exécute ceci, j'obtiens l'erreur suivante:

ValueError: erreur lors de la vérification de la cible: dense_1 devait avoir 3 dimensions, mais obtenu tableau avec forme (118, 1)

Cependant, je print la forme des données et elles sont:

X_train:(118, 45, 2)
y_train:(118, 1)

Je ne sais pas pourquoi le modèle s'attend à une sortie en 3 dimensions lorsque y_train est (118, 1). Où est-ce que je me trompe et que dois-je faire?

4
Deus

Votre deuxième couche LSTM renvoie également des séquences et les couches denses appliquent par défaut le noyau à chaque pas de temps produisant également une séquence:

# (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)

Donc, votre sortie est shape (bs, 45, 1). Pour résoudre le problème, vous devez définir return_sequences=False dans votre deuxième couche LSTM, qui compressera la séquence:

# (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)

Et vous obtiendrez le résultat souhaité. Note bs est la taille du lot.

1
nuric