1
votes

Comment éviter d'augmenter les données lors de la séparation de validation de Keras ImageDataGenerator?

J'utilise le générateur suivant:

datagen = ImageDataGenerator(
    fill_mode='nearest',
    cval=0,
    rescale=1. / 255,
    rotation_range=90,
    width_shift_range=0.1,
    height_shift_range=0.1,
    zoom_range=0.5,
    horizontal_flip=True,
    vertical_flip=True,
    validation_split = 0.5,
)

train_generator = datagen.flow_from_dataframe(
    dataframe=traindf,
    directory=train_path,
    x_col="id",
    y_col=classes,
    subset="training",
    batch_size=8,
    seed=123,
    shuffle=True,
    class_mode="other",
    target_size=(64,64))


STEP_SIZE_TRAIN = train_generator.n // train_generator.batch_size

valid_generator = datagen.flow_from_dataframe(
    dataframe=traindf,
    directory=train_path,
    x_col="id",
    y_col=classes,
    subset="validation",
    batch_size=8,
    seed=123,
    shuffle=True,
    class_mode="raw",
    target_size=(64, 64))

STEP_SIZE_VALID = valid_generator.n // valid_generator.batch_size

Maintenant, le problème est que les données de validation sont également augmentées, ce que je suppose que vous ne voudriez pas faire pendant l'entraînement. Comment éviter cela? Je n'ai pas deux répertoires pour la formation et la validation. Je souhaite utiliser une seule trame de données pour former le réseau. Aucune suggestion?


3 Réponses :


0
votes

Vous pouvez résoudre ce problème en modifiant légèrement votre code. Vous pouvez ajouter un autre objet ImageDataGenerator nommé test_datagen, dans lequel vous ne passerez que le paramètre rescale et aucune technique d'augmentation. Ainsi, les techniques d'augmentation seront dans un objet différent, pour vous son datagen. Vous devez également diviser votre répertoire de formation et de test avant de le passer pour former et tester les générateurs de données. Je vous donne un exemple de code à partir tensorflow, vous pouvez également consulter ce .

#For traning data
train_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)
#For testing data
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        'data/train',
        target_size=(150, 150),
        batch_size=32,
        class_mode='binary')
validation_generator = test_datagen.flow_from_directory(
        'data/validation',
        target_size=(150, 150),
        batch_size=32,
        class_mode='binary')
model.fit_generator(
        train_generator,
        steps_per_epoch=2000,
        epochs=50,
        validation_data=validation_generator,
        validation_steps=800)


1 commentaires

Je ne peux pas utiliser le flux depuis le répertoire ... J'ai un dataframe :(



1
votes

La solution que mon ami a trouvée consistait à utiliser un générateur différent mais avec le même partage de validation et aucun mélange.

train_generator = datagen.flow_from_dataframe(
    dataframe=traindf,
    directory=train_path,
    x_col="id",
    y_col=classes,
    subset="training",
    batch_size=64,
    seed=123,
    shuffle=False,
    class_mode="raw",
    target_size=(224,224))


STEP_SIZE_TRAIN = train_generator.n // train_generator.batch_size

valid_generator = valid_datagen.flow_from_dataframe(
    dataframe=traindf,
    directory=train_path,
    x_col="id",
    y_col=classes,
    subset="validation",
    batch_size=64,
    seed=123,
    shuffle=False,
    class_mode="raw",
    target_size=(224, 224))

STEP_SIZE_VALID = valid_generator.n // valid_generator.batch_size

puis vous pouvez définir les deux générateurs comme

datagen = ImageDataGenerator(
    #featurewise_center=True,
    #featurewise_std_normalization=True,
    rescale=1. / 255,
    rotation_range=90,
    width_shift_range=0.1,
    height_shift_range=0.1,
    zoom_range=0.5,
    horizontal_flip=True,
    vertical_flip=True,
    validation_split = 0.15,
)

valid_datagen=ImageDataGenerator(rescale=1./255,validation_split=0.15)


0 commentaires

0
votes

Vous devriez voir la réponse à cette question connexe: Lors de l'utilisation de l'augmentation des données, est-il possible de valider uniquement avec les images d'origine?

Il dit d'utiliser ImageDataGenerator avec des paramètres vides lors du chargement des données de validation , tels que:

train_gen = ImageDataGenerator(aug_params).flow_from_directory(train_dir)
valid_gen = ImageDataGenerator().flow_from_directory(valid_dir)

model.fit_generator(train_gen, validation_data=valid_gen)


0 commentaires