使用 ImageDataGenerator 进行 Keras 数据增强您的输入数据不足

问题描述

我目前正在从 François Chollet 的“Deep learning with Keras”学习如何使用 Keras ImageDataGenerator 执行数据增强。

我现在在训练数据集中有 1000 个(狗)和 1000 个(猫)图像。

我在验证数据集中也有 500(狗)和 500(猫)图像。

该书将生成器中的训练和验证数据的批量大小定义为 32,以在拟合模型时使用“step_per_epoch”和“epoch”执行数据增强。

不过,当我训练模型时,我收到了 Tensorflow 警告,“您的输入用完了数据...”并停止了训练过程。

我在网上搜索了很多解决方案提到step_per_epoch应该是, steps_per_epoch = len(train_dataset) // batch_size & steps_per_epoch = len(validation_dataset) // batch_size

我理解上面的逻辑,训练中没有警告。

但我想知道,原来我有 2000 个训练样本。这太少了,所以我需要执行数据增强来增加训练图像的数量。 如果应用了 steps_per_epoch = len(train_dataset) // batch_size,因为 len(train_dataset) 只有 2000 个。不是说我还在使用 2000 个样本来训练模型,而不是向模型添加更多的增强图像吗?

train_datagen = ImageDataGenerator(
rescale=1./255,rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,)

test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
train_dir,target_size=(150,150),batch_size=32,class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
validation_dir,class_mode='binary')

history = model.fit_generator(
train_generator,steps_per_epoch=100,epochs=100,validation_data=validation_generator,validation_steps=50)

解决方法

事实上,imagedatagenerator 不会增加训练集的大小。所有的扩充都是在内存中完成的。所以原始图像被随机增强,然后它的增强版本被返回。如果您想查看增强图像,您需要为函数 flow_from_directory 设置这些参数:

save_to_dir=path,save_prefix="",save_format="png",

现在你有 2000 张图像,批量大小为 32,你将有 2000 // 32 = 62 步每个时期,但你试图有 100 步导致错误。

如果您有一个不生成批次的数据集并且想要使用所有数据点,那么您应该设置:

steps_per_epoch = len(train_dataset) // batch_size

但是当您使用 flow_from_directory 时,它会生成批次,因此无需设置 steps_per_epoch,除非您希望使用的数据点少于生成的批次。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...