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)
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 –