web-dev-qa-db-fra.com

ImageDataGenerator ajoute-t-il plus d'images à mon jeu de données?

J'essaie de faire une classification d'images avec le modèle Inception V3. ImageDataGenerator de Keras crée-t-il de nouvelles images qui sont ajoutées à mon jeu de données? Si j'ai 1000 images, est-ce que l'utilisation de cette fonction la doublera à 2000 images qui sont utilisées pour la formation? Existe-t-il un moyen de savoir combien d'images ont été créées et maintenant intégrées au modèle?

8
student17

Réponse courte: 1) Toutes les images originales sont juste transformées (rotation, zoom, etc.) à chaque époque puis utilisé pour la formation, et 2) [Par conséquent] le nombre d'images dans chaque époque est égal au nombre d'images originales que vous avez.

Réponse longue: Dans chaque époque, le ImageDataGenerator applique une transformation sur les images que vous avez et utilisez le images transformées pour la formation. L'ensemble des transformations comprend la rotation, le zoom, etc. En faisant cela, vous créez en quelque sorte de nouvelles données (c'est-à-dire aussi appelées augmentation des données), mais évidemment les images générées ne sont pas totalement différentes de l'original ceux. De cette façon, le modèle appris peut être plus robuste et précis car il est entraîné sur différentes variations de la même image.

Vous devez définir le steps_per_Epoch argument de la méthode fit à n_samples / batch_size, où n_samples est le nombre total de données d'entraînement dont vous disposez (c'est-à-dire 1000 dans votre cas). De cette façon, à chaque époque, chaque échantillon d'apprentissage est augmenté une seule fois et donc 1000 images transformées seront générées à chaque époque.

12
today

Comme il est officiellement écrit iciImageDataGenerator est un générateur de lots d'images de tenseurs avec augmentation de données en temps réel. Les données seront bouclées (par lots). Cela signifie que les transformations seront appliquées à la volée au lot d'images de manière aléatoire . Par exemple:

train_datagen = ImageDataGenerator(
    rescale=1./255, #scale images from integers 0-255 to floats 0-1.
    shear_range=0.2,
    zoom_range=0.2, # zoom in or out in images
    horizontal_flip=True) #horizontal flip of images

À chaque nouvelle époque, de nouvelles transformations aléatoires seront appliquées et de cette façon, nous nous entraînons avec des images un peu différentes à la fois. Obtenir plus de données n'est pas toujours réalisable ou possible, l'utilisation de ImageDataGenerator est utile de cette façon.

4
Ioannis Nasios

Tout dépend du nombre d'époques que vous exécutez, comme l'a répondu @today, l'ajustement du modèle avec le générateur fera que le générateur fournira autant d'images que nécessaire, en fonction de steps_per_Epoch.

Pour rendre les choses plus faciles à comprendre, mettez 20 images dans deux dossiers (imitant des données classifiées), créez un générateur à partir du dossier parent et exécutez une boucle for simple

count = 0
for image, label in my_test_generator:
    count += 1
    print(count)

La première chose que vous devez confirmer que vous voyez le message Found 20 images belonging to 2 classes., et la boucle elle-même ne s'arrêtera PAS après 20 itérations, mais elle continuera à augmenter et à imprimer sans fin (j'ai obtenu le mien à 10k et je l'ai arrêté manuellement). Le générateur fournira autant d'images que nécessaire, qu'elles aient été augmentées ou non.

2
Ognjen Mišić

Voici ma tentative de réponse car j'avais également cette question en tête.

ImageDataGenerator n'ajoutera PAS de nouvelles images à votre ensemble de données dans le sens où cela n'agrandira pas vos époques. Au lieu de cela, à chaque époque, il fournira des images légèrement modifiées (selon votre configuration). Il générera toujours de nouvelles images, peu importe le nombre d'époques dont vous disposez.

Ainsi, à chaque époque, le modèle s'entraînera sur des images différentes, mais pas sur des images différentes. Cela devrait empêcher le surapprentissage et simule en quelque sorte l'apprentissage en ligne.

Toutes ces modifications se produisent en mémoire, mais si vous voulez voir ces images, vous pouvez les enregistrer sur disque, les inspecter, voir à la maison bon nombre d'entre elles ont été générées et avoir une idée du fonctionnement de ImageDataGenerator. Pour ce faire, passez save_to_dir=/tmp/img-data-gen-outputs Pour fonctionner flow_from_directory. Voir docs .

1
Marko

Lorsque nous essayons de résoudre le problème de moins de données, n'est-ce pas une bonne idée d'augmenter l'ensemble de données en ajoutant des images augmentées?

https://medium.com/nanonets/how-to-use-deep-learning-when-you-have-limited-data-part-2-data-augmentation-c26971dc8ced

Prenez le lien ci-dessus pour référence où l'auteur a mentionné le pouvoir d'ajouter des images augmentées dans notre ensemble de données de formation.

Alors, que devons-nous faire, devrions-nous augmenter les images et save_to_dir et ensuite former le modèle ou devrions-nous simplement utiliser steps_per_Epoch = 2 * (n_samples/batch_size) et entraînez-vous à doubler la quantité de données par époque?

0
Sahil Singla

Notez également que: Ces images augmentées ne sont pas stockées dans la mémoire, elles sont générées à la volée pendant l'entraînement et perdues après l'entraînement. Vous ne pouvez pas relire ces images augmentées.

Ne pas stocker ces images est une bonne idée car nous manquerions de mémoire très bientôt en stockant un grand nombre d'images

0
krishna