2017-06-19 6 views
1

J'apprends comment travailler avec Keras avec le backend TF pour la reconnaissance d'image, donc je ne suis toujours pas sûr de ce que je fais mal ici.Keras ValueError: fit_generator donnant une liste

J'essaie d'empiler 2 modèles, l'un étant VGG16, et l'autre étant un aléatoire que j'ai fait juste pour apprendre à l'empiler. Je veux classer une image parmi 5 classes.

Le problème est dans la dernière partie, lorsque j'exécute fit_generator. Au lieu de donner un tuple valide, il donne à quoi il ressemble d'être une liste. J'ai vu beaucoup de gens avoir des problèmes similaires, mais dans leur cas, le résultat était Aucun, donc je ne suis pas sûr que la solution soit la même.

Paramètres

nb_train_samples = 576 
nb_validation_samples = 144 
epochs = 30 
batch_size = 12 
img_width, img_height = 150, 150 

Générateurs

train_datagen = ImageDataGenerator(
    rescale=1./255, 
    rotation_range=50, 
    width_shift_range=0.3, 
    height_shift_range=0.3, 
    shear_range=0.4, 
    zoom_range=0.4, 
    horizontal_flip=True) 

test_datagen = ImageDataGenerator(rescale=1./255) 

train_generator = train_datagen.flow_from_directory(
    train_data_dir, 
    target_size=(img_width, img_height), 
    batch_size=batch_size, 
    class_mode=None, 
    shuffle=False) 

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir, 
    target_size=(img_width, img_height), 
    batch_size=batch_size, 
    class_mode=None, 
    shuffle=False) 

Mon modèle

input = Input(batch_shape=model.output_shape) 
x = Flatten()(input) 
x = Dense(256, activation='relu', name="new_block_1")(x) 
x = Dropout(0.5)(x) 
x = Dense(256, activation='relu', name="new_block_2")(x) 
x = Dropout(0.5)(x) 
x = Dense(5, activation='softmax', name="new_block_3")(x) 
top_model = Model(input,x) 

input = Input(shape=(img_width, img_height, 3)) 
x = model(input) 
x = top_model(x) 
final_model = Model(input, x) 

final_model.compile(optimizer='rmsprop', 
       loss='categorical_crossentropy', metrics=['accuracy']) 

Fit et erreur

final_model.fit_generator(
    train_generator, 
    steps_per_epoch=nb_train_samples // batch_size, 
    epochs=epochs, 
    validation_data=validation_generator, 
    validation_steps=nb_validation_samples // batch_size) 

ValueError: output of generator should be a tuple `(x, y, sample_weight)` or `(x, y)`. Found: [[[[ 0.89411771 0.89019614 0.87450987] 
    [ 0.89411771 0.89019614 0.87450987] 
    [ 0.89411771 0.89019614 0.87450987] 
    ..., 

Mise à jour 1: comme par @ pointe de petezurich, a changé la fonction d'activation de 'sigmoïde' à 'softmax'

+0

Cela ne fait peut-être pas directement référence à votre question, mais y a-t-il une raison particulière pour laquelle vous avez un sigmoïde sur votre dernière couche dense plutôt qu'une softmax? – petezurich

+0

aucune raison, en fait, mais pourrait aussi bien essayer de le changer. J'essayais juste de faire des trucs, donc j'ai peut-être copié-collé sans m'en apercevoir – htcoelho

+1

Softmax est le bon choix dans votre cas, car il vous donne la probabilité de chacune de vos 5 classes. Sigmoid serait correct pour une classification binaire. – petezurich

Répondre

1

Votre modèle est l'absence d'étiquettes pour la formation.

Il vous suffit de définir le class_mode sur categorical dans vos générateurs et de placer vos images dans des sous-dossiers pour chaque classe. Le générateur tire bien les étiquettes de classe de cela.