一、数据
1.1 让PyTorch能读你的数据集
- Dataset类:
Dataset
类作为所有的datasets
的基类存在,所有的datasets
都需要继承它__getitem__
:接收一个index,然后返回图片数据和标签,这个index通常指的是一个list的index,这个list的每个元素就包含了图片数据的路径和标签信息。- list的制作:将图片的路径和标签信息存储在一个txt中,然后从该txt中读取
- 读取数据的基本流程为:
- 制作存储了图片的路径和标签信息的txt
- 将这些信息转化为list,该list每一个元素对应一个样本
- 通过
__getitem__
函数。读取数据和标签,并返回数据和标签
- pytorch读取自己的数据集:
-
制作图片数据的索引
读取图片的路径、标签,保存到txt中,注意格式与相对路径
-
构建
Dataset
子类
-
- 在
Dataloader
中,会触发__getitem__
函数读取一张图片的数据和标签并拼接成一个batch返回,作为模型真正的输入
1.2 图片从硬盘到模型
从Dataset来,到Dataset去
- 通过Dataset创建一个实例,在该实例中有路径,有读取图片的方法(函数)。
- 需要pytorch的一系列规范化流程,调用MyDataset中的
__getitem__()
函数,最终通过Image.open()
读取图片数据。 - 然后对原始图片数据进行一系列预处理(transform 中设置),最后回到
main.py
,对数据
进行转换成Variable
类型,最终成为模型的输入。
1.3 数据增强与数据标准化
- transforms的使用:
transforms.Compose()
将所需要进行的处理给compose起来,并且注意顺序 - 训练时常用操作:
- 随机裁剪等
transforms.Totensor()
- 数据标准化(减均值,除以标准差)
1.4 transforms的22个方法
1.4.1 随机裁剪transforms.RandomCrop()
- 依据给定的size随机裁剪
1.4.2 中心裁剪transforms.CenterCrop()
- 依据给定的size从中心裁剪
1.4.3 随机长宽比裁剪transforms.RandomResizeCrop()
- 随机大小,随机长宽比裁剪原始图片,最后将图片resize到设定的size
1.4.4 上下左右中心裁剪transforms.FiveCrop()
- 对图片进行上下左右以及中心裁剪,获得5张图片,返回一个4D-tensor
1.4.5 上下左右中心裁剪后翻转transforms.TenCrop()
- 对图片进行上下左右以及中心裁剪,然后全部翻转(水平或者垂直),获得10张图片,返回一个4D-tensor
1.4.6 依概率p水平翻转transforms.RandomHorizontalFlip()
- 依概率p对PIL图片进行水平翻转
1.4.7 依概率p垂直翻转transforms.RandomVerticalFlip()
- 依概率p对PIL图片进行垂直翻转
1.4.8 随机旋转transforms.RandomRotation()
- 依degree随机旋转一定角度
1.4.9 resizetransforms.Resize()
- 重置图像分辨率
1.4.10 标准化transforms.Normalize()
- 对数据按通道进行标准化,即先减均值,再除以标准差,注意是hwc
1.4.11 转为tensortransforms.ToTensor()
- 将PIL Image或者ndarray转换为tensor,并归一化至[0,1]
1.4.12 填充transforms.Pad()
- 对图像进行填充
1.4.13 修改亮度、对比度和饱和度transforms.ColorJitter()
- 修改亮度、对比度和饱和度
1.4.14 转灰度图transforms.Grayscale()
- 将图片转换为灰度图
1.4.15 线性变换transforms.LinearTransformation()
- 对矩阵做线性变换,可用于白化处理
1.4.16 仿射变换transforms.RandomAffine()
- 仿射变换
1.4.17 依概率p转为灰度图transforms.RandomGrayscale()
- 依概率p将图片转换为灰度图
1.4.18 将数据转换为PILImagetransforms.ToPILImage()
- 将tensor或者ndarray的数据转换为PIL Image类型数据
1.4.19 transforms.Lambda
- apply a user-defined lambda as a transform.
1.4.20 transforms.RandomChoice(transforms)
- 从给定的一系列transforms中选一个进行操作,randomly picked from a list
1.4.21 transforms.RandomApply(transforms, p=0.5)
- 给一个transforms加上概率,以一定的概率执行该操作
1.4.22 transforms.RandomOrder()
- 将transforms中的操作顺序随机打乱