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.
3 Réponses :
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.
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,)
.
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)
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/...