pytorch 卷积神经网络之数据增强

参考链接:
1.https://blog.csdn.net/weixin_40793406/article/details/84867143
2.https://blog.csdn.net/Robin_Ge/article/details/87694598
3.https://blog.csdn.net/lanmengyiyu/article/details/79658545
4.https://blog.csdn.net/yt4766269/article/details/77923422
5.https://blog.csdn.net/zxyhhjs2017/article/details/80924210

一、数据增强

卷积神经网络非常容易出现过拟合的问题,而数据增强的方法是对抗过拟合问题的一个重要方法。
2012 年 AlexNet 在 ImageNet 上大获全胜,图片增强方法功不可没,因为有了图片增强,使得训练的数据集比实际数据集多了很多’新’样本,减少了过拟合的问题。

  • 1. 常用的数据增强方法

(1)对图片进行一定比例缩放 Resize
(2)对图片进行随机位置的截取
torchvision.transforms.RandomCrop() 传入的参数就是截取出的图片的长和宽,对图片在随机位置进行截取;torchvision.transforms.CenterCrop(),同样传入介曲初的图片的大小作为参数,会在图片的中心进行截取。
(3)对图片进行随机的水平和竖直翻转
随机水平翻转torchvision.transforms.RandomHorizontalFlip()
随机竖直翻转torchvision.transforms.RandomVerticalFlip()
(4)对图片进行随机角度的旋转
torchvision.transforms.RandomRotation()
其中第一个参数就是随机旋转的角度,比如填入 10,那么每次图片就会在 -10 ~ 10 度之间随机旋转。
(5)高斯噪声
在图像中随机加入少量的噪声。该方法对防止过拟合比较有效,这会让神经网络不能拟合输入图像的所有特征。
(6)对图片进行亮度、对比度和颜色的随机变化
可以设置亮度变化,对比度变化和颜色变化等,在 torchvision 中主要使用torchvision.transforms.ColorJitter() 来实现的,第一个参数就是亮度的比例,第二个是对比度,第三个是饱和度,第四个是颜色。
-色彩抖动指的是在颜色空间如RGB中,每个通道随机抖动一定的程度。在实际的使用中,该方法不常用,在很多场景下反而会使实验结果变差。

  • 2. 常用组合示例

  • import torchvision.transforms as transforms
    from torch.utils.data import Dataset

  • img_aug = transforms.Compose([
    transforms.RandomResizedCrop(224), # 对图片尺寸做一个缩放切割
    transforms.RandomHorizontalFlip(), # 水平翻转
    transforms.ToTensor(), # 转化为张量
    transforms.Normalize((.5, .5, .5), (.5, .5, .5)) # 进行归一化
    ])
    train1 = dataset_view1(train1, ‘train’,transform=img_aug)
    traindataloaders = torch.utils.data.DataLoader(train1 , batch_size=16, shuffle=True)

  • 3.技术细节

  • 从dataloader中获取训练数据的时候(获取每个epoch的时候),pytorch会把下面Compose里面的transform都做一遍。但是由于里面有的操作有random属性(RandomHorizontlFlip有随机属性,有的epoch做有的epoch不做),所以每个epoch对图片的处理方式都不尽相同,所以达到了数据增强的目的,然而每个epoch的图片数量是不变化的。

  • 如果你是CenterCrop操作因为这是一个确定的操作,就是每个图片在输进模型的时都进行中间裁剪,不论多少个epoch还是相当于在训练这100个图片。但如果是概率为0.5的randomCrop操作,因为这个随机属性的存在每个epoch拿到的训练数据都不尽相同(有的epoch进行了裁剪,有的epoch没有进行裁剪,但是每个epoch的训练数据都是100个),在多个epoch之后相当于你用200张图片在训练,达到了数据增强的目的。

  • 如果是FiveCrop和TenCrop操作又和上面两种Crop机制不同,这两个才是直接增加每个epoch的数量,将每个epoch中的数量增加为了500张和1000张。

  • 4.数据增强原因
    随着神经网络的加深,需要学习的参数也会随之增加,这样就会更容易导致过拟合,当数据集较小的时候,过多的参数会拟合数据集的所有特点,而非数据之间的共性。过拟合指的就是神经网络可以高度拟合训练数据的分布情况,但是对于测试数据来说准确率很低,缺乏泛化能力。除了数据增强,还有正则项/dropout等方式可以防止过拟合。

  • 5.可能出现的结果
    (1)一个小的数据集经过数据增强方法后,loss和accuracy反而都增加了。因为同样的网络结构可以拟合一个较大的数据集却不能拟合一个小的数据集。有人解释说,因为经过了数据增强之后dataset更容易学习了,所以虽然迭代次数一致,但是大的数据集更容易学习到收敛,小的数据集要学的慢一点,如果增加迭代次数,两者都将达到一个很高的拟合程度。也有人说这是因为加入了正则项的原因,导致小的数据集不能过拟合了。
    (2)在训练的时候,当batch_size不变时,经过了数据增强后的数据集更容易造成更大的波动。
    主要是因为,如果数据增强是把1张图片变为5张,batch_size都是5,那么在validation的时候,小数据集每个batchsize的5张图片都不同,因此全部的错误率很低,但是经过了数据增强后的数据集,有很大可能5张图片来自同一张或者两张原始图片,因此可能要对都对,要错都错,造成波动较大的现象。因此,我们可以对经过数据增强后的数据集训练的batchsize也增大到同样的倍数。

你可能感兴趣的:(pytorch 卷积神经网络之数据增强)