数据增强你真的了解吗

254 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

数据增强

通俗来讲,数据增强就是增加数据量。数据对于机器学习或者深度学习来说非常重要,有时候拥有更多的数据胜过拥有一个好的模型。 一般来说更多的数据参与训练,训练得到的模型就更好。如果数据太少,而我们构建的神经网络又太复杂的话就比较容易产生过拟合的现象。

数据增强是一种策略,使从业者无需收集新数据就能显著提升已有数据的多样性,从而更好地服务训练模型。诸如裁剪、填充和水平翻转等数据增强技术通常用于训练大型神经网络。

此技术现如今在图像领域使用颇多,而且很多深度学习业界大佬对数据增强的技术进行了改进以此来达到一个最优的效果,例如何凯明团队的MAE。还有目前火出圈的对比学习中,普遍用到数据增强方法,例如对比聚类Contrastive Clustering arxiv.org/abs/2009.09…

那么下面我们通过一张图片来实际演示一下数据增强的几种常用方法以及效果展示。

常用数据增强方法

我们使用下面这个尺寸为 400*500 的图像作为示例

import torch
import torchvision
from torch import nn
from d2l import torch as d2l

d2l.set_figsize()
img = d2l.Image.open('../img/cat.jpg')
d2l.plt.imshow(img);

image.png

1. 翻转和裁剪

这是最早和最广泛使用的图像增广方法之一。一般经常用左右翻转图像,通常不会改变对象的类别。
为了便于观察图像增强的效果,我们定义辅助函数 apply 。 此函数在输入图像 img 上多次运行图像增广方法 aug 并显示所有结果。

def apply(img, aug, num_rows=2, num_cols=4, scale=1.5):
    Y = [aug(img) for _ in range(num_rows * num_cols)]
    d2l.show_images(Y, num_rows, num_cols, scale=scale)

# 左右翻转
apply(img, torchvision.transforms.RandomHorizontalFlip())

# 裁剪
shape_aug = torchvision.transforms.RandomResizedCrop(
    (200, 200), scale=(0.1, 1), ratio=(0.5, 2))
apply(img, shape_aug)

image.png image.png

2. 颜色变换

对于一张图像,我们可以改变图像颜色的四个方面:亮度、对比度、饱和度和色调

(1) 改变图像亮度
在下面的示例中,我们随机更改图像的亮度,随机值为原始图像的50%(10.51-0.5)到150%(1+0.51+0.5)之间。

apply(img, torchvision.transforms.ColorJitter(
    brightness=0.5, contrast=0, saturation=0, hue=0))

image.png

(2) 改变图像色调

apply(img, torchvision.transforms.ColorJitter(
    brightness=0, contrast=0, saturation=0, hue=0.5))

image.png

总结

  • 图像增广基于现有的训练数据生成随机图像,以此来提高模型的泛化能力。
  • 为了在预测过程中得到确切的结果,我们通常只对训练样本进行数据增强操作,而在预测过程中不使用。
  • 深度学习框架提供了许多不同的数据增强方法,这些方法可以被同时应用。