数据读取机制DataLoader与Dataset
数据处理过程
DataLoader
torch.utils.data.DataLoader
功能:构建可迭代的数据装载器
- dataset:Dataset类,决定数据从哪里读取及如何读取
- batchsize:批大小
- num_works:是否多进程读取数据
- shuffle:每个epoch是否乱序
- drop_last:当样本数不能被batchsize整除时,是否舍弃最后一批数据
概念区分
Epoch:所有训练样本都已输入到模型中,称为一个Epoch
Iteration:一批样本输入到模型中,称之为一个Iteration
Batchsize:批大小,决定一个Epoch有多少个Iteration
样本总数:80, Batchsize:8
1 Epoch = 10 Iteration
样本总数:87, Batchsize:8
1 Epoch = 10 Iteration ? drop_last = True
1 Epoch = 11 Iteration ? drop_last = False
Dataset
torch.utils.data.Dataset
功能:Dataset抽象类,所有自定义的Dataset需要继承它,并且复写_getitem_()
getitem:接受一个索引,返回一个样本
数据读取的流程
数据预处理transforms模块机制
transforms运行机制
torchvision:计算机视觉工具包
torchvision.transforms:常用的图像预处理方法
torchvision.datasets:常用数据集的dataset实现,MNIST,CIFAR-10,ImageNet等
torchvision.model:常用的模型预训练,AlexNet,VGG, ResNet,GoogLeNet等
torchvision.transforms : 常用的图像预处理方法
• 数据中心化
• 数据标准化
• 缩放
• 裁剪
• 旋转
• 翻转
• 填充
• 噪声添加
• 灰度变换
• 线性变换
• 仿射变换
• 亮度、饱和度及对比度变换
数据标准化
transforms.normalize
功能:逐channel的对图像进行标准化
output = (input - mean ) / std
- mean:各通道的均值
- std:各通道的标准差
- inplace:是否原地操作
transforms图像增强
数据增强
Data Augmentaion
数据增强又称为数据增广,数据扩增,它是对训练集进行变换,使得训练集更加丰富,从而让模型更具有泛化能力。
transforms —— 裁剪(Crop)
1. transforms.CenterCrop
功能:从图像中心裁剪图片
- size:所需裁剪图片尺寸
2. transforms.RandomCrop
功能:从图片中随机裁剪出尺寸为size的图片
- size:所需裁剪图片尺寸
- padding:设置填充大小
当为a时,上下左右均填充a个像素
当为(a, b)时,上下填充b个像素,左右填充a个像素
当为(a, b, c, d)时,左、上、右、下分别填充a、b、c、d - pad_if_need:若图像小于设定size,则填充
- padding_mode:填充模式,有4种模式:
- constant:像素值由fill决定
- edge:像素值由图像边缘像素决定
- reflect:镜像填充,最后一个像素不镜像
eg:[1,2,3,4] --> [3,2,1,2,3,4,3,2] - symmetric:镜像填充,最后一个像素镜像
eg:[1,2,3,4] --> [2,1,1,2,3,4,4,3]
- fill:constant时,设置填充的像素值
3. RandomResizedCrop
功能:随机大小、长宽比剪裁图片
- size:所需要裁剪图片尺寸
- scale:随机裁剪面积比例,默认(0.08, 1)
- ratio:随机长宽比,默认(3/4, 4/3)
- interpolation:插值方法
PIL.Image.NEAREST
PIL.Image.BILINEAR
PIL.Image.BICUBIC
4. FiveCrop
5.TenCrop
功能:在图像的上下左右以及中心裁剪出尺寸为size的5张图片,TenCrop对这5张图片进行水平或者垂直镜像获得10张图片
- size:所需裁剪图片尺寸
- vertical_flip:是否垂直翻转
transforms——翻转、旋转(Flip and Rotation)
1. RandomHorizontalFlip
2. RandomVertiocalFlip
功能:依概率水平(左右)或垂直(上下)翻转图片
- p:翻转概率
3. RandomRotation
功能:随机旋转图片
- degress:旋转角度
当为a时,在(-a, a)之间选择旋转角度
当为(a, b)时,在(a, b)之间选择旋转角度 - resample:重采样方法
- expand:是否扩大图片,以保持原图信息
- center:旋转点设置,默认中心旋转
transforms——图像变换
1. Pad
功能:对图片边缘进行填充
- padding:设置填充大小
当为a时,上下左右均填充a个像素
当为(a, b)时,上下填充b个像素,左右填充a个像素
当为(a, b, c, d)时,左,上,右,下分别填充a, b, c, d - padding_mode:填充模式,有4种模式,constant、edge、reflec t和symmetric
- fill:constant时,设置填充的像素值,(R, G, B) o r (Gray)
2. ColorJitter
功能:调整亮度、对比度、饱和度和色相
- brightness:亮度调整因子
当为a时,从[max (0, 1-a), 1+a]中随机选择
当为(a, b)时,从[a, b]中 - contrast:对比度参数,同brightness
- saturation:饱和度参数,同brightness
- hue:色相参数
当为a时,从[-a, a]中选择参数,注: 0<= a <= 0.5
当为(a, b)时,从[a, b]中选择参数,注:-0.5 <= a <= b <= 0.5
3. Grayscale
4. RandomGrayscale
功能:依概率将图片转换为灰度图
- num_ouput_channels:输出通道数,只能设1或3
- p:概率值,图像被转换为灰度图的概率
5. RandomAffine
功能:对图像进行仿射变换,仿射变换是二维的线性变换,由五种基本原子变换构成,分别是旋转、平移、缩放、错切和翻转
- degrees:旋转角度设置
- translate:平移区间设置,如(a, b), a设置宽(width),b设置高(height)
图像在宽维度平移的区间为 -img_width * a < dx < img_width * a - scale:缩放比例(以面积为单位)
- fill_color:填充颜色设置
- shear:错切角度设置,有水平错切和垂直错切
若为a,则仅在x轴错切,错切角度在(-a, a)之间
若为(a,b),则a设置x轴角度,b设置y的角度
若为(a, b, c, d),则a, b设置x轴角度,c, d设置y轴角度 - resample:重采样方式,有NEAREST 、BILINEAR、BICUBIC
6. RandomErasing
功能:对图像进行随机遮挡
- p:概率值,执行该操作的概率
- scale:遮挡区域的面积
- ratio:遮挡区域长宽比
- value:设置遮挡区域的像素值,(R, G, B) or (Gray)
参考文献:《Random Erasing Data Augmentation》
7. transforms.Lambda
功能:用户自定义lambda方法
- lambd:lambda匿名函数
lambda [arg1 [,arg2,…, argn]] : expression
transforms——方法操作
1. transforms.RandomChoice
功能:从一系列transforms方法中随机挑选一个
python">transforms.RandomChoice([transforms1, transforms2, transforms3])
2. transforms.RandomApply
功能:依据概率执行一组transforms操作
python">transforms.RandomApply([transforms1, transforms2, transforms3], p=0.5)
3. transforms.RandomOrder
功能:对一组transforms操作打乱顺序
python">transforms.RandomOrder([transforms1, transforms2, transforms3])
自定义transforms方法
自定义transforms要素
python">class Compose(object):def __call__(self, img):for t in self.transforms:img = t(img)return umg
- 仅接收一个参数,返回一个参数
- 注意上下游的输出与输入
通过类实现多参数传入:
python">class YourTransforms(object):def __init__(self, ...):...def __call__(self, img):...return img
总结——transforms方法
一、裁剪
- transforms.CenterCrop
- transforms.RandomCrop
- transforms.RandomResizedCrop 4. transforms.FiveCrop
- transforms.TenCrop
二、翻转和旋转
- transforms.RandomHorizontalFlip
- transforms.RandomVerticalFlip
- transforms.RandomRotation
三、图像变换
- transforms.Pad
- transforms.ColorJitter
- transforms.Grayscale
- transforms.RandomGrayscale
- transforms.RandomAffine
- transforms.LinearTransformation
- transforms.RandomErasing
- transforms.Lambda
- transforms.Resize
- transforms.Totensor
- transforms.Normalize
transforms的操作
- transforms.RandomChoice
- transforms.RandomApply
- transforms.RandomOrder
数据增强实战
原则:让训练集与测试集更接近
- 空间位置:平移
- 色彩:灰度图,色彩抖动
- 形状:仿射变换
- 上下文场景:遮挡,填充
- ……