<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          小白學(xué)圖像 | Group Normalization詳解+PyTorch代碼

          共 3296字,需瀏覽 7分鐘

           ·

          2020-08-15 02:50

          本文轉(zhuǎn)載自 機(jī)器學(xué)習(xí)煉丹術(shù),作者機(jī)器學(xué)習(xí)煉丹術(shù)


          文章目錄:

          • 1 BN的優(yōu)點(diǎn)

          • 2 BN的缺點(diǎn)

            • 2.1 受限于Batch size

            • 2.2 訓(xùn)練集與測(cè)試集的分布

          • 3 Group Normalzation

          • 4 PyTorch實(shí)現(xiàn)GN

          總的來說,GN是對(duì)BN的改進(jìn),是IN和LN的均衡。

          1 BN的優(yōu)點(diǎn)

          這里簡(jiǎn)單的介紹一下BN,在之前的文章中已經(jīng)詳細(xì)的介紹了BN算法和過程。

          BN于2015年由 Google 提出,Google在ICML論文中描述的非常清晰,即在每次SGD時(shí),通過mini-batch來對(duì)相應(yīng)的activation做規(guī)范化操作,使得結(jié)果(輸出信號(hào)各個(gè)維度)的均值為0,方差為1。最后的“scale and shift”操作則是為了訓(xùn)練所需而“刻意”加入的BN能夠有可能還原最初的輸入,從而保證數(shù)據(jù)中有用信息的留存。

          【BN的好處】

          1. BN使得網(wǎng)絡(luò)中每層輸入數(shù)據(jù)的分布相對(duì)穩(wěn)定,加速模型學(xué)習(xí)速度;

          2. BN使得模型對(duì)網(wǎng)絡(luò)中的參數(shù)不那么敏感,簡(jiǎn)化調(diào)參過程,使得網(wǎng)絡(luò)學(xué)習(xí)更加穩(wěn)定;

          3. BN允許網(wǎng)絡(luò)使用飽和性激活函數(shù)(例如sigmoid,tanh等),緩解梯度消失問題;

          4. 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 最合適。】

          但對(duì)于目標(biāo)檢測(cè),語義分割,視頻場(chǎng)景等,輸入圖像尺寸比較大,而限于GPU顯卡的顯存限制,導(dǎo)致無法設(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ì)算出來的均值和方差 (這一部分沒有看懂的話,可能需要去看一下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無關(guān),因此對(duì)于高精度圖片小BatchSize的情況也是非常穩(wěn)定的,

          下圖是比較BN和GN在Batch Size越來越小的變化中,模型錯(cuò)誤率變化的對(duì)比圖:

          因此在實(shí)驗(yàn)的時(shí)候,可以在嘗試使用GN來代替BN哦~

          其實(shí)不難發(fā)現(xiàn),GN和LN是存在一定的關(guān)系的。

          上圖中有四種Normalization的方法。就先從最簡(jiǎn)單的Instance Normalization開始分析:

          • IN:僅僅對(duì)每一個(gè)圖片的每一個(gè)通道最歸一化。也就是說,對(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ì)算出來一個(gè)均值方差。

          在GN的論文中,給出了GN推薦的group Number:

          • 第一個(gè)表格展示GN的group Number不斷減小,退化成LN的過程。其實(shí),分組32個(gè)group效果最好;
          • 第二個(gè)表格展示GN的每一組的channel數(shù)目不斷減小,退化成IN的過程。每一組16個(gè)channel的效果最好我個(gè)人在項(xiàng)目中也會(huì)有優(yōu)先嘗試16個(gè)通道為一組的這種參數(shù)設(shè)置。

          4 PyTorch實(shí)現(xiàn)GN

          import?numpy?as?np
          import?torch
          import?torch.nn?as?nn


          class?GroupNorm(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

          ????def?forward(self,?x):
          ????????N,C,H,W?=?x.size()
          ????????G?=?self.num_groups
          ????????assert?C?%?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)然,你要是想問PyTorch是否已經(jīng)集成了GN?那必然的。下面的代碼比較了PyTorch集成的GN和我們手算的GN的結(jié)果。

          import?torch
          import?torch.nn?as?nn

          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=)
          Parameter?containing:
          tensor([1.,?1.,?1.,?1.,?1.,?1.,?1.,?1.,?1.,?1.],?requires_grad=True)
          Parameter?containing:
          tensor([0.,?0.,?0.,?0.,?0.,?0.,?0.,?0.,?0.,?0.],?requires_grad=True)
          tensor(0.4595,?grad_fn=)
          - END -


          機(jī)器視覺 CV

          與你分享 AI 和 CV 的樂趣

          分享數(shù)據(jù)集、電子書、免費(fèi)GPU

          長(zhǎng)按二維碼關(guān)注我們

          瀏覽 54
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲一线在线 | 又黄又爽的视频 | 青草青青在线观看网站入口 | 99 在线免费观看 | 国产精品成人7777777 |