數據增強之mixup算法詳解


論文地址:mixup: BEYOND EMPIRICAL RISK MINIMIZATION

(一)、什么是數據增強?
(1). 數據增強主要指在計算機視覺領域中對圖像進行數據增強,從而彌補訓練圖像數據集不足,達到對訓練數據擴充的目的。
(2). 數據增強是一種數據擴充方法,可分為同類增強(如:翻轉、旋轉、縮放、移位、模糊等)和混類增強(如mixup)兩種方式。

(二)、同類數據增強方式主要有哪些?
(1). 翻轉Flip
可分為水平翻轉,垂直翻轉

(2). 旋轉Rotation

(3). 縮放Scale(向外縮放,向內縮放)
向外縮放時,最終圖像尺寸將大於原始圖像尺寸,大多數圖像框架從新圖像中剪切出一個部分,其大小等於原始圖像。而向內縮放,因為它會縮小圖像大小,迫使我們對超出邊界的內容做出假設。

(4). 隨機裁剪(Random Crop)
與縮放不同,隨機裁剪只是從原始圖像中隨機抽樣一個部分,然后我們將此部分的大小調整為原始圖像大小。

(5). 移位(Translation)
移位只涉及沿X或Y方向(或兩者)移動圖像。這種增強方法非常有用,因為大多數對象幾乎可以位於圖像的任何位置,移位時我們需要對邊界作出假設。

(6). 模糊(Gaussian Noise)
當您的神經網絡試圖學習可能無用的高頻特征(大量出現的特征)時,通常會發生過擬合。具有零均值的高斯噪聲基本上在所有頻率中具有數據點,從而有效地扭曲高頻特征。但是這也意味着較低頻率的數據(通常是您的預期數據)也會失真,但您的神經網絡可以學會超越它。添加適量的噪聲可以增強網絡學習能力。

(三)、mixup混類數據增強方式
(1). mixup介紹
mixup是一種運用在計算機視覺中的對圖像進行混類增強的算法,它可以將不同類之間的圖像進行混合,從而擴充訓練數據集。

(2). mixup原理
假設b a t c h x 1 batch_{x1}batchx1是一個b a t c h batchbatch樣本,b a t c h y 1 batch_{y1}batchy1是該b a t c h batchbatch樣本對應的標簽;b a t c h x 2 batch_{x2}batchx2是另一個b a t c h batchbatch樣本,b a t c h y 2 batch_{y2}batchy2是該b a t c h batchbatch樣本對應的標簽,λ \lambdaλ是由參數為α \alphaα,β \betaβ的貝塔分布計算出來的混合系數,由此我們可以得到mixup原理公式為:λ = B e t a ( α , β ) (3.1) {\lambda=Beta(\alpha,\beta)\tag{3.1}}λ=Beta(α,β)(3.1)m i x e d _ b a t c h x = λ ∗ b a t c h x 1 + ( 1 − λ ) ∗ b a t c h x 2 (3.2) mixed\_ batch_x=\lambda*batch_{x1}+(1-\lambda)*batch_{x2}\tag{3.2}mixed_batchx=λbatchx1+(1λ)batchx2(3.2)m i x e d _ b a t c h y = λ ∗ b a t c h y 1 + ( 1 − λ ) ∗ b a t c h y 2 (3.3) {mixed\_batch_y=\lambda*batch_{y1}+(1-\lambda)*batch_{y_2}}\tag{3.3}mixed_batchy=λbatchy1+(1λ)batchy2(3.3)其中B e t a BetaBeta指的是貝塔分布,m i x e d _ b a t c h x mixed\_batch_xmixed_batchx是混合后的b a t c h batchbatch樣本,m i x e d _ b a t c h y mixed\_batch_{y}mixed_batchy是混合后的b a t c h batchbatch樣本對應的標簽。

需要說明幾點:
1.在論文作者多組實驗中,無論如何設置α \alphaα,β \betaβ的值,期望α α + β \frac{\alpha}{\alpha+\beta}α+βα始終近似為0.5。這可能是由於權重λ \lambdaλ在每個batch樣本都會隨機產生,在整個訓練過程中會有N個batch,權重在N個batch中期望近似為0.5。所以作者認為產生b a t c h x 1 batch_{x1}batchx1b a t c h x 2 batch_{x2}batchx2樣本混合權重λ \lambdaλ的Beta分布參數α = β = 0.5 \alpha=\beta=0.5α=β=0.5時,算法效果相對較好。Beta分布如下圖:
在這里插入圖片描述

3.1 Beta分布

 

 
2.b a t c h x 1 batch_{x1}batchx1b a t c h x 2 batch_{x2}batchx2沒有太多的限制,當b a t c h   s i z e batch\ sizebatch size=1時,就是兩張圖片樣本混合;當b a t c h   s i z e batch\ sizebatch size>1時,便是兩個b a t c h batchbatch圖片樣本兩兩對應混合。此外,b a t c h x 1 batch_{x1}batchx1b a t c h x 2 batch_{x2}batchx2可以是同一批樣本,也可以是不同批樣本。一般在代碼實現過程中,兩個b a t c h batchbatch圖片是同一批樣本,唯一不同的是,b a t c h x 1 batch_{x1}batchx1是原始b a t c h batchbatch圖片樣本,而b a t c h x 2 batch_{x2}batchx2是對b a t c h x 1 batch_{x1}batchx1b a t c h   s i z e batch\ sizebatch size維度進行shuffle后得到的。

3.mixup原理大致如上,在實際代碼實現過程中可能略有不同,需要靈活處理。

(3). mixup代碼實現
mixup代碼實現部分如下:

###############################author:qiu################################# ########################修改位置1:config.configurations######################### #在代碼配置config中添加以下鍵值信息: USE_MIXUP=True, #是否使用mixup方法增強數據集 MIXUP_ALPHA = 0.5,#add mixup alpha ,用於beta分布 ########################################################################## #######################修改位置2:添加mixup.py文件############################ import numpy as np import torch import torch.nn as nn from loss.focal import FocalLoss LOSS=FocalLoss() def criterion(batch_x, batch_y, alpha=1.0, use_cuda=True): ''' batch_x:批樣本數,shape=[batch_size,channels,width,height] batch_y:批樣本標簽,shape=[batch_size] alpha:生成lam的beta分布參數,一般取0.5效果較好 use_cuda:是否使用cuda returns: mixed inputs, pairs of targets, and lam ''' if alpha > 0: #alpha=0.5使得lam有較大概率取0或1附近 lam = np.random.beta(alpha, alpha) else: lam = 1 batch_size = batch_x.size()[0] if use_cuda: index = torch.randperm(batch_size).cuda() else: index = torch.randperm(batch_size) #生成打亂的batch_size索引 #獲得混合的mixed_batchx數據,可以是同類(同張圖片)混合,也可以是異類(不同圖片)混合 mixed_batchx = lam * batch_x + (1 - lam) * batch_x[index, :] """ Example: 假設batch_x.shape=[2,3,112,112],batch_size=2時, 如果index=[0,1]的話,則可看成mixed_batchx=lam*[[0,1],3,112,112]+(1-lam)*[[0,1],3,112,112]=[[0,1],3,112,112],即為同類混合 如果index=[1,0]的話,則可看成mixed_batchx=lam*[[0,1],3,112,112]+(1-lam)*[[1,0],3,112,112]=[batch_size,3,112,112],即為異類混合 """ batch_ya, batch_yb = batch_y, batch_y[index] return mixed_batchx, batch_ya, batch_yb, lam def mixup_criterion(criterion, inputs, batch_ya, batch_yb, lam): return lam * criterion(inputs, batch_ya) + (1 - lam) * criterion(inputs, batch_yb) ########################################################################## #####################修改位置3:train.py文件修改代碼如下###################### if torch.cuda.is_available() and DEVICE.type=="cuda": #add inputs, targets = inputs.cuda(), targets.cuda() else: inputs = inputs.to(DEVICE) targets = targets.to(DEVICE).long() if cfg['USE_MIXUP']: inputs, targets_a, targets_b, lam = mixup.mixup_data( inputs,targets,cfg["MIXUP_ALPHA"], torch.cuda.is_available()) #映射為Variable inputs, targets_a, targets_b = map(Variable, (inputs,targets_a,targets_b)) #抽取特征,BACKBONE為粗特征抽取網絡 features = BACKBONE(inputs) #抽取特征,HEAD為精細的特征抽取網絡 outputs = mixup.mixup_criterion(HEAD, features, targets_a, targets_b, lam) loss = mixup.mixup_criterion(LOSS, outputs, targets_a, targets_b, lam) else: features = BACKBONE(inputs) outputs = HEAD(features, targets) loss = FocalLoss(outputs, labels) ##########################################################################


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM