【问题标题】:Two questions about ImageDataGenerator class in Keras关于 Keras 中 ImageDataGenerator 类的两个问题
【发布时间】:2018-04-15 16:47:09
【问题描述】:

关于“使用 Python 进行深度学习”的以下代码,我有两个问题:

from keras.preprocessing.image import ImageDataGenerator 

train_datagen = ImageDataGenerator(rescale=1./255) 
test_datagen = ImageDataGenerator(rescale=1./255) 
train_generator = train_datagen.flow_from_directory(
            train_dir, target_size=(150, 150) batch_size=20, class_mode='binary') 
validation_generator = test_datagen.flow_from_directory(
            validation_dir, target_size=(150, 150),batch_size=20, class_mode='binary')

1) 为什么要为测试数据定义一个新的生成器?为什么不直接使用train_datagen 对象两次,一次用于train_dir,一次用于validation_dir?

2) 为什么ImageDataGenerator 构造函数和flow_from_directory 函数的定义是这样的:rescale 参数通过构造函数传递,而其他一些参数(例如target_size)通过flow_from_drictory 传递功能?为什么不通过构造函数或flow_from_directory 函数将它们全部传递?

【问题讨论】:

    标签: python image-processing keras


    【解决方案1】:
    1. 使用单独的生成器 进行训练和验证的原因是您在这两种情况下对数据的处理方式不同。例如,在处理批量图像时,在训练期间,您需要在每个 epoch 期间打乱图像,以使您的模型不会过度拟合训练数据。而在测试或验证期间不需要它。此外,您可以在训练时执行特殊的数据增强技术(如缩放、移动、旋转),以增强您的训练数据并使模型更加稳健。在验证经过训练的模型时,您无需执行任何此类操作。因此,为了在生成批次时适应这些差异,建议使用单独的生成器进行训练和验证。
    2. ImageDataGenerator 是 Keras 中 Image preprocessing 的一个。它用于通过实时数据增强生成批量数据。 rescale 是它的参数之一,而您提到的其他参数(例如,batch_sizetarget_size)不属于它的参数列表。这些都列在 flow_from_directory 下,这是Image preprocessing 的一个函数。该函数使用 ImageDataGenerator 作为基类。您可以在Keras documentation 中找到有关各种函数及其对应参数列表的更多详细信息,以进行图像预处理。

    希望这会有所帮助!

    编辑

    选择这种论点的理由是什么?

    如果您查看source code,您会注意到诸如重新缩放归一化旋转之类的操作, ETC 是图像特定的操作。因此,它们被称为基类 (ImageDataGenerator) 本身的参数。它下定义的所有函数都默认继承这些函数。而文件夹路径批量大小颜色模式洗牌、ETC等参数是数据加载特定参数.因此,它们需要由 flow_from_directoryflow 的数据加载器(从文件夹中读取图像)函数来处理。加载图像后,它们将执行基类中指定为参数的操作。因此选择了这样的参数列表。

    【讨论】:

    • 感谢您的回复。第一个答案是完美的。关于第二个问题,我的问题是“这种参数选择背后的基本原理是什么。为什么 keras 的作者选择 rescale 作为构造函数的参数,而其他人作为 flow_from_directory 参数?”
    • 我认为target_size 也是一个特定于图像的属性,例如rescale。但是,一个在构造函数中定义,另一个在函数中定义。
    • 是的,正确!在更高的层面上,rescaletarget_size 似乎都执行图像大小调整。但是您需要查看的是它执行的实用程序。如果您仔细阅读源代码(我没有将源代码中的所有相关行都放在源代码中,因为它会造成不必要的混乱),您会注意到target_size 类似于需要加载的图像大小。这是在加载程序本身执行的操作。而resize 是在其之上执行的操作(如果提供),以执行图像特定(如数据增强)操作。
    • This is target_shape 的相关实用程序。它在加载图像本身时使用。它加载target_size 维图像。而resize 是一个附加参数,它在它之上执行(可能会或可能不会)并被standardize 函数(here)使用。执行所有规范化操作的函数。
    猜你喜欢
    • 2011-08-06
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 2017-10-25
    • 2020-01-18
    • 2019-05-29
    • 2017-04-25
    • 1970-01-01
    相关资源
    最近更新 更多