天天看點

ResNet全家桶

文章目錄

  • ​​ResNet​​
  • ​​ResNet中的Bottleneck結構和1*1卷積​​
  • ​​ResNet的網絡設計規律​​
  • ​​ResNext​​
  • ​​ResNeSt​​
  • ​​Res2Net​​
  • ​​PyConvResNet​​
  • ​​參考​​

ResNet

2015 年,ResNet 橫空出世,一舉斬獲 CVPR 2016 最佳論文獎,而且在 Imagenet 比賽的三個任務以及 COCO 比賽的檢測和分割任務上都獲得了第一名。四年過去,這一論文的被引量已超 40000 次.。

我們知道,增加網絡深度後,網絡可以進行更加複雜的特征提取,是以更深的模型可以取得更好的結果。但事實并非如此,人們發現随着網絡深度的增加,模型精度并不總是提升,并且這個問題顯然不是由過拟合(overfitting)造成的,因為網絡加深後不僅測試誤差變高了,它的訓練誤差竟然也變高了。作者提出,這可能是因為更深的網絡會伴随梯度消失/爆炸問題,進而阻礙網絡的收斂。作者将這種加深網絡深度但網絡性能卻下降的現象稱為退化問題(degradation problem)。

ResNet中的Bottleneck結構和1*1卷積

ResNet50起,就采用Bottleneck結構,主要是引入1x1卷積。我們來看一下這裡的1x1卷積有什麼作用:

  • 對通道數進行升維和降維(跨通道資訊整合),實作了多個特征圖的線性組合,同時保持了原有的特征圖大小;
  • 相比于其他尺寸的卷積核,可以極大地降低運算複雜度;
  • 如果使用兩個3x3卷積堆疊,隻有一個relu,但使用1x1卷積就會有兩個relu,引入了更多的非線性映射;
ResNet全家桶

我們來計算一下1*1卷積的計算量優勢:首先看上圖右邊的bottleneck結構,對于256維的輸入特征,參數數目:1x1x256x64+3x3x64x64+1x1x64x256=69632,如果同樣的輸入輸出次元但不使用1x1卷積,而使用兩個3x3卷積的話,參數數目為(3x3x256x256)x2=1179648。簡單計算下就知道了,使用了1x1卷積的bottleneck将計算量簡化為原有的5.9%,收益超高。

ResNet的網絡設計規律

ResNet全家桶

整個ResNet不使用dropout,全部使用BN。此外,回到最初的這張細節圖,我們不難發現一些規律和特點:

  • 受VGG的啟發,卷積層主要是3×3卷積;
  • 對于相同的輸出特征圖大小的層,即同一stage,具有相同數量的3x3濾波器;
  • 如果特征地圖大小減半,濾波器的數量加倍以保持每層的時間複雜度;(這句是論文和現場演講中的原話,雖然我并不了解是什麼意思)
  • 每個stage通過步長為2的卷積層執行下采樣,而卻這個下采樣隻會在每一個stage的第一個卷積完成,有且僅有一次。
  • 網絡以平均池化層和softmax的1000路全連接配接層結束,實際上工程上一般用自适應全局平均池化 (Adaptive Global Average Pooling);

從圖中的網絡結構來看,在卷積之後全連接配接層之前有一個全局平均池化 (Global Average Pooling, GAP) 的結構。

總結:

  • 相比傳統的分類網絡,這裡接的是池化,而不是全連接配接層。池化是不需要參數的,相比于全連接配接層可以砍去大量的參數。對于一個7x7的特征圖,直接池化和改用全連接配接層相比,可以節省将近50倍的參數,作用有二:一是節省計算資源,二是防止模型過拟合,提升泛化能力;
  • 這裡使用的是全局平均池化,但我覺得大家都有疑問吧,就是為什麼不用最大池化呢?這裡解釋很多,我查閱到的一些論文的實驗結果表明平均池化的效果略好于最大池化,但最大池化的效果也差不到哪裡去。實際使用過程中,可以根據自身需求做一些調整,比如多分類問題更适合使用全局最大池化(道聽途說,不作保證)。如果不确定話還有一個更保險的操作,就是最大池化和平均池化都做,然後把兩個張量拼接,讓後續的網絡自己學習權重使用。

為了更好地了解,大家看一下何凱明的現場演講,有助于更好地了解ResNet,CVPR2016 最佳論文, ResNet 現場演講:

​​​https://zhuanlan.zhihu.com/p/54072011​​

ResNext

ResNeXt是FAIR的大神們(恺明、Ross、Piotr等)對ResNet的改進。其關鍵核心子產品如下所示。盡管ResNeSt與ResNeXt比較類似,不過兩者在特征融合方面存在明顯的差異:ResNeXt采用一貫的Add方式,而ResNeSt則采用的Cat方式。這是從Cardinal角度來看,兩者的差別所在。這點差別也導緻了兩種方式在計算量的差異所在。其中,inception block人工設計痕迹比較嚴重,是以引入參數K,直接将子模型均分,有K個bottleneck組成。如下圖所示。

ResNet全家桶

ResNeSt

ResNeSt 提出了一種子產品化 Split-Attention 塊,可以将注意力分散到若幹特征圖組中。按照 ResNet 的風格堆疊這些 Split-Attention 塊,研究者得到了一個 ResNet 的新變體,稱為 ResNeSt。它保留了整體的 ResNet 結構,可直接用于下遊任務,但沒有增加額外的計算量。主要是基于 SENet,SKNet 和 ResNeXt,把 attention 做到 group level。

Split-Attention 塊:

Split-Attention 塊是一個由特征圖組和 split attention 運算組成的計算單元,下圖展示了 Split-Attention 塊的整體思路:

ResNet全家桶

特征圖組(Feature-map Group)

與 ResNeXt 塊一樣,輸入的特征圖可以根據通道維數被分為幾組,特征圖組的數量由一個基數超參數 K 給出,得到的特征圖組被稱為基數組(cardinal group)。研究者引入了一個新的底數超參數 R,該參數規定了基數組的 split 數量。

然後将塊輸入 X 根據通道維數 X = {X1, X2, …XG} 分為 G = KR 個組。在每個單獨的組中應用不同的變換 {F_1, F_2, …F_G},則每個組的中間表征為 Ui = Fi(Xi), i ∈ {1, 2, …G}。

ResNeSt 塊

随後,将基數組表征根據通道維數進行級聯:V = Concat{V^1 , V^2 , …V^K}。和标準殘差塊中一樣,如果輸入和輸出特征圖共享相同的形狀,則使用快捷連接配接生成 Split-Attention 塊的最終輸出 Y,Y = V +X。對于步幅較大的塊,将适當的變換 T 應用于快捷連接配接以對齊輸出形狀:Y = V + T(X)。T 可以是跨步卷積或帶有池化的組合卷積。

圖 1 展示了 ResNeSt 塊與 SE-Net 和 SK-Net 塊的整體對比。圖 1 右為 Split-Attention 塊的執行個體,組變換 F_i 是 1×1 卷積,然後是 3×3 卷積,注意力權重函數 G 使用兩個帶有 ReLU 激活函數的全連接配接層進行參數化。

ResNet全家桶

Split-Attention 的細節可參考圖 2。

ResNet全家桶

Res2Net

對于許多視覺任務來說,在多個尺度上表示特征是非常重要的。近年來,背骨神經網絡(CNNs)的發展不斷顯示出更強的多尺度表示能力,進而在廣泛的應用中獲得一緻的性能提升。然而,大多數現有的方法都是在一個層中表示多尺度特征明智的方式。在本文中,我們提出了一種新的CNNs建構塊,即Res2Net,通過在一個殘差塊内構造層次殘差類連接配接。Res2Net代表了粒度級别的多尺度特性,并增加了每個網絡層的接受域範圍。建議的Res2Net塊可以插入到最先進的CNN骨幹模型,例如。、ResNet、ResNeXt和DLA。我們在所有這些模型上評估了Res2Net塊,并展示了一緻的性能改進在廣泛使用的資料集(如CIFAR-100和ImageNet)上建立超過基線的模型。針對典型的計算機視覺任務,如目标檢測、類激活映射和突出目标檢測,進一步的消融研究和實驗結果進一步驗證了Res2Net相對于最先進的基線方法的優越性。源代碼和經過訓練的模型将公開可用。

論文不像SSD或特征金字塔網絡(FPN)采用層間多尺度特征表達的方式,而是在resnet的基礎上,對resnet的block串行的濾波器堆疊結構改進,增加了多尺度融合,提高了網絡的複雜度和性能。

模型結構

多尺度表示對于各種視覺任務都是必不可少的,比如感覺目标對象的邊界、區域和語義類别。即使是最簡單的識别對于了解部件、對象(例如,本例中的沙發、桌子和杯子)及其周圍的上下文(例如,“在桌子上”上下文有助于識别黑色斑點)來說,從非常不同的尺度感覺資訊是至關重要的。

ResNet全家桶

res2net的模型結構block如下圖所示:

ResNet全家桶

網絡将原來串行的方式,通過在通道上進行拆分,不同尺度特征的提取,在融合特征,提高網絡的複雜度和表達能力。上圖表示在一個block中有4個尺度。

同時,參考​​Squeeze-and-excitation networks​​​,作者在原有的基礎上加了一個SE block,能夠自适應的矯正通道之間的權重,也即是不同尺度特征資訊之間的權重。于是新的模型為:

ResNet全家桶

整個流程為:

  • 通道拆分
  • 不同通道不同尺度的特征計算和融合
  • SE block進行在channel上自适應權重調整
  • 殘差連接配接

實驗結果

ResNet全家桶

PyConvResNet

該文提出一種金字塔卷積(Pyramidal Convolution, PyConv),它可以在多個濾波器尺度對輸入進行處理。PyConv包含一個核金字塔,每一層包含不同類型的濾波器(濾波器的大小與深度可變,是以可以提取不同尺度的細節資訊)。除了上述提到的可以提取多尺度資訊外,相比标準卷積,PyConv實作高效,即不會提升額外的計算量與參數量。更進一步,它更為靈活并具有可擴充性,為不同的應用提升了更大的架構設計空間。

PyConv幾乎可以對每個CV任務都有正面影響,作者基于PyConv對四大主流任務(圖像分類、視訊分類、目标檢測以及語義分割)進行了架構設計。相比baseline,所提方法取得了一緻性的性能提升。比如在圖像分類任務上,所提50層模型優于ResNet152,同時具有更少的參數量(2.39x-fewer)、計算複雜度(2.52x-fewer)以及更少的層數和;在語義分割任務上,它在ADE20K資料集上名額達到SOTA(注:好像并不如ResNeSt的名額)。

首先,我們先來說明一下已有CNN網絡架構在感受野方面存在的兩個問題:

  • 盡管目前主流CNN網絡架構理論具有非常大的感受野(包含輸入的大部分、甚至全含整個輸入),但是有研究表明:實際CNN的感受野要比理論小的多(2.7x-less);
  • 已有的下采樣方案(如池化、stride卷積)會造成資訊的損失,進而影響模型的性能。

然後,我們再來簡單介紹一下實際場景中物體的尺度資訊。以下圖為例,包含室内與室外兩個場景及其對應的語義标簽。從圖中可以看到:部分物體具有非常大的空間形式(比如建築物、樹以及沙發),部分物體具有非常小的空間表現形式(比如行人、書本等)。甚至同一物體具有非常大的可變的空間變現形式(比如室外場景中的汽車)。

ResNet全家桶

上述這種空間變大巨大的表現形式是标準卷積所無法有效提取的,而CV的終極目标是:提取輸入的多尺度資訊。在這方面最為知名的當屬SIFT,它可以從不同尺度提取特征描述算子。然而深度學習中的卷積卻并未具有類似SIFT這種提取多尺度特征的能力。

最後,我們再來說明一下作者為解決上述挑戰而提出的幾點創新:

  • 作者引入一種金字塔卷積(PyConv),它包含不同尺度與深度的卷積核,進而確定了多尺度特征的提取;
  • 作者為圖像分類任務提出了兩種網絡架構并以極大優勢優于baseline,同時具有更少的參數量與計算複雜度;
  • 作者為語義分割任務提出了一個新的架構:一種新穎的Head用于對backbone提取的特征可以從局部到全局進行上下文資訊特征提取,并在場景解析方面取得了SOTA性能;
  • 作者基于PyConv而設計的網絡架構在目标檢測與視訊分類任務上取得了性能的極大提升。

網絡結構

ResNet全家桶

上圖b給出了所提PyCOnv的示意圖,它包含一個由n層不同類型核構成的金字塔。PyConv的目标是:在不提升計算複雜或參數量的前提下采用多尺度核對輸入進行處理。PyConv每一層的核包含不同的空間尺寸(自下而上提升),随卷積核的提升而逐漸降低核的深度。

為使PyConv在不同層使用不同深度的卷積核,需要将輸入特征劃分為不同的組并獨立的進行卷積計算,稱之為組卷積(見下圖示例)。不知各位有沒有覺得這個思想跟谷歌的MixNet思想非常相似,MixNet中也是采用了類似組卷積方式進行不同尺寸卷積核計算,文末附對比分析。

ResNet全家桶

但是,需要注意哈:組卷積中每組的通道數是相同的。MixNet中的也是相同的,而PyConv則是不相同的,可以說MixNet是PyConv的一個特例。每組特征通道數上的差別構成MixConv與PyConv的最大差別所在。

在實際應用時,作者為PyConv添加了額外的規則:每一層的通道數應當是相同的。這也就要求了PyConv的輸入通道數應當是2的幂次。

所提PyConv具有這樣幾個優點:

  • Multi-scale Processing. 這個特性是非常明顯的,卷積核尺寸是多尺度的嘛;
  • Efficiency. PyConv可以通過并行的方式進行計算,是以計算高效(組卷積在GPU上的效率好像并不高,反而更适合CPU);
  • Flexibility. 由于具有與标準卷積相近的參數量和計算複雜度,那麼使用者可以更靈活的去調節PyConv的超參數(比如層數、不同層的輸出通道數,不同深度設定不同的PyConv參數、不同層采用不同的組數)。注:這一點又跟MixNe相似了,MixNet通過NAS方式進行搜尋的。

參考

繼續閱讀