【问题标题】:Keras Data Augmentation ParametersKeras 数据增强参数
【发布时间】:2017-05-01 16:03:12
【问题描述】:

我阅读了一些有关 Keras 数据增强的材料,但对我来说仍然有点模糊。是否有任何参数可以控制在数据增强步骤中从每个输入图像创建的图像数量?在this example 中,我看不到任何控制从每个图像创建的图像数量的参数。

例如,在下面的代码中,我可以有一个参数 (num_imgs) 用于控制从每个输入图像创建并存储在名为 preview 的文件夹中的图像数量;但在实时数据增强中,没有任何参数用于此目的。

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
num_imgs = 20
datagen = ImageDataGenerator(
        rotation_range=40,
        width_shift_range=0.2,
        height_shift_range=0.2,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True,
        fill_mode='nearest')

img = load_img('data/train/cats/cat.0.jpg')  # this is a PIL image
x = img_to_array(img)  # this is a Numpy array with shape (3, 150, 150)
x = x.reshape((1,) + x.shape)  # this is a Numpy array with shape (1, 3, 150, 150)

# the .flow() command below generates batches of randomly transformed images
# and saves the results to the `preview/` directory
i = 0
for batch in datagen.flow(x, batch_size=1,
                          save_to_dir='preview', save_prefix='cat', save_format='jpeg'):
    i += 1
    if i > num_imgs:
        break  # otherwise the generator would loop indefinitely

【问题讨论】:

    标签: python deep-learning theano keras


    【解决方案1】:

    这里基本上是这样工作的,它只为每个输入图像生成一个图像,在所有输入图像都生成一次之后,它会重新开始。

    在您的示例中,由于总共只有一个输入图像,因此它将重复生成该图像的不同版本,直到有 20 个。

    您可以在这里查看源代码https://github.com/fchollet/keras/blob/master/keras/preprocessing/image.py

    【讨论】:

      【解决方案2】:

      数据增强的工作原理如下:在每个学习时期,在指定范围内随机选择参数的变换应用于训练集中的所有原始图像。在一个 epoch 完成后,即在将学习算法暴露给整个训练数据集之后,下一个学习 epoch 开始,并通过对原始训练数据应用指定的转换再次增强训练数据。

      这样,每个图像被增强的次数等于学习 epoch 的数量。召回表格the example that you linked

      # Fit the model on the batches generated by datagen.flow().
      model.fit_generator(datagen.flow(X_train, Y_train,
                          batch_size=batch_size),
                          samples_per_epoch=X_train.shape[0],
                          nb_epoch=nb_epoch,
                          validation_data=(X_test, Y_test))
      

      这里datagen 对象会将训练集暴露给model nb_epoch 次,因此每个图像将被增强nb_epoch 次。通过这种方式,学习算法几乎不会看到两个完全相同的训练示例,因为在每个 epoch 训练示例都是随机变换的。

      【讨论】:

      • 感谢您的有用评论。因此,如果我总共有 1000 张图像,则在每个 epoch 中,会从原始图像生成 1000 张新图像并输入模型进行训练。然后,在下一个 epoch 中,从原始图像生成 1000 张新图像,并将其输入模型进行训练,依此类推。那么,模型有可能永远看不到原始数据,对吧?
      • 另一种方法是生成和存储新图像,然后使用它训练我们的模型。例如,如果我从每个输入图像生成 10 个图像,那么我将有 10,000 个新图像。因此,我总共将有 11,000 张图像用于训练。这些方法中哪一种更好?
      • 是的,你是对的,模型可能永远看不到原始数据。应用的转换越多,模型看到原始数据的可能性就越小。转换参数的范围也会影响该概率。您在第二条评论中建议的方法似乎也合理。很难说哪个更好,我会尝试两种选择并选择产生最佳结果的一种!
      • 只想补充一点,每张图片都会生成随机参数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-05
      • 2019-05-26
      • 2019-01-02
      • 1970-01-01
      相关资源
      最近更新 更多