Cum să utilizați în mod corect ImageDataGenerator în Keras?

0

Problema

Eu joc cu marirea de date în Keras în ultima vreme și eu sunt, folosind de bază ImageDataGenerator. Am învățat la fel de greu este de fapt un generator, nu iterator (pentru că type(train_aug_ds)<class 'keras.preprocessing.image.DirectoryIterator'> Am crezut că este un iterator). Am verificat, de asemenea, câteva bloguri despre folosesc, dar nu mi-au răspuns la toate întrebările mele.

Deci, am încărcat datele mele de genul asta:

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

Și pentru a instrui modelul meu am făcut următoarele:

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

Și a funcționat. Sunt un pic confuz, cum funcționează, pentru că train_aug_ds este generator, așa că ar trebui să dea infinit de mare de date. Și documentația spune:

Când trece un infinit de repetarea set de date, trebuie să specificați steps_per_epoch argument.

Ceea ce nu am făcut, totuși, funcționează. Nu cumva deduce numărul de pași? De asemenea, nu folosi doar augmentată de date, sau se utilizează, de asemenea, non-augmented imagini în lot?

Deci, practic, întrebarea mea este cum să utilizați acest generator corect cu funcția fit pentru a avea toate datele în formare, inclusiv originale, non-augmented imagini și imagini augmentată, și să ciclu prin ea de mai multe ori/etape (acum se pare că nu doar un singur pas pe epoci)?

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

Cel mai bun răspuns

1

Cred că documentația poate fi destul de confuz și îmi imaginez că comportamentul este diferit în funcție de Tensorflow și Keras versiune. De exemplu, în acest post, utilizatorul descrie exact acel comportament se așteaptă. În general, flow_from_directory() metodă vă permite să citiți imagini direct de la un director și de a le spori, în timp ce modelul dvs. este de a fi instruiți și după cum sa menționat deja aici, se reiterează pentru fiecare probă în fiecare folder în fiecare epocă. Folosind următorul exemplu, puteți să verificați că acesta este cazul (pe TF 2.7) uitandu-se la pașii pe epoca în bara de progres:

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

Daca ai folie flow_from_directory cu tf.data.Dataset.from_generator astfel:

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

Veți observa că bara de progres arată așa pentru că steps_per_epoch nu a fost definit în mod explicit:

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

Și dacă adăugați acest parametru, veți vedea pașii în bara de progres:

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

În cele din urmă, la întrebarea ta:

Cum să utilizați acest generator corect cu funcția de a se potrivi pentru a avea toate date în formare, inclusiv originale, non-augmented imagini și imagini augmentată, și să ciclu prin ea de mai multe ori/pas?

Puteți crește pur și simplu steps_per_epoch dincolo de number of samples // batch_size prin înmulțirea cu un factor de:

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

Acum, în loc de 58 de pași pe epoch aveți 116.

2021-11-23 17:22:32

În alte limbi

Această pagină este în alte limbi

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