Pytorch小技巧-數據增強(上)

  • 2019 年 12 月 5 日
  • 筆記

目前深度學習神經網路對數據的要求很高,不進數據要相關,且更要有儘可能大的數據集。

那麼在現實生活中,想要得到大量的數據,不僅要收集各種情景下、各種角度、各個位置的照片,還有確保數據的多樣性。

只有這樣才能確保神經網路學到更加全面的特徵。

但在現實中若想達到以上目的往往要付出巨大的代價,並且還有對照片上出現的東西進行準確標註,另外對於一些稀有的物種的資訊收集更是十分困難。

因此本節介紹一些為神經網路提供更多數據的方法-數據增強。

數據增強有多種手段,包括對原照片進行旋轉、拉伸、加雜訊等處理。

其實在之前所講課程中就已經講了數據增強的方法,

如在數據中加入shuffle=True,將原數據隨機打亂,並沒有增加照片的數量。但本文所講的是在原照片數據量較少的情況下進行數據增強,以加入一些經過旋轉、拉伸等處理後的圖片。

要注意的是採用這種方法加入的數據肯定沒有新圖片效果好,因為其本質上仍是原圖片。

如下圖所示

數據增強手段包括有:(1)Flip(圖片翻轉)、(2)Rotate(旋轉)、(3)Random Move & Crop(隨機移動、裁剪)、(4)GAN(GAN神經網路)。

首先看數據翻轉

如上圖所示原圖片黃人在右邊,經過翻轉後黃人在左面,再經過上下翻轉後,整個圖片倒立。

程式碼實現方式如下

import torch  import torch.nn  import torch.nn.functional as F    train_loader = torch.utils.data.DataLoader(      datasets.MNIST('data', train=True, download=True,                     transform=transforms.Compose([                         transforms.RandomHorizontalFlip(),                         # transforms.RandomHorizontalFlip()為水平翻轉                         transforms.RandomVerticalFlip(),                         # transforms.RandomHorizontalFlip()為上下翻轉                         transforms.ToTensor(),                     ])),       batch_size=batch_size, shuffle=True)

旋轉操作也十分常見

上面分別經過了90°、180°、270°的旋轉。

它的程式碼實現方 式也十分簡單

import torch  import torch.nn  import torch.nn.functional as F    train_loader = torch.utils.data.DataLoader(      datasets.MNIST('data', train=True, download=True,                     transform=transforms.Compose([                         transforms.RandomHorizontalFlip(),                         # transforms.RandomHorizontalFlip()為水平翻轉                         transforms.RandomVerticalFlip(),                         # transforms.RandomHorizontalFlip()為上下翻轉                         transforms.RandomRotation(15),                         # 隨機旋轉了-15°至15°                         transforms.ToTensor(),                         transforms.RandomRotation([90, 180, 270]),                         # 或者自定義旋轉了90°, 180°, 270°                     ])),       batch_size=batch_size, shuffle=True)