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/...