目标: 数据读取与数据扩增
在开始这个task之前,以迫切地心情“围观”了水神的baseline直播讲解,听完直播让我对于“零基础”这个概念产生了深深的误解,还特别去看了下这个活动设计里面的基础要求,只要是会点Python就行,看来我还是太“年轻”了。
从水神的直播来看,我离能够自由随意地跟上baseline的代码还有比较大的GAP,这个GAP看来只是我自己有,队友们都从善如流。所以,这次task2的任务,又分成了两部分。一、跟上节奏,认真学习task2的文档教程,学习了解什么是数据扩增,以及DATASet和DataLoader是什么关系,如何运用。二、深入研究baseline的每一个字母,企图从一个成功(成熟)案例中找到固定模式,从而发现自己的短板,并尽可能进行补齐。
数据扩增
数据扩增的意义是什么,是尽可能地提高符合训练目标的样本数据量,并人为地创造人类可识别的差异,去杜绝在机器学习过程中对于样本的过拟合。样本数据,只要是好的样本,从来没人会嫌多的。所以这是数据扩增的第一个目的。另外一个目的是,通过将样本图片的加噪点、翻转、旋转、色彩加工等不改变图片本身含义的基础上,创造出更多的内容,让模型本身更多集中在对于图像真实意义的理解上。比如通过旋转和翻转,模型就不会只认识车头向左的图片中的车辆。有很多种工具都可以实现对于图像的这种加工和处理,文中提供Pillow、opencv的库,来加工需要进行扩增的图像集,还有专门的数据扩增的库,如torchvision、imgaug、albumentations等。
以torchvision为例,常见的数据扩增方法包括:
transforms.CenterCrop 对图片中心进行裁剪
transforms.ColorJitter 对图像颜色的对比度、饱和度和零度进行变换
transforms.FiveCrop 对图像四个角和中心进行裁剪得到五分图像
transforms.Grayscale 对图像进行灰度变换
transforms.Pad 使用固定值进行像素填充
transforms.RandomAffine 随机仿射变换
transforms.RandomCrop 随机区域裁剪
transforms.RandomHorizontalFlip 随机水平翻转
transforms.RandomRotation 随机旋转
transforms.RandomVerticalFlip 随机垂直翻转
数据集
这次推荐的框架用的是Pytorch,在Pytorch中数据是通过Dataset进行封装,并通过DataLoder进行并行读取。
这两个工具是不同概念上的。
Dataset:对数据集的封装,提供索引方式的对数据样本进行读取
DataLoder:对Dataset进行封装,提供批量读取的迭代读取
在使用DataLoder进行封装后,数据的加载的代码就是这样的:
train_loader = torch.utils.data.DataLoader(
SVHNDataset(train_path, train_label,
transforms.Compose([
transforms.Resize((64, 128)),
transforms.ColorJitter(0.3, 0.3, 0.2),
transforms.RandomRotation(5),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])),
batch_size=10, # 每批样本个数
shuffle=False, # 是否打乱顺序
num_workers=10, # 读取的线程个数
)
Baseline的代码理解
还在过程中,内容后补。。。。
网友评论