Imagedatagenerator'ı Keras'ta doğru şekilde nasıl kullanabilirim?

0

Soru

Son zamanlarda Keras'ta veri büyütme ile oynuyorum ve temel ImageDataGenerator kullanıyorum. Aslında bir yineleyici değil, bir jeneratör olduğunu zor yoldan öğrendim (çünkü type(train_aug_ds) verir <class 'keras.preprocessing.image.DirectoryIterator'> Bunun bir yineleyici olduğunu düşündüm). Ayrıca kullanmayla ilgili birkaç blogu da kontrol ettim, ancak tüm sorularıma cevap vermiyorlar.

Bu yüzden verilerimi şöyle yükledim:

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

Ve modelimi eğitmek için aşağıdakileri yaptım:

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

Ve işe yaradı. Nasıl çalıştığını biraz kafam karıştı, çünkü train_aug_ds jeneratör, bu yüzden sonsuz büyük veri kümesi vermelidir. Ve belgeler diyor ki::

Sonsuz yinelenen bir veri kümesini geçirirken, steps_per_epoch bağımsız değişkenini belirtmeniz gerekir.

Ki henüz yapmadım, işe yarıyor. Bir şekilde adım sayısını çıkartıyor mu? Ayrıca, yalnızca artırılmış veriler mi kullanıyor yoksa toplu halde artırılmamış görüntüler de mi kullanıyor?

Temel olarak sorum, bu jeneratörü işlevle doğru şekilde nasıl kullanacağımızdır fit orijinal, artırılmamış görüntüler ve artırılmış görüntüler de dahil olmak üzere eğitim setimdeki tüm verilere sahip olmak ve birkaç kez/adımda geçiş yapmak (şu anda her dönem için yalnızca bir adım atıyor gibi görünüyor)?

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

En iyi cevabı

1

Dokümantasyonun oldukça kafa karıştırıcı olabileceğini düşünüyorum ve davranışın Tensorflow ve Keras sürümünüze bağlı olarak farklı olduğunu hayal ediyorum. Örneğin, bu gönderide, kullanıcı beklediğiniz davranışı tam olarak açıklamaktadır. Genellikle, flow_from_directory() yöntem, görüntüleri doğrudan bir dizinden okumanıza ve modeliniz eğitilirken bunları artırmanıza olanak tanır ve burada daha önce de belirtildiği gibi, her klasördeki her örnek için her dönem yinelenir. Aşağıdaki örneği kullanarak, ilerleme çubuğundaki dönem başına adımlara bakarak durumun böyle olup olmadığını (TF 2.7'de) kontrol edebilirsiniz:

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

Eğer sararsan flow_from_directory ile tf.data.Dataset.from_generator bunun gibi:

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

İlerleme çubuğunun şöyle göründüğünü fark edeceksiniz çünkü steps_per_epoch açıkça tanımlanmadı:

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

Ve bu parametreyi eklerseniz, ilerleme çubuğundaki adımları göreceksiniz:

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

Son olarak, sorunuza:

Düzgün fit ile tüm bu jeneratör kullanma orijinal, artırılmamış görüntüler dahil olmak üzere eğitim setimdeki veriler ve artırılmış görüntüler ve birkaç kez/adımda geçiş yapmak için?

Sadece artırabilir steps_per_epoch ötesinde number of samples // batch_size bazı faktörlerle çarparak:

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

Şimdi, dönem başına 58 adım yerine 116'ya sahipsiniz.

2021-11-23 17:22:32

Diğer dillerde

Bu sayfa diğer dillerde

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