【问题标题】:Does Keras' ImageDataGenerator randomly apply transformations to every image?Keras 的 ImageDataGenerator 是否对每张图像随机应用转换?
【发布时间】:2020-09-09 19:14:56
【问题描述】:

我正在使用 Keras ImageDataGenerator 类训练 CNN。我的代码看起来像:

from keras.callbacks import LearningRateScheduler
from keras.callbacks import EarlyStopping
from keras.preprocessing.image import ImageDataGenerator

    data_generator = ImageDataGenerator(
        rotation_range = 15,
        width_shift_range = 0.1,
        height_shift_range = 0.1,
        horizontal_flip = True
    )
    data_generator.fit(xtrain)

    es = EarlyStopping(monitor = 'val_loss', mode = 'min', verbose = 1, patience = 100)
    history = CNN_model.fit(data_generator.flow(xtrain, ytrain, batch_size = batch_size), \
                                                                          epochs = num_epochs, \
                                                                          validation_data = (xval, yval), \
                                                                          callbacks = [LearningRateScheduler(learning_rate_schedule), es])

现在我查看了文档,但我不完全了解它是对每批中的每张图像进行这种图像增强,还是随机选择其中的一部分?我假设它对每个图像都进行了增强,但我正在努力理解。

如果它对我的数据集中的每个图像都这样做,这意味着我在任何训练时期都没有使用未增强的图像,对吗?

谢谢!

【问题讨论】:

    标签: python python-3.x tensorflow keras conv-neural-network


    【解决方案1】:

    好吧,我做了测试,它是随机应用的每张图片,即使这些图片来自同一批次。

    根据我对文档的阅读,我没有理由认为只有一些图像被转换,而其他图像则保持原样。

    from tensorflow.keras.preprocessing.image import ImageDataGenerator
    from skimage.data import chelsea
    import matplotlib.pyplot as plt
    import numpy as np
    
    imgs = np.stack([chelsea() for i in range(4*4)], axis=0)
    
    data_gen = ImageDataGenerator(
        rotation_range = 90,
        width_shift_range = 0.1,
        height_shift_range = 0.1,
        horizontal_flip = True,
        preprocessing_function=lambda x: x[..., np.random.permutation([0, 1, 2])]
    )
    
    fig = plt.figure()
    plt.subplots_adjust(wspace=.2, hspace=.2)
    for index, image in enumerate(next(data_gen.flow(imgs)).astype(int)):
        ax = plt.subplot(4, 4, index + 1)
        ax.set_xticks([])
        ax.set_yticks([])
        ax.imshow(image)
    plt.show()
    

    【讨论】:

    • 这真是太好了。谢谢你的代码。所以我假设每个图像选择一个操作,还是可以同时应用多个操作?文档对随机语义不清楚。
    • 所有变换都是独立随机的。看看新的例子。
    • 是的。我想我现在看到了。所以我相信我的问题得到了回答。随机程度应用于提供的范围内(或使用布尔值的参数的二进制翻转),但现在确认每个操作都已应用,其程度是随机分量。
    猜你喜欢
    • 1970-01-01
    • 2018-02-26
    • 2020-09-12
    • 2019-08-03
    • 2019-12-16
    • 2018-02-24
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多