如何正确使用ImageDataGenerator在Keras?

0

的问题

我玩增强的数据在Keras最近和我使用的基本ImageDataGenerator. 我学到的困难的方式,它实际上是一个发生器,不迭代(因为 type(train_aug_ds)<class 'keras.preprocessing.image.DirectoryIterator'> 我认为这是一个迭代). 我还检查了几个博客的关于使用它,但是他们没回答我的问题。

因此,我载我的数据这样的:

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

和我的火车模型的我做到如下:

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

和它的工作。 我有点困惑它是如何工作的,因为 train_aug_ds 是发电机,所以它应该得到无限大的数据集。 和文件说:

在经过一个无限地重复数据集,则必须指定steps_per_epoch的论点。

这不是我做的,但是,它的工作。 不以某种方式推断些步骤? 此外,不仅使用增强的数据,或者它还使用的非增强的图像在批?

所以基本上,我的问题是如何使用这种发电机正常功能 fit 所有数据在我的培训设置的,包括原始的非增强的图像和增强的图像,以及周期通过了好几次/步骤(现在看来这不只一个步骤每个划时代的)?

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

最好的答案

1

我认为该文件可以是相当令人困惑和我想象的行为是不同的,这取决于你的Tensorflow和Keras版本。 例如,在这个 职位,用户的描述的确切行为你期待。 通常, flow_from_directory() 方法可以读取图像直接从目录和增加他们的话你的模型是正在接受培训和如已经指出 ,这里,它迭代,每个样品的每个文件夹中的每一个时代。 使用下面的例子中,你可以检查这种情况(TF2.7)通过查看步骤每时代在进步栏:

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

如果你包裹 flow_from_directorytf.data.Dataset.from_generator 是这样的:

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

你会注意到取得的进展吧看起来像这样因为 steps_per_epoch 没有被明确地定义:

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

如果添加这种参数时,你会看到的步骤的进度条:

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

最后,对你的问题:

如何使用这种发电机正常功能适合所有 数据在我的培训设置的,包括原始的非增强的图像和 增强图像,以期通过几次/步骤?

你可以简单地增加 steps_per_epoch 超越 number of samples // batch_size 乘以一些因素:

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

现在,而不是58个划时代步骤每你有116个。

2021-11-23 17:22:32

其他语言

此页面有其他语言版本

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