2017-10-05 3 views
1

Je travaille actuellement avec un grand jeu de données d'image (~ 60 Go) pour former un CNN (Keras/Tensorflow) pour une tâche de classification simple. Les images sont des images vidéo, donc très corrélées dans le temps, donc j'ai déjà mélangé les données lors de la génération de l'énorme fichier .hdf5 ... Pour alimenter les données dans le CNN sans avoir à charger tout l'ensemble en mémoire J'ai écrit un générateur de lot simple (voir le code ci-dessous). Maintenant ma question: Habituellement, il est recommandé de mélanger les données après chaque époque d'entraînement droite? (pour des raisons de convergence SGD?) Mais pour cela, je devrais charger l'ensemble de données après chaque époque et le mélanger, ce qui est exactement ce que je voulais éviter d'utiliser le générateur de lot ... Alors: Est-ce vraiment important? mélanger l'ensemble de données après chaque époque et si oui, comment pourrais-je le faire aussi efficacement que possible? Voici le code actuel de mon générateur de lots:Big jeu de données HDF5, comment mélanger efficacement après chaque époque

def generate_batches_from_hdf5_file(hdf5_file, batch_size, dimensions, num_classes): 
""" 
Generator that returns batches of images ('xs') and labels ('ys') from a h5 file. 
""" 
filesize = len(hdf5_file['labels']) 

while 1: 
    # count how many entries we have read 
    n_entries = 0 
    # as long as we haven't read all entries from the file: keep reading 
    while n_entries < (filesize - batch_size): 
     # start the next batch at index 0 
     # create numpy arrays of input data (features) 
     xs = hdf5_file['images'][n_entries: n_entries + batch_size] 
     xs = np.reshape(xs, dimensions).astype('float32') 

     # and label info. Contains more than one label in my case, e.g. is_dog, is_cat, fur_color,... 
     y_values = hdf5_file['labels'][n_entries:n_entries + batch_size] 
     #ys = keras.utils.to_categorical(y_values, num_classes) 
     ys = to_categorical(y_values, num_classes) 

     # we have read one more batch from this file 
     n_entries += batch_size 
     yield (xs, ys) 
+2

Un aspect important pour la vitesse est de définir la taille de chuck dans votre fichier hdf5 à la taille de votre image. Cela améliore l'efficacité tout en obtenant des images individuelles du hdf5 –

Répondre

0

Ouais, améliore les performances depuis brassage des données en cours d'exécution dans le même ordre chaque fois peut vous rester coincé dans les zones sous-optimales.

Ne mélangez pas l'ensemble des données. Créez une liste d'index dans les données et mélangez-la à la place. Ensuite, déplacez-vous séquentiellement sur la liste d'index et utilisez ses valeurs pour sélectionner les données de l'ensemble de données.