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

时间:2021-01-11 05:53:29

标签: tensorflow image-processing keras deep-learning data-augmentation

我目前正在从 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,
target_size=(150, 150),
batch_size=32,
class_mode='binary')

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

1 个答案:

答案 0 :(得分:1)

事实上,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,除非您希望使用的数据点少于生成的批次。