在训练机器学习或深度学习模型时,最终目标是获得一个具备良好泛化能力的通用模型。换言之,模型不仅要拟合训练数据,还需对未见过的数据展现出稳定表现。数据增强正是防止过拟合的常用技术之一——通过人为扩充训练样本数量,让模型接触更多样化的数据,从而学习到更稳健、更泛化的特征。
数据增强本质上是通过各种方式扩展训练数据集的过程。使用多样化数据进行训练,能够提升模型在不同场景下的鲁棒性。那么,“多样化”具体体现在哪些方面?本文以图像领域为例,系统梳理几种常见的图像数据增强技术,并附带 PyTorch 代码实战,让大家直观感受每种方法的效果。下面先展示一张示例图像,后续所有操作均以此图为基础。

为直观展示每种增强效果,先编写一个可视化辅助函数,后续所有变换都将调用该函数进行对比展示。
import PIL.Image as Image
import torch
from torchvision import transforms
import matplotlib.pyplot as plt
import numpy as np
import warnings
def imshow(img_path, transform):
"""
Function to show data augmentation
Param img_path: path of the image
Param transform: data augmentation technique to apply
"""
img = Image.open(img_path)
fig, ax = plt.subplots(1, 2, figsize=(15, 4))
ax[0].set_title(f'Original image {img.size}')
ax[0].imshow(img)
img = transform(img)
ax[1].set_title(f'Transformed image {img.size}')
ax[1].imshow(img)Resize/Rescale
Resize/Rescale操作非常直观:将图像的宽度和高度调整为指定的尺寸。例如,以下代码将原始图像统一缩放至224×224像素。
path = './kitten.jpeg'
transform = transforms.Resize((224, 224))
imshow(path, transform)
Cropping
裁剪是指从原始图像中切取一块矩形区域。CenterCrop函数会返回以原图中心裁剪后的图像,尺寸可由用户自定义。
transform = transforms.CenterCrop((224, 224))
imshow(path, transform)
RandomResizedCrop
RandomResizedCrop将裁剪与缩放结合——随机选取图像中的某一区域,再将其缩放至目标尺寸,是一种非常实用的数据增强手段。
transform = transforms.RandomResizedCrop((100, 300))
imshow(path, transform)
Flipping
水平或垂直翻转图像。以下代码演示水平翻转(RandomHorizontalFlip)的效果。
transform = transforms.RandomHorizontalFlip()
imshow(path, transform)
Padding
填充(Padding)是指在图像四周添加指定像素宽度的边框。以下示例为每条边均填充50像素。
transform = transforms.Pad((50,50,50,50))
imshow(path, transform)
Rotation
随机旋转图像一定角度。这里设置旋转角度范围为±15度。
transform = transforms.RandomRotation(15)
imshow(path, transform)
Random Affine
Random Affine是一种保持图像中心不变的仿射变换,可设置的参数较为丰富:
degrees:旋转角度范围
translate:沿水平和垂直方向的平移量
scale:缩放比例范围
shear:剪切变换参数
fillcolor:图像外部区域的填充颜色
transform = transforms.RandomAffine(1, translate=(0.5, 0.5), scale=(1, 1), shear=(1,1), fillcolor=(256,256,256))
imshow(path, transform)
Gaussian Blur
高斯模糊(Gaussian Blur)可使图像变得模糊,模糊程度由卷积核大小和标准差参数控制。
transform = transforms.GaussianBlur(7, 3)
imshow(path, transform)
Grayscale
将彩色图像转换为灰度图像。
transform = transforms.Grayscale(num_output_channels=3)
imshow(path, transform)
颜色增强(亦称颜色抖动)通过改变像素值来调整图像的色彩属性。以下均属于颜色相关的数据增强操作。
Brightness
调整图像的亮度——使其更亮或更暗。参数值越大,亮度变化越明显。
transform = transforms.ColorJitter(brightness=2)
imshow(path, transform)
Contrast
对比度代表图像中最亮与最暗区域的差异程度。提高对比度可使明暗区域更加分明。
transform = transforms.ColorJitter(contrast=2)
imshow(path, transform)
Saturation
饱和度决定颜色的鲜艳程度。数值越大,色彩越浓郁。
transform = transforms.ColorJitter(saturation=20)
imshow(path, transform)
Hue
色调(Hue)用于改变颜色的色相,即对图像整体进行颜色偏移。
transform = transforms.ColorJitter(hue=2)
imshow(path, transform)
总结
通过对图像本身进行多样化变换,模型能够学习到更多不变性特征,从而在面对未见数据时更加鲁棒,有效缓解过拟合。数据增强看似简单,实则是提升模型泛化能力的利器——善加利用,可收事半功倍之效。
