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:
- Définir votre augmentation de données
- Fit l'augmentation
- Configurez votre générateur en utilisant
flow_from_directory()
- 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 ...
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. –
@MarioKreutzfeldt vous avez raison - voir mise à jour – desertnaut
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! –