2017-10-12 4 views
2

Je souhaite utiliser Augmentation d'image dans Keras. Mon code actuel ressemble à ceci:Keras: Adapter les augmentations Image aux données d'apprentissage en utilisant flow_from_directory

# define image augmentations 
train_datagen = ImageDataGenerator(
featurewise_center=True, 
featurewise_std_normalization=True, 
zca_whitening=True) 

# generate image batches from directory 
train_datagen.flow_from_directory(train_dir) 

Quand je lance un modèle avec cela, je reçois l'erreur suivante:

"ImageDataGenerator specifies `featurewise_std_normalization`, but it hasn't been fit on any training data." 

Mais je ne trouve pas des informations claires sur la façon d'utiliser train_dataget.fit() avec flow_from_directory.

Nous vous remercions de votre aide. Mario

Répondre

3

Vous avez raison, la docs ne sont pas très éclairant sur ce ...

Qu'est-ce que vous avez besoin est en fait un processus en 4 étapes:

  1. Définir votre augmentation de données
  2. Fit l'augmentation
  3. Configurez votre générateur en utilisant flow_from_directory()
  4. Entraînez votre modèle avec fit_generator()

Voici le code nécessaire pour un cas de classification d'image hypothétique:

# define data augmentation configuration 
train_datagen = ImageDataGenerator(featurewise_center=True, 
            featurewise_std_normalization=True, 
            zca_whitening=True) 

# fit the data augmentation 
train_datagen.fit(x_train) 

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

# train model 
model.fit_generator(
    train_generator, 
    steps_per_epoch=nb_train_samples, 
    epochs=epochs, 
    validation_data=validation_generator, # optional - if used needs to be defined 
    validation_steps=nb_validation_samples) 

De toute évidence, il y a plusieurs paramètres à définir (train_data_dir, nb_train_samples etc), mais nous espérons que vous avez l'idée . Si vous devez également utiliser un validation_generator, comme dans mon exemple, cela doit être défini de la même manière que votre train_generator.

MISE À JOUR (après commentaire)

Étape 2 a besoin d'une discussion; ici, x_train sont les données réelles qui, idéalement, devraient tenir dans la mémoire principale. Aussi (documentation), cette étape est

Only required if featurewise_center or featurewise_std_normalization or zca_whitening.

Cependant, il existe de nombreux cas réels où l'exigence que toutes les données de formation intègrent dans la mémoire est clairement irréaliste. Comment centrer/normaliser/données blanches dans de tels cas est un (énorme) sous-domaine en soi, et sans doute la raison principale de l'existence de grands cadres de traitement de données tels que Spark.

Alors, que faire en pratique ici?Eh bien, l'action logique suivante dans un tel cas est de échantillon vos données; En effet, c'est exactement ce que la communauté conseille - ici est le créateur Keras François Chollet sur Working with large datasets like Imagenet:

datagen.fit(X_sample) # let's say X_sample is a small-ish but statistically representative sample of your data 

Et une autre citation d'un ongoing open discussion sur l'extension ImageDataGenerator (italique ajouté):

fit is required for feature-wise standardization and ZCA , and it only takes an array as parameter, there is no fit for directory. For now, we need to manually read a subset of the image to do this fit for a directory. One idea is we can change fit() to accept the generator itself(flow_from_directory), of course, standardization should be disabled during fit.

Hope this helps ...

+0

Merci desertnaut. Thant est comment je l'ai mis en place. Mais c'est exactement le point 2 que je ne comprends pas. Comment définir x_train dans train_datagen.fit (x_train)? Il n'utilisera pas mon fichier training_folder comme entrée, et je ne peux pas créer un tableau numpy à partir de toutes les images en raison de restrictions de mémoire. –

+0

@MarioKreutzfeldt vous avez raison - voir mise à jour – desertnaut

+1

c'était vraiment utile! Des choses comme celle-ci rendent difficile l'utilisation de keras en tant que débutant. même livre de chollets n'est pas si clair sur cette question! –