Task02-数据读取和数据扩增

一、数据扩增的目的

数据扩增可以增加用于训练的数据样本,缓解样本的过拟合

二、常见的数据扩增方法

一般可以从颜色、尺寸、形态、空间和像素等角度转换,当然也可以自由组合。以torchvision为例

transforms.CenterCrop 对图片中心进行裁剪
transforms.ColorJitter 对图像颜色的对比度、饱和度和零度进行转换
transforms.FiveCrop 对图像的四个角和中心进行裁剪得到五分图像
transforms.Grayscale 对图像进行灰度转换
transforms.Pad 使用固定值进行像素填充
transforms.RandomAffine 随机仿射变换
transforms.RandomCrop 随机区域裁剪
transforms.RandomHorizontalFlip 随机水平翻转
transforms.RandomRotation 随机旋转
transforms.RandomVerticalFlip 随机垂直翻转

三、理解pytorch的Dataset和Dataloader

1. dataset

pytorch自带Dataset的类,可以直接继承,需要重写两个方法:

__len__ :定义整个数据集的长度。使用len(dataset)时会被调用。
__getitem__:用于索引数据集中的数据,比如dataset[i]

再看一下baseline中的SVHNDataset的类

class SVHNDataset(Dataset):
        def __init__(self, img_path, img_label, transform=None):
                            self.img_path = img_path
                            self.img_label = img_label
                            if transform is not None:
                                self.transform = transform
                            else:
                                self.transform = None
        def __getitem__(self, index):
                           img = Image.open(self.img_path[index]).convert('RGB')
                           if self.transform is not None:
                           img = self.transform(img)
 
                           # 原始SVHN中类别10为数字0
                           lbl = np.array(self.img_label[index], dtype=np.int)
                           lbl = list(lbl) + (5 - len(lbl)) * [10]
 
                          return img, torch.from_numpy(np.array(lbl[:5]))
        def __len__(self):
                         return len(self.img_path)

需要注意的是
lbl = np.array(self.img_label[index], dtype=np.int)
lbl = list(lbl) + (5 - len(lbl)) * [10]
这里是将每个picture的label统一成5个
torch.from_numpy(np.array(lbl[:5]))是将arrary的形式转成tensor
类SVHNDataset有三个接口:分别是img_path、img_label、transform
img_path是图片的路径
img_label是图片的label
transform指的是对图片做一些转换

2. 这里需要理解pytorch的transform为什么可以对数据进行扩增?

pytorch的data augmentation实际上既可以直接在每个epoch上增加数据量,或者因为transform中包括random的操作,即每个epoch还是原来的数据量,但是每个epoch得到的训练数据不尽相同,多个epoch之后相当于完成了data augmentation

3. 有了dataset,为什么还需要dataloader?

先理解几个概念:
(1)Epoch: 所有训练样本都已输入到模型中,称为一个Epoch
(2) Iteration: 一批样本输入到模型中,称为一个Iteration
(3) Batchsize: 批大小, 决定一个Epoch有多少个Iteration

可以知道的是dataset只能一张张的读取图片,但是dataloader可以实现批量的读取数据。也就是说,DataLoader可以把样本分成多批顺序打乱的数据,每一个Batch_size里面的有多个样本且都是张量和标签的形式。训练模型的时候,可以迭代dataloader,将数据一批一批的给到模型,所有batch给完就是一个epoch。

你可能感兴趣的:(Task02-数据读取和数据扩增)