web-dev-qa-db-fra.com

Paramètre de dimension d'entrée Keras LSTM

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)

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?

8
Mr.cysl

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_shapene 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)))
21
Maxim