1
votes

Tensorflow - TypeError: l'objet 'int' n'est pas itérable

J'obtiens une erreur, mais elle est enfouie dans la bibliothèque TensorFlow, j'ai donc du mal à comprendre ce qui ne va pas avec mon modèle.

J'essaie d'utiliser un RNN avec LSTM. Mon modèle ressemble à ceci:

   File "C:\Users\bencu\Desktop\ProjectFiles\Code\Program.py", line 74, in FitModel
    input_shape=1000, return_sequences=True))
  File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\layers\recurrent_v2.py", line 881, in __init__
    **kwargs)
  File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\layers\recurrent.py", line 1007, in __init__
    super(DropoutRNNCellMixin, self).__init__(*args, **kwargs)
  File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\layers\recurrent.py", line 2541, in __init__
    **kwargs)
  File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\layers\recurrent.py", line 395, in __init__
    super(RNN, self).__init__(**kwargs)
  File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\training\tracking\base.py", line 457, in _method_wrapper
    result = method(self, *args, **kwargs)
  File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\base_layer.py", line 356, in __init__
    batch_input_shape = (batch_size,) + tuple(kwargs['input_shape'])
TypeError: 'int' object is not iterable

Mes données d'entraînement sont une liste de listes comprenant chacune 1 000 flottants. Par exemple, x_train [0] =

[0.0, 0.0, 0.1, 0.25, 0.5, ...]

J'obtiens cette erreur:

model = Sequential()

    model.add(LSTM(128, activation='relu',
                   input_shape=1000, return_sequences=True))
    model.add(Dropout(0.2))
    model.add(LSTM(128, activation='relu'))
    model.add(Dropout(0.2))
    model.add(Dense(32, activation='relu'))
    model.add(Dropout(0.2))
    model.add(Dense(2, activation='softmax'))

    opt = tf.keras.optimizers.Adam(lr=1e-3, decay=1e-5)

    model.compile(optimizer='rmsprop',
                  loss='binary_crossentropy',
                  metrics=['accuracy'])

    model.fit(x_train, y_train, epochs=3, validation_data=(x_test, y_test))

Je suis assez nouveau dans le ML, donc si quelqu'un pouvait comprendre où je me trompe, ce serait très apprécié. Merci.


0 commentaires

3 Réponses :


1
votes

L'argument input_shape est censé être un tuple, même si le tenseur d'entrée est unidimensionnel. Utilisez plutôt input_shape = (1000,) . Notez que la virgule est importante pour s'assurer que Python l'interprète comme un tuple, et non comme un seul entier.


0 commentaires

1
votes

Le message d'erreur dit: TypeError: l'objet 'int' n'est pas itérable . Donc, quelque chose ne va pas avec un int dans notre code, ce qui provoque une Erreur car c'est le mauvais Type .

La ligne la plus récente dans la trace de pile qui est dans notre propre code est:

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

Les seuls int ici sont 128 et 1000 . Le 128 est le nombre d'unités, donc c'est très bien. La input_shape ne l'est pas; si nous spécifions la "forme" d'un tableau numpy (ou similaire), alors nous avons besoin d'une séquence de valeurs - une pour la taille de chaque dimension. Oui, même pour une entrée unidimensionnelle.

Nous spécifions cela à la place comme (1000,).


0 commentaires

3
votes

Keras s'attend à ce que input_shape soit toujours un tuple ; pour une valeur unique, cela ressemblerait à (1000,) .

Pour LSTM, cependant, la forme complète attendue ( batch_shape ) est: ( num_samples, timesteps, num_channels) - ou de manière équivalente, (batch_size, timesteps, features) . input_shape est simplement batch_shape sans dimension 0 - c'est-à-dire (timesteps, num_channels) . Si vos données d'entrée sont univariées (par exemple séquence 1D), alors num_channels = 1 - donc:

model.add(LSTM(128, activation='relu', input_shape=(1000, 1), return_sequences=True))

Enfin, pour 'binary_crossentropy' , une meilleure couche de sortie serait Dense (1, activation = 'sigmoid') . Pour plus d'informations, consultez cette réponse .


: pour être sûr, exécutez print (x_train.shape) , et assurez-vous que toutes les valeurs sauf la (dim 0) correspond à votre input_shape . Je recommande cependant de toujours utiliser batch_shape sur input_shape , sauf si l'application implique des tailles de lots variables - cela facilite le débogage.

Pour votre exemple 1D, s'il renvoie quelque chose comme (32, 1000) , vous devrez ajouter une dimension pour le rendre 3D: x_train = np.expand_dims (x_train, -1) (-1 = dernier axe)


3 commentaires

Merci beaucoup. Cela a résolu le problème d'origine. Cependant, j'obtiens maintenant cette erreur: ValueError: Impossible de convertir un tableau NumPy en un Tensor (flottant de type d'objet non pris en charge).


@Cutter De rien. Cela semble être un problème avec le formatage de vos données ou l'installation des versions - quoi qu'il en soit, cela sort du cadre de cette question. Si vous ouvrez une nouvelle question sur cette erreur, vous pouvez répondre ici pour m'en informer - je peux jeter un œil.


Merci @OverLordGoldDragon. J'ai essayé d'enquêter moi-même sur le problème sans succès. J'ai posé une question de suivi, si vous pouviez jeter un coup d'œil, ce serait génial :) stackoverflow.com/questions/58636087/...