3

Je rencontre un problème en essayant d'entraîner mon modèle dans Keras 2.0.8 , Python 3.6.1 et un backend Tensorflow.Keras ValueError: Erreur ValueError: lors de la vérification de la cible: dense_4 attendu pour avoir la forme (None, 2) mais le tableau avec la forme (2592, 1) Python3

Message d'erreur:

ValueError: Error when checking target: expected dense_4 to have shape (None, 2) but got array with shape (2592, 1)

X_train = numpy.swapaxes(X_train, 1, 3) 
X_test = numpy.swapaxes(X_test, 1, 3) 

print("X_train shape: ") --> size = (2592, 1, 1366, 96) 
print("-----") 
print("X_test shape") --> size = (648, 1, 1366, 96) 
print("-----") 
print(Y_train.shape) --> size = (2592,) 
print("-----") 
print("Y_test shape") --> size = (648,) 

extraits pertinents du Code:

K.set_image_dim_ordering('th') 
K.set_image_data_format('channels_first') 

def create_model(weights_path=None): 
    model = Sequential() 
    model.add(Conv2D(32, kernel_size=(3, 3),activation='relu', padding="same", input_shape=(1, 1366, 96))) 
    model.add(Conv2D(64, (3, 3), activation='relu', dim_ordering="th")) 
    model.add(MaxPooling2D(pool_size=(2, 2))) 
    model.add(Flatten()) 
    model.add(Dense(128, activation='relu')) 
    model.add(Dropout(0.1)) 
    model.add(Dense(64, activation='relu')) 
    model.add(Dropout(0.1)) 
    model.add(Dense(16, activation='relu')) 
    model.add(Dense(2, activation='softmax')) 
    if weights_path: 
     model.load_weights(weights_path) 
    return model 

model = create_model() 
model.compile(loss=keras.losses.categorical_crossentropy, 
       optimizer=keras.optimizers.SGD(lr=0.01), 
       metrics=['accuracy']) 
history = model.fit(X_train, Y_train, 
     batch_size=32, 
     epochs=100, 
     verbose=1, 
     validation_data=(X_test, Y_test)) 

ligne 142, où j'appelle model.fit() est où je reçois cette erreur

Ce que j'ai essayé de réparer erreur Referenced ces postes de débordement de la pile:

J'ai essayé de remodeler les Y_test et Y_train tableaux de numpy en utilisant le code suivant:

Y_train.reshape(2592, 2) 
Y_test.reshape(648, 2) 

Cependant, je reçois l'erreur suivante:

ValueError: cannot reshape array of size 2592 into shape (2592,2)

+0

Votre MCVE est presque terminé. Quelle ligne lance l'erreur? Il y a aussi 1336 vs 1366 dans l'erreur; assurez-vous de copier le message verbatim. –

+1

Ligne 142, qui est quand j'appelle model.fit() j'ai mis à jour la question. –

+0

OK, l'incompatibilité de nombre provient de votre code: 'input_shape' a une valeur incorrecte dans' Conv2D'. Je suggère de passer explicitement la forme des entrées à 'create_model' plutôt que de le coder en dur. Les nombres magiques comme celui-ci sont sujets aux erreurs. –

Répondre

2

Comme vous utilisez la perte categorical_crossentropy, vous devez utiliser des étiquettes codées à chaud unique. Pour cela, vous pouvez utiliser la fonction to_categorical de keras.utils.np_utils

from keras.utils import np_utils 
y_train_onehot = np_utils.to_categorical(y_train) 
y_test_onehot = np_utils.to_categorical(y_test) 

Utilisez ensuite les encodées un chaud étiquettes pour former votre modèle.

3

Il me semble que vous devez changer la dernière couche de la NN:

def create_model(weights_path=None): 
    model = Sequential() 
    model.add(Conv2D(32, kernel_size=(3, 3),activation='relu', padding="same", input_shape=(1, 1366, 96))) 
    model.add(Conv2D(64, (3, 3), activation='relu', dim_ordering="th")) 
    model.add(MaxPooling2D(pool_size=(2, 2))) 
    model.add(Flatten()) 
    model.add(Dense(128, activation='relu')) 
    model.add(Dropout(0.1)) 
    model.add(Dense(64, activation='relu')) 
    model.add(Dropout(0.1)) 
    model.add(Dense(16, activation='relu')) 
    model.add(Dense(1, activation='sigmoid')) 
    if weights_path: 
     model.load_weights(weights_path) 
    return model 
+0

Y a-t-il plus d'explication à cela, ou est-ce juste une autre façon arbitraire de faire disparaître l'erreur? –

+0

@AndrasDeak sûr il y a, vérifiez la forme de vos données y (étiquettes), par exemple, Y_train.shape, la deuxième dimension de la Y_train DOIT être égale à la taille de la dernière couche de la NN. Pourquoi? Simple, comment devriez-vous travailler en réseau si vous avez une étiquette mais que la couche de sortie en a deux? – Paddy

+0

OK, je voulais juste m'assurer qu'il y a un raisonnement plus profond derrière ta réponse (vu le manque d'explication). Je ne connais pas l'apprentissage automatique, je viens de voir que OP est enclin à un peu de culture de cargaison, et je voulais m'assurer que la réponse est utile;) –