关于Keras中ImageDataGenerator类的两个问题

时间:2018-04-15 16:47:10

标签: python image-processing keras

关于“深度学习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参数通过构造函数和其他一些参数传递,例如{{1}通过target_size函数传递?为什么不通过构造函数或flow_from_drictory函数传递所有这些?

1 个答案:

答案 0 :(得分:1)

  1. 将单独的生成器用于培训和验证的原因是因为您在两种情况下对数据的处理方式不同。例如,在处理批量图像时,在训练期间,您需要在每个时期内对图像进行随机播放,以使您的模型不会过度适应训练数据。而在测试或验证期间不需要它。此外,您可以在训练时执行特殊的数据增强技术(如缩放,移位,旋转),以提升您的训练数据并使模型更加健壮。在验证训练模型时,您无需执行任何此类操作。因此,为了在生成批次时适应这些差异,建议您使用单独的生成器进行培训和验证。
  2. ImageDataGenerator 是Keras中Image preprocessing。它用于通过实时数据增强生成批量数据。 rescale是其中一个参数,而您提到的其他参数(例如,batch_sizetarget_size)不属于它的参数列表。这些列在 flow_from_directory 下,它是Image preprocessing函数。此函数使用 ImageDataGenerator 作为基类。您可以在Keras documentation中找到有关各种函数及其相应的参数列表的更多详细信息,以进行图像预处理。
  3. 希望这有帮助!

    修改

    这种选择背后的理由是什么?

    如果您查看source code,您会注意到重新缩放规范化轮换等操作,ETC是特定于图像的操作。因此,它们被提及为基类( ImageDataGenerator )本身的参数。默认情况下,它下面定义的所有函数都会继承它们。然而,诸如文件夹路径批量大小颜色模式 shuffling 等参数,ETC是数据加载特定参数。因此,它们需要由数据加载器(从文件夹读取图像)功能来处理,这些功能是 flow_from_directory flow 。加载图像后,它们将在基类中进行指定为参数的操作。因此可以选择参数列表。