使用 ImageDataGenerator 进行 Keras 数据增强(您的输入 运行 数据不足)
Keras Data Augmentation with ImageDataGenerator (Your input ran out of data)
我目前正在学习如何使用 F运行ç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)
事实上,imagedatagenerator 不会增加训练集的大小。所有的扩充都是在内存中完成的。因此原始图像被随机增强,然后返回其增强版本。如果您想查看增强图像,您需要为函数设置这些参数 flow_from_directory:
save_to_dir=path,
save_prefix="",
save_format="png",
现在你有 2000 张图像,批处理大小为 32,你将有 2000 // 32 = 62 steps per epoch,但你试图有 100 步导致错误。
如果你有一个不生成批次的数据集并且想使用所有数据点,那么你应该设置:
steps_per_epoch = len(train_dataset) // batch_size
但是当您使用 flow_from_directory
时,它会生成批次,因此无需设置 steps_per_epoch
除非您想使用比生成的批次更少的数据点。
我目前正在学习如何使用 F运行ç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)
事实上,imagedatagenerator 不会增加训练集的大小。所有的扩充都是在内存中完成的。因此原始图像被随机增强,然后返回其增强版本。如果您想查看增强图像,您需要为函数设置这些参数 flow_from_directory:
save_to_dir=path,
save_prefix="",
save_format="png",
现在你有 2000 张图像,批处理大小为 32,你将有 2000 // 32 = 62 steps per epoch,但你试图有 100 步导致错误。
如果你有一个不生成批次的数据集并且想使用所有数据点,那么你应该设置:
steps_per_epoch = len(train_dataset) // batch_size
但是当您使用 flow_from_directory
时,它会生成批次,因此无需设置 steps_per_epoch
除非您想使用比生成的批次更少的数据点。