数据增强是数据预处理中的常用技巧。
例如使用图像增强技术来增加训练集的样本数量,从而提高模型的泛化能力。如以下代码所示:
train_gen = ImageDataGenerator(
zoom_range=0.1,#随机缩放图像的范围
rotation_range=10,#随机旋转图像的角度范围
rescale=1./255,#对输入图像进行缩放的因子
shear_range=0.1,#随机剪切图像的范围
horizontal_flip=True,#随机水平翻转图像的概率
width_shift_range=0.1,#随机水平平移图像的范围
height_shift_range=0.1,#随机垂直平移图像的范围
)
train_generator = train_gen.flow_from_dataframe(
dataframe=train_set,#train_set原始数据
x_col='train_image_path',
y_col='label',
target_size=(200,200),
class_mode='binary',
batch_size=128,
shuffle=False
)
print(len(train_generator))
Q1
:数据增强的对象?
A1
:通常情况下,数据增强是只针对训练集进行的,而验证集和测试集的数据不进行增强。
数据增强的主要目的是增加训练集的样本数量,从而提高模型的泛化能力和鲁棒性。在训练过程中,使用数据增强技术来生成更多的训练样本,并将其用于模型的训练。这样,模型就可以学习到更多的样本特征,从而提高其泛化能力和鲁棒性。
而验证集和测试集主要作用是评估模型的性能,如果对这些数据也进行增强,就会导致评估结果失真。此外,验证集和测试集的数据应该是从真实场景中抽样得到的,如果对其进行增强,就可能会导致模型在真实场景中的表现不如预期。
Q2
:数据增强时候设置的batchsize
和模型训练时中的batchsize
需要相等吗?
A2
:不需要相等,它们是独立的参数。
在使用 ImageDataGenerator
类时,我们可以通过设置 batch_size
参数来指定每个生成的批次中包含的样本数量,影响的是数据生成的速度。
而在使用 fit()
方法训练模型时,我们需要指定训练数据集的 batch_size
,以控制每个训练批次中包含的样本数量,影响的是训练速度。
Q3
:为什么说数据增强可以增加训练样本数量,而在执行完数据增强后没有将其与原始训练样本合并?
A3
:本质上是可以合并的,但是合并后的结果是一个静态的DataFrame
类型的对象,它包含了所有的图像数据和标签信息,需要一次性将所有的数据载入内存中。与train_generator
生成器相比,这种方法需要较多的内存空间,并且可能会降低模型训练速度。一般不采取合并这种方式,因为train_generator
就可以实现数据量扩增。
首先了解train_generator
生成器这个东西!该生成器负责在训练过程中动态地生成经过增强后的图像数据和标签信息。什么是动态呢?即train_generator
生成器在模型训练过程中才会发挥作用,伴随着每个epoch
的进行,会生成一批又一批的数据,不需要事先将所有数据载入内存中。
至于每个epoch
使用的训练集数量取决于设置的batchsize
(如50个)和step_per_epoch
(如100个),所以每个epoch
使用的训练集数量(即为5000个)一般会大于原始训练集数量(如1000个)。如果没有设置step_per_epoch
,则默认一个epoch
数据量和原始数据量相同。
Q4
:数据增强后的数量会大于原始数据集数量,所以一个epoch中的数据中有重复的吗?不同epoch的数据集一样吗?
A4
:不一定。第一个是因为对于单张图片,ImageDataGenerator
对象会随机选择一些变换操作,而不是对每个图片都执行所有变化操作。
第二个是因为在每个epoch
中,train_generator
生成器会动态地从原始训练集(train_set
)中生成新的训练样本,并将其用于模型训练。根据ImageDataGenerator
对象生成数据的随机性,每个epoch
中所生成的数据样本会不同,从而增加训练集的样本数量和多样性,提高模型的泛化能力。