2015-08-13 6 views
3

Je suis en train de construire un perceptron multicouche très simple (MLP) dans keras:Python: Erreur keras de non-concordance de forme

model = Sequential() 
model.add(Dense(16, 8, init='uniform', activation='tanh')) 
model.add(Dropout(0.5)) 
model.add(Dense(8, 2, init='uniform', activation='tanh')) 

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) 
model.compile(loss='mean_squared_error', optimizer=sgd) 

model.fit(X_train, y_train, nb_epoch=1000, batch_size=50) 
score = model.evaluate(X_test, y_test, batch_size=50) 

Ma forme de données de formation: X_train.shape donne (34180, 16)

Les étiquettes appartiennent à la classe binaire avec la forme: y_train.shape donne (34180,)

donc mon code keras devrait produire le réseau avec connexion suivante: 16x8 => 8x2

qui produit l'erreur de non-concordance de forme:

ValueError: Input dimension mis-match. (input[0].shape[1] = 2, input[1].shape[1] = 1) 

Apply node that caused the error: Elemwise{sub,no_inplace}(Elemwise{Composite{tanh((i0 + i1))}}[(0, 0)].0, <TensorType(float64, matrix)>) 
Inputs types: [TensorType(float64, matrix), TensorType(float64, matrix)] 
Inputs shapes: [(50, 2), (50, 1)] 
Inputs strides: [(16, 8), (8, 8)] 

A Epoch 0 à la ligne model.fit(X_train, y_train, nb_epoch=1000, batch_size=50). Est-ce que je supervise quelque chose d'évident à Keras?

EDIT: Je suis passé par la question here mais ne résout pas mon problème

Répondre

10

J'ai eu le même problème et trouvé ce fil;

https://github.com/fchollet/keras/issues/68

Il apparaît pour vous à l'état d'une couche de sortie finale de 2 ou pour un certain nombre de catégories, les étiquettes doivent être d'un type catégorique où essentiellement c'est un vecteur binaire pour chaque observation, par exemple une 3 classe le vecteur de sortie [0,2,1,0,1,0] devient [[1,0,0], [0,0,1], [0,1,0], [1,0,0], [ 0,1,0], [1,0,0]].

La fonction np_utils.to_categorical a résolu cela pour moi;

from keras.utils import np_utils, generic_utils 

y_train, y_test = [np_utils.to_categorical(x) for x in (y_train, y_test)] 
+0

Une autre option, qui vous aidera à "unmap" vos vecteurs one-hot, est d'utiliser 'sklearn.preprocessing.LabelBinarizer'. http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelBinarizer.html – hlin117