1 BN的優(yōu)點(diǎn)
這里簡(jiǎn)單的介紹一下BN,在之前的文章中已經(jīng)詳細(xì)的介紹了BN算法和過(guò)程。
BN于2015年由 Google 提出,Google在ICML論文中描述的非常清晰,即在每次SGD時(shí),通過(guò)mini-batch來(lái)對(duì)相應(yīng)的activation做規(guī)范化操作,使得結(jié)果(輸出信號(hào)各個(gè)維度)的均值為0,方差為1。最后的“scale and shift”操作則是為了訓(xùn)練所需而“刻意”加入的BN能夠有可能還原最初的輸入,從而保證數(shù)據(jù)中有用信息的留存。
【BN的好處】
BN使得網(wǎng)絡(luò)中每層輸入數(shù)據(jù)的分布相對(duì)穩(wěn)定,加速模型學(xué)習(xí)速度;
BN使得模型對(duì)網(wǎng)絡(luò)中的參數(shù)不那么敏感,簡(jiǎn)化調(diào)參過(guò)程,使得網(wǎng)絡(luò)學(xué)習(xí)更加穩(wěn)定;
BN允許網(wǎng)絡(luò)使用飽和性激活函數(shù)(例如sigmoid,tanh等),緩解梯度消失問(wèn)題;
BN具有一定的正則化效果。
2 BN的缺點(diǎn)
2.1 受限于Batch size
BN 沿著 batch 維度進(jìn)行歸一化,其受限于 Batch Size,當(dāng) Batch Size 很小時(shí),BN 會(huì)得到不準(zhǔn)確的統(tǒng)計(jì)估計(jì),會(huì)導(dǎo)致模型誤差明顯增加
【一般每塊 GPU 上 Batch Size =32 最合適?!?/p>
但對(duì)于目標(biāo)檢測(cè),語(yǔ)義分割,視頻場(chǎng)景等,輸入圖像尺寸比較大,而限于GPU顯卡的顯存限制,導(dǎo)致無(wú)法設(shè)置較大的 Batch Size,如 經(jīng)典的Faster-RCNN、Mask R-CNN 網(wǎng)絡(luò)中,由于圖像的分辨率較大,Batch Size 只能是 1 或 2.
2.2 訓(xùn)練集與測(cè)試集的分布
BN處理訓(xùn)練集的時(shí)候,采用的均值和方差是整個(gè)訓(xùn)練集的計(jì)算出來(lái)的均值和方差(這一部分沒(méi)有看懂的話,可能需要去看一下BN算法的詳解)
所以測(cè)試和訓(xùn)練的數(shù)據(jù)分布如果存在差異,那么就會(huì)導(dǎo)致訓(xùn)練和測(cè)試之間存在不一致現(xiàn)象(Inconsistency)。
3 Group Normalzation
Group Normalization(GN)是由2018年3月份何愷明團(tuán)隊(duì)提出,GN優(yōu)化了BN在比較小的mini-batch情況下表現(xiàn)不太好的劣勢(shì)。
Group Normalization(GN) 則是提出的一種 BN 的替代方法,其是首先將 Channels 劃分為多個(gè) groups,再計(jì)算每個(gè) group 內(nèi)的均值和方法,以進(jìn)行歸一化。GB的計(jì)算與Batch Size無(wú)關(guān),因此對(duì)于高精度圖片小BatchSize的情況也是非常穩(wěn)定的,
下圖是比較BN和GN在Batch Size越來(lái)越小的變化中,模型錯(cuò)誤率變化的對(duì)比圖:
因此在實(shí)驗(yàn)的時(shí)候,可以在嘗試使用GN來(lái)代替BN哦~
其實(shí)不難發(fā)現(xiàn),GN和LN是存在一定的關(guān)系的。
上圖中有四種Normalization的方法。就先從最簡(jiǎn)單的Instance Normalization開(kāi)始分析:
IN:僅僅對(duì)每一個(gè)圖片的每一個(gè)通道最歸一化。也就是說(shuō),對(duì)【H,W】維度做歸一化。假設(shè)一個(gè)特征圖有10個(gè)通道,那么就會(huì)得到10個(gè)均值和10個(gè)方差;要是一個(gè)batch有5個(gè)樣本,每個(gè)樣本有10個(gè)通道,那么IN總共會(huì)計(jì)算出50個(gè)均值方差;
LN:對(duì)一個(gè)特征圖的所有通道做歸一化。5個(gè)10通道的特征圖,LN會(huì)給出5個(gè)均值方差;
GN:這個(gè)是介于LN和IN之間的一種方法。假設(shè)Group分成2個(gè),那么10個(gè)通道就會(huì)被分成5和5兩組。然后5個(gè)10通道特征圖會(huì)計(jì)算出10個(gè)均值方差。
BN:這個(gè)就是對(duì)Batch維度進(jìn)行計(jì)算。所以假設(shè)5個(gè)100通道的特征圖的話,就會(huì)計(jì)算出100個(gè)均值方差。5個(gè)batch中每一個(gè)通道就會(huì)計(jì)算出來(lái)一個(gè)均值方差。
在GN的論文中,給出了GN推薦的group Number:
第一個(gè)表格展示GN的group Number不斷減小,退化成LN的過(guò)程。其實(shí),分組32個(gè)group效果最好;
第二個(gè)表格展示GN的每一組的channel數(shù)目不斷減小,退化成IN的過(guò)程。每一組16個(gè)channel的效果最好,我個(gè)人在項(xiàng)目中也會(huì)有優(yōu)先嘗試16個(gè)通道為一組的這種參數(shù)設(shè)置。
4 PyTorch實(shí)現(xiàn)GN
importnumpyasnp importtorch importtorch.nnasnn classGroupNorm(nn.Module): def__init__(self,num_features,num_groups=32,eps=1e-5): super(GroupNorm,self).__init__() self.weight=nn.Parameter(torch.ones(1,num_features,1,1)) self.bias=nn.Parameter(torch.zeros(1,num_features,1,1)) self.num_groups=num_groups self.eps=eps defforward(self,x): N,C,H,W=x.size() G=self.num_groups assertC%G==0 x=x.view(N,G,-1) mean=x.mean(-1,keepdim=True) var=x.var(-1,keepdim=True) x=(x-mean)/(var+self.eps).sqrt() x=x.view(N,C,H,W)
當(dāng)然,你要是想問(wèn)PyTorch是否已經(jīng)集成了GN?那必然的。下面的代碼比較了PyTorch集成的GN和我們手算的GN的結(jié)果。
importtorch importtorch.nnasnn x=torch.randn([2,10,3,3])+1 #Torch集成的方法 m=torch.nn.GroupNorm(num_channels=10,num_groups=2) #先計(jì)算前面五個(gè)通道的均值 firstDimenMean=torch.Tensor.mean(x[0,0:5]) #先計(jì)算前面五個(gè)通道的方差 firstDimenVar=torch.Tensor.var(x[0,0:5],False) #減去均值乘方差 y2=((x[0][0][0][1]-firstDimenMean)/(torch.pow(firstDimenVar+m.eps,0.5)))*m.weight[0]+m.bias[0] print(y2) y1=m(x) print(m.weight) print(m.bias) print(y1[0,0,0,1])
輸出結(jié)果:
tensor(0.4595,grad_fn=
-
Google
+關(guān)注
關(guān)注
5文章
1765瀏覽量
57536 -
圖像
+關(guān)注
關(guān)注
2文章
1084瀏覽量
40468 -
pytorch
+關(guān)注
關(guān)注
2文章
808瀏覽量
13226
原文標(biāo)題:小白學(xué)圖像 | Group Normalization詳解+PyTorch代碼
文章出處:【微信號(hào):Unfinished_coder,微信公眾號(hào):機(jī)器視覺(jué)CV】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論