web-dev-qa-db-fra.com

Keras AttributeError: l'objet 'list' n'a pas d'attribut 'ndim'

J'utilise un modèle de réseau neuronal Keras dans Jupyter Notebook (Python 3.6)

Je reçois l'erreur suivante

AttributeError: l'objet 'list' n'a pas d'attribut 'ndim'

après avoir appelé la méthode .fit () à partir de Keras.model

model  = Sequential()
model.add(Dense(5, input_dim=len(X_data[0]), activation='sigmoid' ))
model.add(Dense(1, activation = 'sigmoid'))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['acc'])
model.fit(X_data, y_data, epochs=20, batch_size=10)

J'ai vérifié le fichier Requirements.txt pour Keras (dans Anaconda3) et les versions Numpy, Scipy et six modules sont toutes à jour.

Que peut expliquer cette AttributeError?

Le message d'erreur complet est le suivant (semble être quelque peu lié à Numpy):

-------------------------------------------------- ------------------------- AttributeError Traceback (dernier appel en dernier) in () 3 model.add (Dense (1, activation = 'sigmoid' )) 4 model.compile (loss = 'mean_squared_error', optimizer = 'adam', metrics = ['acc']) ----> 5 model.fit (X_data, y_data, epochs = 20, batch_size = 10)

~\Anaconda3\lib\site-packages\keras\models.py en forme (self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_Epoch, steps_per_Epoch, steps_per_Epoch, validation_steps,} kwargs) 963 initial_Epoch = initial_Epoch, 964 steps_per_Epoch = steps_per_Epoch, -> 965 validation_steps = validation_steps) 966 967 def évaluer (auto, x = Aucune, y = Aucune,

~\Anaconda3\lib\site-packages\keras\engine\training.py en forme (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) 1591
class_weight = class_weight, 1592 check_batch_axis = False, -> 1593 batch_size = batch_size) 1594 # Préparez les données de validation. 1595 do_validation = False

~\Anaconda3\lib\site-packages\keras\engine\training.py dans _standardize_user_data (self, x, y, sample_weight, class_weight, check_batch_axis, batch_size) 1424
self._feed_input_shapes, 1425
check_batch_axis = False, -> 1426 exception_prefix = 'input') 1427 y = _standardize_input_data (y, self._feed_output_names,
1428 formes de sortie,

~\Anaconda3\lib\site-packages\keras\engine\training.py dans _standardize_input_data (données, noms, formes, check_batch_axis, préfixe exception) 68 Elif isinstance (données, liste): 69 data = [x.values ​​si x.- classe .nom == 'DataFrame' sinon x pour x dans les données] ---> 70 données = [np.expand_dims (x, 1) si x n'est pas Aucun et x.ndim == 1 sinon x pour x dans les données] 71 sinon: 72 data = valeurs.valeurs si données .classe .nom == 'DataFrame' autres données

~\Anaconda3\lib\site-packages\keras\engine\training.py in (.0) 68 Elif isinstance (données, liste): 69 data = [x.values ​​if x .class. nom == 'DataFrame' sinon x pour x dans les données] ---> 70 données = [np.expand_dims (x, 1) si x n'est pas None et x.ndim == 1 sinon x pour x dans les données] 71 sinon: 72 données = données.valeurs si données .classe .nom == 'DataFrame' autres données

AttributeError: l'objet 'list' n'a pas d'attribut 'ndim'

13
Larry

model.fit _ s'attend à ce que x et y soit un tableau numpy. On dirait que vous passez une liste, il a essayé d'obtenir la forme de l'entrée en lisant l'attribut ndim du tableau numpy et a échoué.

Vous pouvez simplement le transformer en utilisant np.array:

import numpy as np
...
model.fit(np.array(train_X),np.array(train_Y), epochs=20, batch_size=10)
29
CtheSky

Lorsque vous importez, vous devez utiliser tensorflow.keras au lieu de keras comme ceci:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Input, Conv2D, MaxPool2D, Dense

car il y a un bogue lié au module keras.

Référence: ici .

2
tsveti_iko

Je ne connais pas la forme de vos données d'entraînement, mais je soupçonne que vous avez une erreur sur votre input_dim. Essayez de le changer en input_dim=len(X_data) comme ceci:

model  = Sequential()
model.add(Dense(5, input_dim=len(X_data), activation='sigmoid' ))
model.add(Dense(1, activation = 'sigmoid'))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['acc'])
model.fit(X_data, y_data, epochs=20, batch_size=10)
0
Ioannis Nasios