Keras / faire tourner L'exemple de V3 Inception

j'essaie d'apprendre la syntaxe de Keras et de jouer avec le Lancement de la v3, exemple

j'ai un 4-classe multiclasse jouet problème j'ai donc modifié les lignes suivantes à partir de l'exemple:

NB_CLASS = 4  # number of classes
DIM_ORDERING = 'tf'  # 'th' (channels, width, height) or 'tf' (width, height, channels)

Mon jouet jeux de données ont les dimensions suivantes:

  • Taille du tableau contenant toutes les images: (595, 299, 299, 3)
  • Taille du tableau contenant les images d'entraînement: (416, 299, 299, 3)
  • Taille de la matrice contenant de la formation des étiquettes: (179, 4)
  • Taille du tableau contenant les images de test: (179, 299, 299, 3)
  • Taille de la matrice contenant le test étiquettes: (179, 4)

j'ai ensuite essayer de former le modèle avec le code suivant:

# fit the model on the batches generated by datagen.flow()
#  https://github.com/fchollet/keras/issues/1627
#    http://keras.io/models/sequential/#sequential-model-methods
checkpointer = ModelCheckpoint(filepath="/tmp/weights.hdf5", verbose=1, save_best_only=True)
model.fit_generator(datagen.flow(X_train, Y_train,
                batch_size=32),
                nb_epoch=10,
                samples_per_epoch=32,
                class_weight=None, #classWeights,
                verbose=2,
                validation_data=(X_test, Y_test),
                callbacks=[checkpointer])

Ensuite, j'obtiens l'erreur suivante:

Exception: The model expects 2 input arrays, but only received one array. Found: array with shape (179, 4)`

ce qui se rapporte probablement à ceci comme Inception voudrait avoir le auxiliaire classificateurs (Szegedy et al., 2014):

model = Model(input=img_input, output=[preds, aux_preds])

comment donner les deux étiquettes au modèle dans Keras n'étant pas non plus un programmeur Python avancé?

16
demandé sur nemo 2016-06-05 15:22:59

2 réponses

je vous recommande d'essayer d'abord avec ce tutoriel. Le code peut être trouvé ici.

vous verrez dans la première partie de celui-ci, il montre comment charger des données à partir d'un répertoire en utilisant:

.flow_from_directory(
   train_data_dir,
   target_size=(img_width, img_height),
   batch_size=batch_size,
   class_mode='binary')

pour entrer différentes classes, vous devrez mettre vos images dans un dossier par classe (notez qu'il y a probablement une autre façon de le faire, en passant les étiquettes). Notez aussi que dans votre cas class_mode ne peut pas utiliser 'binaire' (je pense que vous devriez utiliser 'catégorique'):

`"binary"`: binary targets (if there are only two classes),
`"categorical"`: categorical targets,

alors vous pouvez utiliser le modèle inceptionv3 qui est déjà dans Keras:

from keras.applications import InceptionV3    
cnn = InceptionV3(...)

notez aussi que vous avez trop peu d'exemples pour former InceptionV3, ce modèle est très grande (case ici la taille). Ce que vous pourriez faire dans ce cas est transfert d'apprentissage, en utilisant des poids pré-entraînés sur InceptionV3. Voir la section en utilisant le caractéristiques de goulot d'étranglement d'un réseau pré-formé: précision de 90% en une minutele tutoriel.

0
répondu Marc Cayuela Rafols 2017-11-06 18:09:24

le message d'erreur se rapporte au validation_data argument: comme vous êtes à l'aide de model.fit_generator les données de validation doivent également être transmises via un ImageDataGenerator objet (comme vous le faites déjà pour les données d'apprentissage). Il n'est pas lié à L'absence d'un classificateur auxiliaire - le modèle Inception v3 dans Keras ne met pas en œuvre le classificateur auxiliaire d'après le document original (c'est une autre raison d'essayer l'apprentissage par transfert plutôt que la formation complète).

mettez votre code à jour fournir les données de validation à l'aide d'un générateur :

datagen = ImageDataGenerator()
model.fit_generator(datagen.flow(X_train, Y_train, batch_size=32),
                nb_epoch=10,
                steps_per_epoch=len(X_train) / 32,
                class_weight=None,
                verbose=2,
                validation_data=datagen.flow(X_test, Y_test, batch_size=32),
                validation_steps=len(X_test) / 32,
                callbacks=[checkpointer])

Notez que j'ai mis à jour l'argument samples_per_epoch pour les plus récents steps_per_epoch.

0
répondu 4Oh4 2018-04-11 21:47:31