J'essayais de former un modèle LSTM à l'aide de keras, mais je pense que je me suis trompé ici.
J'ai une erreur de
ValueError: Erreur lors de la vérification de l'entrée: lstm_17_input devrait avoir 3 dimensions, mais le tableau a la forme (10000, 0, 20)
alors que mon code ressemble
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)
où X_train
a la forme de (10000, 20)
et les premiers points de données sont comme
array([[ 0, 0, 0, ..., 40, 40, 9],
[ 0, 0, 0, ..., 33, 20, 51],
[ 0, 0, 0, ..., 54, 54, 50],
...
et y_train
a la forme de (10000, )
, qui est un tableau d'étiquettes binaire (0/1).
Quelqu'un pourrait-il indiquer où je me suis trompé ici?
Par souci d'exhaustivité, voici ce qui s'est passé.
Tout d'abord, LSTM
, comme toutes les couches de Keras, accepte deux arguments: input_shape
Et batch_input_shape
. La différence est dans la convention que input_shape
ne contient pas la taille du lot, tandis que batch_input_shape
Est le forme d'entrée complète incluant la taille du lot.
Par conséquent, la spécification input_shape=(None, 20, 64)
indique aux keras d'attendre une entrée à 4 dimensions, ce qui n'est pas ce que vous voulez. Le correct aurait été juste (20,)
.
Mais ce n'est pas tout. La couche LSTM est une couche récurrente, donc elle attend une entrée en 3 dimensions (batch_size, timesteps, input_dim)
. C'est pourquoi la spécification correcte est input_shape=(20, 1)
ou batch_input_shape=(10000, 20, 1)
. De plus, votre tableau d'entraînement doit également être remodelé pour indiquer qu'il a 20
Pas de temps et 1
Fonction d'entrée à chaque pas.
Par conséquent, la solution:
X_train = np.expand_dims(X_train, 2) # makes it (10000,20,1)
...
model = Sequential()
model.add(LSTM(..., input_shape=(20, 1)))