2
votes

Erreur de dimensions d'entrée / sortie du réseau neuronal LSTM

Je suis assez nouveau dans l'architecture TensorFlow et LSTM. J'ai un problème avec la détermination des entrées et sorties (x_train, x_test, y_train, y_test) pour mon ensemble de données.

Forme de mes entrées à l'origine:

  • X_train: (366,4)
  • X_test: (104,4)
  • Y_train: (366,)
  • Y_test: (104,)

Ytrain et Ytest sont une série de cours boursiers. Xtrain et Xtest sont quatre fonctionnalités que je souhaite apprendre pour prédire les cours des actions.

# Splitting the training and testing data

train_start_date = '2010-01-08'
train_end_date = '2017-01-06'
test_start_date = '2017-01-13'
test_end_date = '2019-01-04'

train = df.ix[train_start_date : train_end_date]
test = df.ix[test_start_date:test_end_date]


X_test = sentimentScorer(test)
X_train = sentimentScorer(train)

Y_test = test['prices'] 
Y_train = train['prices']

#Conversion in 3D array for LSTM INPUT

X_test = X_test.reshape(1, 104, 4)
X_train = X_train.reshape(1, 366, 4)





model = Sequential()

model.add(LSTM(128, input_shape=(366,4), activation='relu', 
return_sequences=True))
model.add(Dropout(0.2))

model.add(LSTM(128, activation='relu'))
model.add(Dropout(0.1))

model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))

model.add(Dense(10, activation='softmax'))

opt = tf.keras.optimizers.Adam(lr=0.001, decay=1e-6)

# Compile model
model.compile(
    loss='sparse_categorical_crossentropy',
    optimizer=opt,
    metrics=['accuracy'],
)

model.fit(X_train,
          Y_train,
          epochs=3,
          validation_data=(X_test, Y_test))

Voici l'erreur générée:

----------------------------------------------- ---------------------------- ValueError Traceback (appel le plus récent dernier) dans 65 Y_train, 66 époques = 3, ---> 67 validation_data = (X_test, Y_test))

c: \ users \ talal \ appdata \ local \ programs \ python \ python36 \ lib \ site-packages \ tensorflow \ python \ keras \ engine \ training.py in fit (self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, ** kwargs) 1507 steps_name = 'steps_per_epoch', 1508 steps = steps_per_epoch, -> 1509 validation_split = validation_split) 1510 1511 # Préparer les données de validation.

c: \ users \ talal \ appdata \ local \ programs \ python \ python36 \ lib \ site-packages \ tensorflow \ python \ keras \ engine \ training.py dans _standardize_user_data (self, x, y, sample_weight, class_weight, batch_size, check_steps, steps_name, steps, validation_split) 991 x, y = élément_suivant 992 x, y, sample_weights = self._standardize_weights (x, y, sample_weight, -> 993 class_weight, batch_size) 994 retourne x, y, sample_weights 995

c: \ users \ talal \ appdata \ local \ programs \ python \ python36 \ lib \ site-packages \ tensorflow \ python \ keras \ engine \ training.py dans _standardize_weights (self, x, y, sample_weight, class_weight, batch_size) 1110 feed_input_shapes, 1111
check_batch_axis = False, # Ne pas appliquer la taille du lot. -> 1112 exception_prefix = 'input') 1113 1114 si y n'est pas None:

c: \ users \ talal \ appdata \ local \ programs \ python \ python36 \ lib \ site-packages \ tensorflow \ python \ keras \ engine \ training_utils.py dans standardize_input_data (données, noms, formes, check_batch_axis, exception_prefix) 314 ': attendu' + noms [i] + 'avoir' + 315 str (len (forme)) + 'dimensions, mais obtenu un tableau' -> 316 'avec forme' + str (data_shape)) 317 sinon check_batch_axis: 318 data_shape = data_shape [1:]

ValueError: Erreur lors de la vérification de l'entrée: attendue lstm_18_input 3 dimensions, mais un tableau avec la forme (366, 4)


1 commentaires

est 366 est le nombre d'horodatages dans un échantillon?


3 Réponses :


2
votes

Votre code est presque parfait.

Votre y_test et y_train devraient être un tableau avec un élément ou un tableau de forme (1,1), ce n'est pas le cas. t importe.

Votre forme d'entrée est incorrecte cependant, le premier LSTM devrait être:

model.add(LSTM(128, input_shape=(None,4), activation='relu', return_sequences=True))

Remarquez Aucun , comme votre test et la longueur des séquences de train est différente, vous ne pouvez pas la spécifier (et Keras accepte la première dimension non spécifiée). L'erreur était due à des longueurs de 366 et 104 respectivement. Si vous souhaitez utiliser des lots avec des RNN, vous devez effectuer un remplissage nul avec keras.preprocessing.sequence.pad_sequences.

Pas besoin de spécifier input_shape avec batch, le reste du réseau devrait aller bien.

Et si vous effectuez une régression, pas une classification, comme c'est probablement le cas, vous devriez effectuer les deux dernières étapes écrites par @Ankish Bansal, par exemple changer la perte en erreur quadratique moyenne et rendre la valeur de sortie de la dernière couche 1 au lieu de 10.


4 commentaires

Hey, merci pour votre réponse. Je dois expliquer que j'ai 366 observations et 4 fonctionnalités. (366,4). C'est avant que je le remodèle en (1, 366, 4). Quoi qu'il en soit, a a modifié la forme d'entrée en (1, 366, 4), ce qui a entraîné l'erreur:> ValueError: les formes doivent être de rang égal, mais sont 3 et 2


Vérifiez ma mise à jour, cela devrait résoudre tous vos problèmes


oui cela a fonctionné mais je ne sais toujours pas comment réduire le y_test et le y_train en un tableau (1,1). Cela n'a pas de sens, ce sont les prix du stock correspondant à chacune des observations (366 en x_train et 104 en x_test). voici l'erreur produite: ValueError: les tableaux d'entrée doivent avoir le même nombre d'échantillons que les tableaux cibles. Trouvé 1 échantillons d'entrée et 366 échantillons cibles.


Vous avez besoin d'une architecture différente pour cette tâche et lisez les LSTM / RNN et leur fonctionnement. BTW. Cochez la bonne réponse à votre question afin d'éviter toute confusion.



2
votes
  1. LSTM attend l'entrée de dims comme (num_examples, seq_length, input_dims), donc il y a une erreur dans l'entrée.

  2. Vous prédisez la sortie de la dimension 1, la sortie de votre modèle 10. Essayez ceci.

    model.add (Dense (1, activation = 'linear'))

  3. De plus, vous prédisez le prix, c'est un problème de régression. Mais vous utilisez le paramètre de classification. Essayez ceci

    model.compile (loss = 'mse', optimizer = 'adam', metrics = ['mean_squared_error'])


1 commentaires

Merci pour votre réponse. en ce qui concerne le premier changement que vous avez mentionné, je n'ai qu'un seul échantillon, un tableau de (366, 4). 4 caractéristiques et 366 observations. alors vous suggérez que ma input_shape devrait être = (1, 366, 4)? mais cela a entraîné l'erreur: ValueError: Les formes doivent être de rang égal, mais sont 3 et 2



2
votes

votre dimension est fausse pour X_train.LSTM n'accepte que les entrées en 3 dimensions. Vous dites que vous avez 4 fonctionnalités. En supposant que 366 est votre nombre d'horodatages pour un échantillon, votre entrée doit être de forme (num_samples, 366,4) bravo :-)


5 commentaires

Je n'ai qu'un seul échantillon, un tableau de (366, 4). 4 caractéristiques et 366 observations. alors vous suggérez que ma input_shape devrait être = (1, 366, 4)? mais cela a entraîné l'erreur: ValueError: Les formes doivent être de rang égal, mais sont 3 et 2


oui, cela devrait être :-) auparavant, l'erreur était dans la première couche LSTM maintenant qui a été corrigée. maintenant l'erreur se trouve dans la dernière couche dense.la sortie de cette couche dense est 3D mais vous fournissez 1D.Utilisez la couche d'aplatissement Keras pour réduire la dimension


utilisez model.summary () pour voir les formes de sortie de chaque calque, vous comprendrez. aussi la dernière forme de sortie des couches Denses doit être 1 pour le cas utilisateur, utilisez model.add (Dense (1, activation = 'relu')) pour la dernière couche


l'erreur semble se produire au niveau de la première couche LSTM: "model.add (LSTM (128, input_shape = (1, 366,4), activation = 'relu', return_sequences = True))"


@TalalZahid Vérifiez ma réponse mise à jour, désolé de pointer dans la mauvaise direction hier, mon mal.