0

Voici ce que j'ai fait. J'ai obtenu le code pour la classification d'image de chien/chat et j'ai compilé et couru et ai obtenu l'exactitude de 80%. J'ai ajouté un dossier de classe (avion) ​​au dossier de train et de validation. Les modifications apportées dans les codes suivantsComment faire une classification d'image multi-classe dans keras?

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

train_generator = train_datagen.flow_from_directory(
    train_data_dir, 
    target_size=(img_width, img_height), 
    batch_size=batch_size, 
    class_mode='categorical') 

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir, 
    target_size=(img_width, img_height), 
    batch_size=batch_size, 
    class_mode='categorical') 

changé binary class_mode-categorical et aussi la perte de categorical_crossentropy. Modification également la mise en page de sortie sigmoid à softmax. Reçoit l'erreur suivante. Dois-je modifier explicitement les étiquettes d'apprentissage pour les catégoriques comme mentionné ci-dessous? (Je l'ai lu ce à partir du site multilabel classification using keras)

train_labels = to_categorical(train_labels, num_classes=num_classes) 

Je ne sais pas ce qui se passe ici. S'il vous plaît aider. Je suis relativement nouveau à l'apprentissage en profondeur.

modèle

model = Sequential() 

model.add(Conv2D(32, (3, 3), input_shape=input_shape)) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Conv2D(32, (3, 3))) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Conv2D(64, (3, 3))) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Flatten()) 
model.add(Dense(64)) 
model.add(Activation('relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(1)) 
model.add(Activation('softmax')) 

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

# this is the augmentation configuration we will use for training 
train_datagen = ImageDataGenerator(
    rescale=1./255, 
    shear_range=0.2, 
    zoom_range=0.2, 
    horizontal_flip=True) 
# this is the augmentation configuration we will use for testing: 
# only rescaling 
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='categorical') 


validation_generator = test_datagen.flow_from_directory(
    validation_data_dir, 
    target_size=(img_width, img_height), 
    batch_size=batch_size, 
    class_mode='categorical') 
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) 
+0

pls partager votre modèle, ainsi que la structure de vos données d'étiquettes ('y_test') - est-ce un entier (0/1/2) ou un vecteur codé à chaud unique (' [0.0, 0.0, 1.0] ')? – desertnaut

+0

# dimensions de nos images. img_width, img_height = 150, 150 train_data_dir = '/ home/edwin/dc/train' validation_data_dir = '/ home/edwin/dc/validation' nb_train_samples = 2011 nb_validation_samples = 813 époques = 3 batch_size = 16 si K.image_data_format() == 'channels_first': input_shape = (3, img_width, img_height) autre: input_shape = (img_width, img_height, 3) modèle = séquentiel() –

+0

Pas du tout ce que j'ai demandé - pls vérifier à nouveau mes questions; et que sommes-nous supposés faire avec les chemins de répertoire locaux pour votre système? De plus, les commentaires ne sont pas le bon endroit pour ce genre d'information - vous devez éditer et mettre à jour votre message, si nécessaire. – desertnaut

Répondre

1

Pour la classification multi-classe, la dernière couche dense doit avoir un certain nombre de noeuds égal au nombre de classes, suivi par softmax activation, à-dire les deux dernières couches de votre modèle devrait être:

model.add(Dense(num_classes)) 
model.add(Activation('softmax')) 

En outre, vos étiquettes (deux trains et de test) doit être encodée un chaud; donc, en supposant que vos chats et les chiens initiaux ont été étiquetés comme des entiers (0/1), et votre nouvelle catégorie (avion) ​​est d'abord marqué de la même « 2 », vous devez les convertir comme suit:

train_labels = keras.utils.to_categorical(train_labels, num_classes) 
test_labels = keras.utils.to_categorical(test_labels, num_classes) 

Enfin , au niveau terminologique, ce que vous faites est multi-classe, et non la classification multi-étiquettes (j'ai édité le titre de votre message) - le dernier terme est utilisé pour les problèmes où les échantillons peuvent appartenir à plus d'un catégories

+0

Je n'ai pas eu besoin de le changer en catégorique puisque j'utilisais mon propre ensemble de données d'image comme entrée. Le passage à "samples_per_epoch = nb_train_samples" au lieu de "steps_per_epoch = nb_train_samples // batch_size" a résolu le problème. –

1

Pour la classification des étiquettes multiples, la taille de la dernière couche d'un NN doit être égal au nombre de classes.

F.i. pour votre problème (3 classes), le code devrait ressembler à ceci:

model = Sequential() 

model.add(Conv2D(32, (3, 3), input_shape=input_shape)) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Conv2D(32, (3, 3))) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Conv2D(64, (3, 3))) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Flatten()) 
model.add(Dense(64)) 
model.add(Activation('relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(3)) 
model.add(Activation('softmax'))