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'
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
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
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