Jak prawidłowo używać ImageDataGenerator w Keras?

0

Pytanie

Ostatnio gram wraz ze wzrostem danych w Keras i używam podstawowy ImageDataGenerator. Ja na własnej skórze przekonałem się, że faktycznie jest to alternator, a nie iterator (bo type(train_aug_ds) daje <class 'keras.preprocessing.image.DirectoryIterator'> Myślałem, że to iterator). Ja też sprawdziłem kilka blogów o jego użyciu, ale nie odpowiadają na wszystkie moje pytania.

Więc wysłałem swoje dane w następujący sposób:

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 aby szkolić swój model, zrobiłem następujący:

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

I to zadziałało. Jestem trochę zakłopotany tym, jak to działa, bo train_aug_ds jest generatorem, więc powinien dawać nieskończenie duży zestaw danych. W dokumentacji jest napisane:

Podczas biegu nieskończenie cyklicznego zestawu danych należy podać argument steps_per_epoch.

Czego ja nie robiłem, ale to działa. Czy to w jakiś sposób wniosek o liczbie kroków? Poza tym, czy używa tylko uzupełnione dane lub wykorzystuje również nie uzupełnione obrazu w trybie wsadowym?

Tak więc, w zasadzie, moje pytanie polega na tym, jak prawidłowo używać ten alternator z funkcją fit mieć wszystkie dane w moim rozdziale nauki pisania, w tym oryginalne, nie uzupełnione o zdjęcia i uzupełnione o zdjęcia i wyświetlać je kilka razy/kroków (teraz wydaje się, że on robi tylko jeden krok po dobie)?

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

Najlepsza odpowiedź

1

Myślę, że dokumentacja może być dość mylące, i przypuszczam, że zachowanie różni się w zależności od wersji Tensorflow i Keras. Na przykład w tym poście użytkownik opisuje dokładnie to zachowanie, którego można się spodziewać. Jak zwykle, w flow_from_directory() metoda umożliwia zapis obrazu bezpośrednio z katalogu i uzupełniać je podczas nauki danego modelu, i, jak już wspomniano tu, że powtarza się dla każdej próbki w każdym folderze w każdej epoce. Wykorzystując poniższy przykład, możesz upewnić się, że to tak (na TF 2.7), patrząc na kroki w dobie wskaźniku wykonania:

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

Jeśli przechowała flow_from_directory z tf.data.Dataset.from_generator podobny do tego:

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

Można zauważyć, że wskaźnik postępu wygląda tak, bo steps_per_epoch nie było jasno określone:

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

A jeśli dodać ten parametr, można zobaczyć kroki w wierszu wykonania:

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

Wreszcie, na twoje pytanie:

Jak prawidłowo używać ten alternator z funkcją, odpowiednie do tego, aby mieć wszystko dane w moim rozdziale nauki pisania, w tym oryginalne, nie uzupełnione o zdjęcia i uzupełnione o zdjęcia i wyświetlać je kilka razy/krok?

Możesz po prostu zwiększyć steps_per_epoch za number of samples // batch_size przez pomnożenie przez jakiś współczynnik:

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

Teraz zamiast 58 kroków za epoce masz 116.

2021-11-23 17:22:32

W innych językach

Ta strona jest w innych językach

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