使用 ImageDataGenerator 进行 Keras 数据增强(您的输入没有数据)
Posted
技术标签:
【中文标题】使用 ImageDataGenerator 进行 Keras 数据增强(您的输入没有数据)【英文标题】:Keras Data Augmentation with ImageDataGenerator (Your input ran out of data) 【发布时间】:2021-04-16 02:32:33 【问题描述】:我目前正在学习如何使用 François Chollet 的“Deep learning with Keras”中的 Keras ImageDataGenerator 执行数据增强。
我现在在训练数据集中有 1000 张(狗)和 1000 张(猫)图像。
我在验证数据集中还有 500(狗)和 500(猫)图像。
本书将生成器中的训练和验证数据的批量大小定义为 32,以便在拟合模型时使用“step_per_epoch”和“epoch”执行数据增强。
Hpwever,当我训练模型时,我收到了 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】:事实上,imagedatagenerator 不会增加训练集的大小。所有的扩充都是在内存中完成的。因此,原始图像被随机增强,然后返回其增强版本。如果您想查看增强图像,您需要为函数 flow_from_directory 设置这些参数:
save_to_dir=path,
save_prefix="",
save_format="png",
现在您有 2000 张图像,批量大小为 32,每个 epoch 将有 2000 // 32 = 62 个步骤,但您尝试有 100 个步骤会导致错误。
如果你有一个不生成批次的数据集并且想要使用所有数据点,那么你应该设置:
steps_per_epoch = len(train_dataset) // batch_size
但是当你使用flow_from_directory
时,它会生成批次,所以不需要设置steps_per_epoch
,除非你想使用比生成的批次少的数据点。
【讨论】:
感谢您的回答。 “所有增强都在内存中完成”,代码没有指定生成(增强)多少新图像。那么我怎么知道还有多少图像用于训练呢?还是我不需要知道-->都是随机完成的? @kelvin.aaa2 Keras 的 imagedatagenerator 接受一批用于训练的图像。获取批次,然后对批次中的每个图像应用一系列随机转换(无论您想要什么作为增强)。然后关键部分是:它将原始批次替换为新的、随机转换的批次。训练是在这个随机转换的批次上完成的。以上是关于使用 ImageDataGenerator 进行 Keras 数据增强(您的输入没有数据)的主要内容,如果未能解决你的问题,请参考以下文章
使用 ImageDataGenerator 进行多类分割时训练 U-Net 的问题
如何从大型 .h5 数据集中批量读取数据,使用 ImageDataGenerator 和 model.fit 进行预处理,所有这些都不会耗尽内存?
Keras ImageDataGenerator 不处理符号链接文件