数据增强是指通过对原始数据集进行一系列变换操作来生成新的训练样本,从而扩充数据集的方法。数据增强通常用于解决数据不足的问题,提高模型的泛化能力,减少过拟合。数据增强通常在训练模型之前应用。
以下是一些情况下可以考虑使用数据增强的建议:
-
数据不足:当训练数据集相对较小时,数据增强可以帮助模型更好地学习到数据的特征,提高模型的泛化能力。
-
类别不平衡:在类别不平衡的情况下,数据增强可以通过生成新的样本来平衡各个类别之间的数据分布,有助于提高模型对少数类别的识别能力。
-
增强模型的鲁棒性:通过引入各种变换,如旋转、翻转、缩放、裁剪、亮度调整等,可以使模型更具鲁棒性,减少对输入数据微小变化的敏感度。
-
防止过拟合:数据增强可以有效减少过拟合的风险,通过引入噪声和变化,使模型更难以记住训练数据的细节,从而提高其泛化能力。
在实际应用中,数据增强通常在训练阶段进行,以下是一些常见的数据增强方法:
-
几何变换:包括平移、旋转、缩放、剪切、翻转等操作,可以通过这些操作改变图像的角度、大小和位置。
-
色彩变换:如亮度、对比度、饱和度、色调的调整,可以增加模型对不同光照和色彩条件的适应能力。
-
增加噪声:添加高斯噪声、椒盐噪声等,可以使模型更鲁棒。
-
随机裁剪:随机裁剪图像的一部分,可以增加模型对不同尺度和位置的物体的识别能力。
-
混合样本:将不同样本进行混合,生成新的训练样本。
数据增强的一些函数
-
PyTorch:
transforms.Compose()
:将多个数据增强操作组合在一起。transforms.RandomHorizontalFlip()
:随机水平翻转图像。transforms.RandomRotation()
:随机旋转图像。transforms.ColorJitter()
:随机调整图像的亮度、对比度和饱和度等。transforms.RandomCrop()
:随机裁剪图像。
-
TensorFlow:
tf.image.random_flip_left_right()
:随机水平翻转图像。tf.image.random_brightness()
:随机调整图像的亮度。tf.image.random_contrast()
:随机调整图像的对比度。tf.image.random_crop()
:随机裁剪图像。
-
Keras:
ImageDataGenerator
类:提供了多种数据增强选项,如水平翻转、旋转、缩放等。ImageDataGenerator.flow_from_directory()
:从文件夹中读取图像数据并应用数据增强。
举个例子,我要做数字识别器,为了避免过拟合,需要对手写数字数据集进行人工扩充,它可以让我现有的数据集变得更大,一些常用增强是灰度、水平翻转、垂直翻转、随机裁剪、颜色抖动、平移、旋转还有缩放等等。
通过数据增强可以轻松地将训练集的数量增加一倍或多倍,从而可以创建一个非常健壮的模型
# 增加数据以防止过拟合
datagen = ImageDataGenerator(
featurewise_center=False, # 在数据集上将输入平均值设置为0
samplewise_center=False, # 将每个样本的平均值设置为0
featurewise_std_normalization=False, # 将输入除以数据集的std
samplewise_std_normalization=False, # 将每个输入除以它的std
zca_whitening=False, # 使用ZCA白化
rotation_range=10, # 在范围内随机旋转图像(0到180度)
zoom_range = 0.1, # 随机缩放图像
width_shift_range=0.1, # 水平随机移动图像(总宽度的一部分)
height_shift_range=0.1, # 垂直随机移动图像(总高度的一部分)
horizontal_flip=False, # 随机翻转图像
vertical_flip=False) # 随机翻转图像
datagen.fit(X_train)
为了增加数据选择了:
- 训练图像随机旋转10度;
- 随机缩放10%一些训练图像;
- 将图像水平移动10%的宽度;
- 将图像垂直移动10%的高度;
- 没有应用垂直翻转或水平翻转,因为它可能导致错误分类对称数字,如6和9。
数据增强后就可以拟合训练数据集