Jak správně používat ImageDataGenerator v Keras?

0

Otázka

Já jsem si hrála s doplňováním údajů v Keras v poslední době a já jsem s použitím základní ImageDataGenerator. Naučil jsem se tvrdě, jak je to vlastně generátor, není iterator (protože type(train_aug_ds) dává <class 'keras.preprocessing.image.DirectoryIterator'> Myslel jsem, že to je iterátor). Také jsem četla pár blogů o jeho použití, ale oni nemají odpověď na všechny mé otázky.

Tak jsem nahrál svoje data, jako je tento:

train_aug = ImageDataGenerator(
    rescale=1./255,
    horizontal_flip=True,
    height_shift_range=0.1,
    width_shift_range=0.1,
    brightness_range=(0.5,1.5),
    zoom_range = [1, 1.5],
)
train_aug_ds = train_aug.flow_from_directory(
    directory='./train',
    target_size=image_size,
    batch_size=batch_size,
)

A trénovat svůj model jsem udělal následující:

model.fit(
    train_aug_ds,
    epochs=150,
    validation_data=(valid_aug_ds,),
)

A ono to fungovalo. Jsem trochu zmatená, jak to funguje, protože train_aug_ds je generátor, takže by to mělo dát nekonečně velký dataset. A dokumentace říká:

Při průchodu nekonečně opakovat datového souboru, musíte zadat steps_per_epoch argument.

Což jsem neudělal, ale přesto, to funguje. Má to nějak odvodit počet kroků? Také, není to jen rozšířená data, nebo to také používá non-rozšířená obrázků v dávkovém?

Takže v podstatě, moje otázka je, jak používat tento generátor správně s funkcí fit mít všechna data v mém sadu školení, včetně původní, non-rozšířená obrázky a rozšířené snímků, a procházet několikrát/kroky (teď to vypadá, že to dělá jen jeden krok za epochy)?

keras python tensorflow
2021-11-23 11:26:56
1

Nejlepší odpověď

1

Myslím, že dokumentace může být docela matoucí a já jsem si představit, je různé chování v závislosti na vašem Tensorflow a Keras verze. Například, v tomto příspěvku, je uživatel popisující přesně chování, které očekáváte. Obecně platí, že flow_from_directory() metoda umožňuje číst obrázky přímo z adresáře a rozšířit je, když váš model je vyškolen a jak již bylo uvedeno zde, to se opakuje pro každý vzorek v každé složce v každé době. Pomocí následujícího příkladu si můžete ověřit, že je to tento případ (na TF 2.7) při pohledu na kroky za epochu v progress bar:

import tensorflow as tf

BATCH_SIZE = 64

flowers = tf.keras.utils.get_file(
    'flower_photos',
    'https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz',
    untar=True)

img_gen = tf.keras.preprocessing.image.ImageDataGenerator(
    rescale=1./255,
    horizontal_flip=True,
)

train_ds = img_gen.flow_from_directory(flowers, batch_size=BATCH_SIZE, shuffle=True, class_mode='sparse')
num_classes = 5

model = tf.keras.Sequential([
  tf.keras.layers.Conv2D(16, 3, padding='same', activation='relu', input_shape=(256, 256, 3)),
  tf.keras.layers.MaxPooling2D(),
  tf.keras.layers.Conv2D(32, 3, padding='same', activation='relu'),
  tf.keras.layers.MaxPooling2D(),
  tf.keras.layers.Conv2D(64, 3, padding='same', activation='relu'),
  tf.keras.layers.MaxPooling2D(),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dense(num_classes)
])

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True))

epochs=10
history = model.fit(
  train_ds,
  epochs=epochs
)
Found 3670 images belonging to 5 classes.
Epoch 1/10
 6/58 [==>...........................] - ETA: 3:02 - loss: 2.0608

Pokud se vám zábal flow_from_directory s tf.data.Dataset.from_generator takhle:

train_ds = tf.data.Dataset.from_generator(
    lambda: img_gen.flow_from_directory(flowers, batch_size=BATCH_SIZE, shuffle=True, class_mode='sparse'),
    output_types=(tf.float32, tf.float32))

Můžete si všimnout, že progress bar vypadá takhle, protože steps_per_epoch nebyla explicitně definována:

Epoch 1/10
Found 3670 images belonging to 5 classes.
     29/Unknown - 104s 4s/step - loss: 2.0364

A pokud přidáte tento parametr, budete vidět kroky v progress bar:

history = model.fit(
  train_ds,
  steps_per_epoch = len(from_directory),
  epochs=epochs
)
Found 3670 images belonging to 5 classes.
Epoch 1/10
 3/58 [>.............................] - ETA: 3:19 - loss: 4.1357

Konečně, na vaši otázku:

Jak používat tento generátor správně s funkcí vhodný na všechny data v mém sadu školení, včetně původní, non-obrázky a rozšířené rozšířená snímků, a procházet několikrát/krok?

Můžete jednoduše zvýšit steps_per_epoch mimo number of samples // batch_size vynásobením nějaký faktor:

history = model.fit(
  train_ds,
  steps_per_epoch = len(from_directory)*2,
  epochs=epochs
)
Found 3670 images belonging to 5 classes.
Epoch 1/10
  1/116 [..............................] - ETA: 12:11 - loss: 1.5885

Nyní místo 58 kroků za epochy máte 116.

2021-11-23 17:22:32

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................