文章目录

  • 一、图像增广
  • 二、常用的图像增广方法
    • 1. 翻转和裁减
    • 2. 颜色改变
    • 3. 叠加使用多种数据增广方法
  • 三、使用图像增广进行训练
  • 四、总结(干活分享)

一、图像增广

定义&解释:

  1. 通过对训练图像做一系列随机改变,来产生相似但又不同的训练样本,从而扩大训练数据集的规模。
  2. 随机改变训练样本可以降低模型对某些属性的依赖,从而提高模型的范化能力

二、常用的图像增广方法

使用下面这张400x500的图像作为范例

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import torch
import torchvision
from d2l import torch as d2l
from torch import nn
from PIL import Image
img = Image.open('./data/cat_dog/cat1.jpg')
plt.figure("cat")
plt.title('Initial data')
plt.imshow(img)
plt.show()

大多数图像增广方法都具有一定的随机性。为了便于观察图像增广的效果,我们下面定义辅助函数 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)

1. 翻转和裁减

  1. 左右翻转图像通常不会改变对象的类别。这是最早和最广泛使用的图像增广方法之一。
  2. 上下翻转图像不如左右图像翻转那样常用。但是,至少对于这个示例图像,上下翻转不会妨碍识别。
  3. 随机裁减]在我们使用的示例图像中,猫位于图像的中间,但并非所有图像都是这样。 池化层可以降低卷积层对目标位置的敏感性。 另外,我们可以通过对图像进行随机裁剪,使物体以不同的比例出现在图像的不同位置。 这也可以降低模型对目标位置的敏感性。
# 左右翻转
apply(img,torchvision.transforms.RandomHorizontalFlip())
# 上下翻转
apply(img,torchvision.transforms.RandomVerticalFlip())
# 随机裁减
shape_aug = torchvision.transforms.RandomResizedCrop(
(200,200),scale=(0.1,1),ratio=(0.5,2),
# (200,200)是图片的大小,scale表示随机裁减为原来的比例,ratio是长宽比
)
apply(img,shape_aug)

2. 颜色改变

另一种增广方法是改变颜色。
我们可以改变图像颜色的四个方面:

  1. 亮度
  2. 对比度
  3. 饱和度
  4. 色调
# 亮度
apply(img,torchvision.transforms.ColorJitter(brightness=0.5,contrast=0,saturation=0,hue=0))
# 对比度
apply(img,torchvision.transforms.ColorJitter(brightness=0,contrast=0.5,saturation=0,hue=0))
# 饱和度
apply(img,torchvision.transforms.ColorJitter(brightness=0,contrast=0,saturation=0.5,hue=0))
# 色调
apply(img,torchvision.transforms.ColorJitter(brightness=0,contrast=0,saturation=0,hue=0.5))
# 混合使用
apply(img,torchvision.transforms.ColorJitter(brightness=0.5,contrast=0.5,saturation=0.5,hue=0.5))

3. 叠加使用多种数据增广方法

augs = torchvision.transforms.Compose([torchvision.transforms.RandomHorizontalFlip(),torchvision.transforms.ColorJitter(brightness=0.5,contrast=0.5,saturation=0.5,hue=0.5),torchvision.transforms.RandomResizedCrop((200, 200), scale=(0.1, 1), ratio=(0.5, 2))]
)
apply(img,augs)

三、使用图像增广进行训练

# 下载CIFA10数据集测试
all_images = torchvision.datasets.CIFAR10(train=True,root="./data/",download=True
)
d2l.show_images([all_images[i][0] for i in range(32)] , 4,8,scale=0.8)
# 应用简单的左右翻转,上下翻转
# 生数据格式为(批量大小,通道数量,高度,宽度)
train_augs = torchvision.transforms.Compose(
[torchvision.transforms.RandomHorizontalFlip(),
#  torchvision.transforms.RandomVerticalFlip(),torchvision.transforms.ToTensor()]
)test_augs = torchvision.transforms.Compose([
# torchvision.transforms.RandomHorizontalFlip(),
#  torchvision.transforms.RandomVerticalFlip(),torchvision.transforms.ToTensor()
]
)
# 加载数据
def load_cifar10(is_train,augs,batch_size):dataset = torchvision.datasets.CIFAR10(root="./data/",train=is_train,transform=augs,download=True)dataLoader = torch.utils.data.DataLoader(dataset,batch_size=batch_size,shuffle=is_train,num_workers=d2l.get_dataloader_workers())return dataLoader
# 多GPU训练和评估
def train_batch(net, X, y, loss, trainer, devices):if isinstance(X, list):# 微调BERT中所需(稍后讨论)X = [x.to(devices[0]) for x in X]else:X = X.to(devices[0])y = y.to(devices[0])net.train()trainer.zero_grad()pred = net(X)l = loss(pred, y)l.sum().backward()trainer.step()train_loss_sum = l.sum()train_acc_sum = d2l.accuracy(pred, y)return train_loss_sum, train_acc_sum
def train(net, train_iter, test_iter, loss, trainer, num_epochs,devices=d2l.try_all_gpus()):timer, num_batches = d2l.Timer(), len(train_iter)animator = d2l.Animator(xlabel='epoch', xlim=[1, num_epochs], ylim=[0, 1],legend=['train loss', 'train acc', 'test acc'])net = nn.DataParallel(net, device_ids=devices).to(devices[0]) # 多GPU运行for epoch in range(num_epochs):# 4个维度:储存训练损失,训练准确度,实例数,特点数metric = d2l.Accumulator(4)for i, (features, labels) in enumerate(train_iter):timer.start()l, acc = train_batch(net, features, labels, loss, trainer,devices)metric.add(l, acc, labels.shape[0], labels.numel())timer.stop()if (i + 1) % (num_batches // 5) == 0 or i == num_batches - 1:animator.add(epoch + (i + 1) / num_batches,(metric[0] / metric[2], metric[1] / metric[3], None))test_acc = d2l.evaluate_accuracy_gpu(net, test_iter)animator.add(epoch + 1, (None, None, test_acc))print(f'loss {metric[0] / metric[2]:.3f}, train acc 'f'{metric[1] / metric[3]:.3f}, test acc {test_acc:.3f}')print(f'{metric[2] * num_epochs / timer.sum():.1f} examples/sec on 'f'{str(devices)}')
#使用增强之后的数据进行训练模型;
# 获取全部的GPU,使用Adam作为优化算法
batch_size, devices, net = 256, d2l.try_all_gpus(), d2l.resnet18(10, 3)# 模型初始化
def init_weights(m):if type(m) in [nn.Linear, nn.Conv2d]:nn.init.xavier_uniform_(m.weight)net.apply(init_weights)def train_with_data_aug(train_augs, test_augs, net, lr=0.001):train_iter = load_cifar10(True, train_augs, batch_size)test_iter = load_cifar10(False, test_augs, batch_size)loss = nn.CrossEntropyLoss(reduction="none")trainer = torch.optim.Adam(net.parameters(), lr=lr)train(net, train_iter, test_iter, loss, trainer, 10, devices)
# 数据增广(左右翻转)
train_with_data_aug(train_augs, test_augs, net)
loss 0.166, train acc 0.942, test acc 0.823
453.4 examples/sec on [device(type='cuda', index=0)]
# 没有数据增广
batch_size, devices, net = 256, d2l.try_all_gpus(), d2l.resnet18(10, 3)
def init_weights(m):if type(m) in [nn.Linear, nn.Conv2d]:nn.init.xavier_uniform_(m.weight)net.apply(init_weights)
train_with_data_aug(test_augs, test_augs, net)
loss 0.070, train acc 0.975, test acc 0.797
455.5 examples/sec on [device(type='cuda', index=0)]

结果对比:

  1. 使用图像增强,尽管只是简单的左右翻转,我们模型的预测精度还是提高了3%
  2. 模型过拟合有一定的缓解。

四、总结(干活分享)

  1. 图像增广基于现有的训练数据生成随机图像,来提高模型的范化能力。
  2. 为了在预测过程中得到确切的结果,我们通常对训练样本只进行图像增广,而在预测过程中不使用随机操作的图像增广。(训练有,预测无)
  3. 深度学习框架提供了许多不同的图像增广方法,这些方法可以被同时应用。(多种增强共同使用)
  4. 图像增广方法收集(这些整理应该够用了,如果有什么特别需求可以留言讨论一下):

    (1)知乎上有作者总结自己编写的15种增强方法和代码:
    https://zhuanlan.zhihu.com/p/158854758

    • 翻转
    • 裁剪
    • 过滤和锐化
    • 模糊
    • 旋转,平移,剪切,缩放
    • 剪下
    • 色彩
    • 亮度
    • 对比
    • 均匀和高斯噪声
    • 渐变镜头变形

    (2)github上找一些高star的成熟代码:
    例如: imgaug https://github.com/aleju/imgaug

    (3)augmentor https://github.com/mdbloice/Augmentor

动手学深度学习(二十六)——图像增广(一生二,二生三,三生万物?)相关推荐

  1. 动手学深度学习(十四)——权重衰退

    文章目录 1. 如何缓解过拟合? 2. 如何衡量模型的复杂度? 3. 通过限制参数的选择范围来控制模型容量(复杂度) 4. 正则化如何让权重衰退? 5. 可视化地看看正则化是如何利用权重衰退来达到缓解 ...

  2. 动手学深度学习(PyTorch实现)(六)--卷积神经网络基础

    卷积神经网络基础 1. 二维卷积层 1.1 二维互相关运算 1.2 互相关运算与卷积运算 1.3 特征图与感受野 2. 填充与步幅 2.1 填充 2.2 步幅 3. 多通道 3.1 多输入通道 3.2 ...

  3. 《动手学习深度学习》13.1图像增广在colab上显示猫的图片不成功的解决办法

    一开始,我总是显示如下: No such file or directory: './img/cat1.jpg' 但是打开文件路径发现路径没有问题,img和运行的文件是在同一目录下的: ps:如果点击 ...

  4. 关于动手学深度学习扩展包d2l的安装

    关于动手学深度学习扩展包d2l的安装 方式一 方式二 方式一 下载离线安装包直接放置 d2l_python是动手学深度学习PyTorch中的包,所以他的安装使用离线安装. 链接: [https://g ...

  5. 动手学深度学习(三十九)——门控循环单元GRU

    文章目录 门控循环单元(GRU) 一.门控隐藏状态 1.1 重置门和更新门 1.2候选隐藏状态 1.3 隐藏状态 二.从零实现GRU 2.1 初始化模型参数 2.2 定义模型 2.3 训练与预测 2. ...

  6. 动手学深度学习之图像风格迁移

    参考伯禹学习平台<动手学深度学习>课程内容内容撰写的学习笔记 原文链接:https://www.boyuai.com/elites/course/cZu18YmweLv10OeV/less ...

  7. 动手学深度学习打卡之二。

    第二次打卡内容(2月15日-18日) Task03:过拟合.欠拟合及其解决方案:梯度消失.梯度爆炸:循环神经网络进阶(1天) Task04:机器翻译及相关技术:注意力机制与Seq2seq模型:Tran ...

  8. 《动手学深度学习》环境搭建全程详细教程 window用户

    一.下载并安装Miniconda 第一步是根据操作系统下载并安装Miniconda,在安装过程中需要勾选"Add Anaconda to the system PATH environmen ...

  9. 动手学深度学习笔记3.4+3.5+3.6+3.7

    系列文章目录 动手学深度学习笔记系列: 动手学深度学习笔记3.1+3.2+3.3 文章目录 系列文章目录 前言 一.softmax回归 1.1 分类问题 1.2 网络架构 1.3 全连接层的参数开销 ...

  10. 《动手学深度学习》—学习笔记

    文章目录 深度学习简介 起源 特点 小结 预备知识 获取和运行本书的代码 pytorch环境安装 方式一 方式二 数据操作 创建 运算 广播机制 索引 运算的内存开销 NDArray和NumPy相互变 ...

最新文章

  1. 观《逻辑思维,如何成为一个高手》
  2. 微信js sdk动态引用
  3. css折叠样式(1)——使用css样式的三种方式
  4. 解决springdatajpa 在解析实体类的字段时候驼峰自动转为下划线问题
  5. Thinkphp5.0 多图上传名称重复BUG
  6. discuz 标签详解
  7. TensorFlow 2.0 - Keras Pipeline、自定义Layer、Loss、Metric
  8. python如何爬虫eps数据_入门Python爬虫 -- 解析数据篇
  9. java 获取继承字段_java – 从类中获取所有字段(甚至是私有的和继承的)
  10. 判断元素是否存在(信息学奥赛一本通-T1211)
  11. [转]踏实从小事做起, 才能有大发展
  12. python中weekday_[转载] Python日历模块| 使用示例的weekday()方法
  13. Number类型及方法(js)
  14. Jan 11 - Contains Duplicate II; Array; Traverse; HashMap; HashSet;
  15. 用户故事(二):为什么要使用用户故事表达需求?
  16. Windows Neptune的安装
  17. ACM复习(53)17229 Lry,你除了2还是2
  18. java查询ip归属地
  19. 最长等差数列_算法题10 最长等差序列问题
  20. 学习+思考+总结+分享

热门文章

  1. 触目惊心的股市圈钱骗局:阴谋
  2. 关于量子计算机的一些整理 (精心整理原创) (1)
  3. 服务器中的编码解码问题
  4. 实战五十一:基于python机器学习深度学习实现股市评论情感分析 (完整代码+数据集可直接运行)
  5. win32crypt :安装pywin32并解决模块找不到问题
  6. Android实现动态任意拖动图片
  7. Xposed折腾笔记(二)-微信骰子我做主
  8. excel 自定义工具栏_您的自定义Excel工具栏
  9. python画花瓣飘落_Python——画一棵漂亮的樱花树
  10. 年轻人,看你骨骼惊奇,我这有一份来自阿里的Android开发学习指南,不仅能让你月入5w,度过中年危机都不是问题!