2017-10-12 1 views
4

Je suis intéressé par l'utilisation de ImageDataGenerator dans Keras pour l'augmentation de données. Mais il faut que les répertoires de formation et de validation avec des sous-répertoires pour les classes soient introduits séparément comme ci-dessous (ceci est tiré de la documentation de Keras). J'ai un seul répertoire avec 2 sous-répertoires pour 2 classes (Data/Class1 et Data/Class2). Comment puis-je diviser au hasard ce dans des répertoires de formation et de validationDiviser le répertoire de données en répertoire de formation et de test avec structure de sous-répertoire préservée

train_datagen = ImageDataGenerator(
    rescale=1./255, 
    shear_range=0.2, 
    zoom_range=0.2, 
    horizontal_flip=True) 

    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) 

Je suis intéressé par réexécuter mon algorithme plusieurs fois avec la formation aléatoire et se divise de données de validation.

Répondre

1

Vous devrez soit copier manuellement certaines de vos données d'entraînement et les coller dans un répertoire de validation, soit créer un programme pour déplacer de manière aléatoire les données de votre répertoire de formation vers votre répertoire de validation. Avec l'une ou l'autre de ces options, vous devrez passer dans le répertoire de validation à votre validation ImageDataGenerator().flow_from_directory() comme chemin.

Les détails d'organisation de vos données dans la structure de répertoires sont traités dans this video.

+0

Merci pour votre réponse. Mais je n'ai pas vu validation_split comme paramètre dans fit_generator, et fit_generator est ce que je veux utiliser. C'est un paramètre dans la fonction fit. –

+0

Ah, vous avez raison. Je pensais que c'était un paramètre dans les deux fit() et fit_generator(), mais c'est seulement pour fit(). J'ai mis à jour ma réponse. Vous devrez créer manuellement ou par programmation la structure de votre répertoire pour les ensembles valides et les ensembles de trains, puis pointer vers ces répertoires séparés avec vos ImageDataGenerators pour chacun de ces ensembles. – blackHoleDetector

2

Malheureusement, il est impossible pour l'implémentation actuelle de keras.preprocessing.image.ImageDataGenerator (en date du 14 octobre 2017) mais comme c'est une fonctionnalité très demandée, je m'attends à ce qu'elle soit ajoutée dans un proche avenir.

Mais vous pouvez le faire en utilisant les opérations standard Python os. En fonction de la taille de votre ensemble de données, vous pouvez également essayer de charger d'abord toutes les images au RAM, puis utiliser une méthode classique fit qui pourrait diviser vos données de manière aléatoire.

+0

Merci à vous. J'ai été capable d'écrire une fonction pour créer ces bibliothèques. –

3

Merci les gars! J'ai été capable d'écrire ma propre fonction pour créer une formation et tester des ensembles de données. Voici le code pour quiconque regarde.

import os 
source1 = "/source_dir" 
dest11 = "/dest_dir" 
files = os.listdir(source1) 
import shutil 
import numpy as np 
for f in files: 
    if np.random.rand(1) < 0.2: 
     shutil.move(source1 + '/'+ f, dest11 + '/'+ f)