影象分類:常用分類網路結構(附論文下載)
加入極市 專業CV交流群,與 6000+來自騰訊,華為,百度,北大,清華,中科院 等名企名校視覺開發者互動交流!更有機會與 李開復老師 等大牛群內互動!
同時提供每月大咖直播分享、真實專案需求對接、乾貨資訊彙總,行業技術交流 。 點選文末“ 閱讀原文 ”立刻申請入群~
作者簡介
TeddyZhang :上海大學研究生 在讀 ,研究方向是影象分類、目標檢測以及人臉檢測與識別
本文整理了一般常用的影象特徵提取網路,下圖是筆者整理的近年來影象分類網路的論文以及所在期刊, 在極市平臺公眾號後臺回覆“ 影象分類 ”即可獲取下載連結。
下面來介紹幾種常用於分類問題的DNN,以及各自的特點,提取特徵的新思路!對於以後做研究或者分類任務有很大的用處! 本文篇幅較長,建議收藏閱讀~
(一)VGG Net、ResNet、ResNeXt、DenseNET、SE-Net
VGG Net (ICLR2015)
在VGG Net中,作者探討了7x7的卷積核和3x3的卷積核的區別?那麼我們使用3x3的卷積核,得到了什麼呢?第一,利用三個非線性的啟用層來代替一個,可以增加網路的鑑別能力,第二,單個7x7卷積核的引數量為 ,而三個級聯的3x3卷積核引數量為
, 引數量減少了大約81%。Model C中的1x1的卷積核也是一種增加非線性而不改變感受野的方法,額外增加非線性的方法就是啟用函式,由於VGG有16層和19層,已經屬於深層神經網路了,所以其引數量很大,130多兆了!
ResNet (CVPR2016)
ResNet由何凱明等人提出,為了去構建更加深的網路而提出的。從歷屆ImageNet冠軍看出,神經網路的層數是越來越多,那麼更深的網路其效能就更好麼?實驗發現並不是這樣,當網路層數過多後,會出現梯度消失的問題,從而網路會飽和導致精度下降。
所以作者提出了一種跳過連線的方式來解決這個問題,也就是我們把輸入跨層連線到下一層,通過網路的訓練讓其更加關注網路之間的變化,即殘差。
對於輸入輸出維度一致的,我們可以直接使用H(x)=f(x)+x來進行連線,如果維度不一致,也就是進行降取樣的時候,會使用1x1的卷積核去調整維度以及feature map的大小!
最後的resnet的效果圖,非常的漂亮!
ResNeXt (CVPR2017)
之前的ResNet關注的更多的是網路的深度,而同一時期的Inception系列關注更多的是網路的寬度,所以ResNeXt也開始在網路寬度上進行探索,並引入了一個cardinality的概念,主要利用的是分組卷積,什麼是分組卷積呢?我們通過兩張圖片來感受一下:
我們可以明顯的看出,經過分組卷積後,引數量減少了,舉一個例子,假如一個卷積層輸入通道為256,輸出通道也為256,正常卷積的話,引數量為256x3x3x256。但是如果進行分組卷積且組數為8的話,那麼每個組卷積的輸入和輸出通道均為32,共8組,那麼引數量為8x32x3x3x32,引數量降低了8倍。然後將每個組的輸出進行concate,這樣可以增加捲積核之間的相關性,並防止過擬合。當然這個分組處理的方式還很多,不限於concate。
如上圖,最後一種為分組卷積的方式,前面兩種也是作者嘗試的兩種結構。一般我們設定cardinality C=32, d=4,那麼引數量為:
大約70k FLOPs
我們經常見的ResNeXt-101(32x4d)就是深度為101的上面的網路結構。
DenseNet(CVPR 2017)
本篇論文從圖中可以看出,是對ResNet進行了改進,作者總結了一下近幾年的文章,在提高網路效能方面要麼網路越深,要麼網路越寬,但作者使用了一個更為激進的特徵重用策略,把ResNet的單層特徵重用擴充套件到多層,但引數量更少。相比於ResNet,其有很多優點,比如多層直接連線加強了特徵的傳遞,減輕了梯度消失的現象,減少了引數量!正是因為引數量的減少,其具有一定的防止過擬合的能力!
在ResNet中,一層的輸出直接與其輸入相加:
而,在DenseNet中,用concat的方式來替代相加的方式:
作者認為直接相加的方式會阻礙資訊在網路的流動,所以很簡單的實現就是將所有的feature map直接拼接。但這種直接的拼接方式會使得最後得到的featuremap通道數急劇增加,因此作者並沒有將這種方式應用到整個網路,而是設計成Dense Block,整個網路方式如下圖:
第一個圖中的growth rate也就是k,是指每個函式產生k個featuremap, 所以第 L 層就會有 個feature map,所以相比於其他網路,DenseNet可以擁有很窄的層,也就是說k可以很小,如12或者32。雖然每個卷積層只產生k個feature map, 但是由於多支路的跳過連線,因此輸入還是很多通道,如何解決呢?
1. Bottleneck Layers , 把每個卷積層設計成效率更高的形式,也就是先使用1x1的卷積核進行降維到4k的feature map,然後再送進3x3的卷積中,即BN-ReLU-Conv1x1-BN-ReLU-Conv3x3的結構,注意這是在DenseBlock內進行引數縮減,稱為DenseNet-B
2. Compression ,在每個DenseBlock相連線的地方,即transition layers,加入一個DenseBlock輸出m個feature map,那麼我們使用transition中的1x1卷積使其輸出為 , 論文中 ,稱為DenseNet-C
3. DenseNet-BC 為兩者操作均有的DenseNet
SE-Net (CVPR2018)
SE的全稱為Sequeeze-and-Excitation,SE block並不是一個完整的網路結構,而是一個子模組,可以嵌入到其他的分類或者檢測模型,其思想核心是通過網路根據loss函式去學習特徵權重,使得有效的feature map權重大,而無效的小一些,從而使得模型精度更高。
那麼SE block是怎麼去衡量featuremap的權重呢?其主要包括Squeeze和Excitation兩個部分,下面是其結構圖:
1. 操作 :這個在與其他網路結合時就是一個標準卷積操作而已,公式定義如下 , 其中X為原張量,U為後的輸出, 表示第c個卷積核。這就是一個單純的卷積操作!
2. 操作 :為了解決利用通道依賴性的問題,我們考慮輸出特徵的每一個通道,每個通道都有各自的區域性感受野,但這些資訊的相關性並不能被利用,為了解決這個問題,作者使用了一個global average pooling來生成每個通道的統計資訊,公式如下:
經過這個操作後,一個的張量就變成了
3. 操作:為了更好的利用上面操作產生的全域性資訊,我們必須遵守兩個標準,第一,他必須靈活,即在通道之間增加非線性。第二,要保證通道間的互斥關係,卷積核不可以重複了,因此進行兩次啟用函式。
4. 操作:經過上一個操作後張量尺度為1x1xC,但原圖的尺寸為HxWxC,所以我們需要一個變換尺度的操作,作者的操作也很簡單,如下:
可以看到,SE block還是十分強力的,厲害~~
下圖為SE-resnet的結構示意圖:
(二)輕量級網路
MobileNet (2017)
本篇文章是關於網路加速的問題,如何在保持精度的同時,使網路的速度大大提升,從而可以達到速度和精度的tradeoff,其論文主要提出了一個深度可分離卷積的方式(Depthwise Separable Convolutions),可以大大降低引數量!
假設我們使用 的卷積核,輸入為 的圖片,且輸出為
,那麼對於傳統卷積來說,其引數量為
而對於可分離卷積來說,首先進行一個depthwise conv(逐通道)的操作,即分別對輸入影象的每一個通道進行卷積,每個卷積核的輸出也是單通道,所以需要 M個 的卷積核,接著使用一個 pointwise conv(逐畫素)的操作,進行M通道的 特徵融合 ,並將通道數從 M變為N,這個過程就需要 N 個
的卷積核,其引數量為
這樣的話,其引數量由原來的相乘變為相加,即降低引數量百分比為
depthwise操作其實質就是一種G=輸入通道數的特殊分組卷積!!!
對比傳統卷積,其網路結構的變化為:
MobileNet的網路框架為:
MobileNet V2 (CVPR2018)
通過上面的講解,我們都知道了使用深度可分離卷積可以使得引數量大大降低,加入Kernel的大小為3x3,那麼相比傳統卷積可以降低8到9倍的引數量!
但是MobileNetV1的結構設計過於簡單,後續的很多網路證明了複用特徵的有效性,如ResNet和DenseNet, 所以在網路結構上面有很大的改進性!1. 因此作者重新設計了一個Inverted Residual block並加入了跳過連線的方式。2. 使用了Linear Bottlenecks,作者在實驗中發現非線性啟用層在低維空間容易改變輸入的資料結構,但Depthwise的操作正是低維空間,所以要去掉最後的非線性啟用層,並在Depthwise前加入一個線性結構,保持模型的表達能力。
下圖為ReLU函式在不同維度下的輸入,可以看到dim=2或3時變形很厲害。
總的來說:如果manifold of interest經過ReLU啟用後仍然非零,那麼這就相當於一個線性操作,ReLU也是有能力保留全部的輸入空間的資訊,但僅僅是輸入空間的低維子空間。
根據上面的原因,作者建議通過插入Linear Block到卷積層,從而保留非線性的同時避免丟失太多的資訊。因此MobileNet V2中的Block在卷積層中加入了Linear Block,然後還有跳過連線的方式。接著作者又探討了上圖C和D兩種結構的優劣性,也就是Linear Block放在那裡的問題!下圖為實驗結果:
實驗證明,加入Linear Block的有效性,並且C圖的結構形式優於D圖的結構形式,即
ShuffleNet (2017)
在講解這篇文章之前,我們首先回顧一下group convolution,它最早由AlexNet提出,當時是由於計算能力不足,然後在ResNeXt中,作者也使用了分組卷積的方式來降低引數量,並增加網路的寬度,效果也很不錯!接著我們在說下depthwise convolution, 其在MoblileNet中得到了使用,作者想講這兩種操作相結合,以達到更低引數量的同時精度也能保持的目的。
作者分析了下ResNeXt網路,發現其GP Conv只用在了3x3的layer中,這樣就導致了一個殘差模組中93.4%的計算量都在pointwise convolution, 對於一個比較小的網路,為了降低這種操作的運算量,只能減少通道數,但有可能會導致精度下降,因此,作者提出:
把GP Conv也應用到pointwise convolution, 也就是分組後的卷積核為單通道的卷積核!
但這是就會出現一個問題,就是通道之間 某個通道輸出僅從一小部分輸入通道中匯出 ,我們都知道 MobileNet中的Pointwise就是為了融合通道間的資訊的 ,如下圖所示,這樣的屬性降低了通道組之間的資訊流通,降低了資訊表示能力。所以作者又設計了一個channel shuffle的結構,用於交換通道組之間的資訊!
channel shuffle具體實現: 假設有gxn個通道,首先將其reshape成(g, n),然後再轉置為(n, g), 進行flatten操作,再分為g組作為下一層的輸入!
但是有個問題,就是GP Conv的pointwise的操作是無法改變通道數的,那shufflenet的通道數在不同的Stage是如何增加的呢 ? 很簡單,Concat~~
我們可以看到,ShuffleNet在每個Block也都是用了LinearBlock,即最後的輸出沒有ReLU, 然後利用了分組卷積,在Stride=2時,使用Concat操作將通道數增加為原來的2倍!
網路結構:
模型引數量和精度比較:
ShuffleNet V2(2018)
這篇論文十分的精彩,基本上沒有任何的理論推導和解釋,而是通過大量實驗進而總結得到的結論,都是立足於實際,用實驗結果來說話!
最終得到了設計輕量化網路結構的四個準則:
G1 : 當輸入、輸出channels數目相同時,conv計算所需的MAC(memory access cost)最為節省
下面公式為MAC和FLOPS,也就是B之間的公式關係,其中
從而其聯絡為
G2 : 過多的分組卷積會增加MAC
對於1x1的分組卷積,其MAC和FLOPS的關係為:
G3 : 網路結構整體的碎片化會減少其可平行計算時間,但在ARM中效果並沒有那麼好
可以看出碎片化對GPU下的提升還是較為明顯的,而CPU並沒有明顯的提升
G4 : Element-wise操作會消耗較多的時間, 也就是逐元素操作
從表中第一行資料看出,當移除了ReLU和short-cut,大約提升了20%的速度!
我們來回顧下ShuffleNet V1:
在第一版中,應用了兩種技術:pointwise group convolution和bottlenect-like,接著使用了一個channel shuffle的模組用來增加通道之間的交流性同時提高精度。那麼根據我們上面提出的四個CNN高效化設計的準則, 第一版有什麼不足呢?
首先它使用了bottleneck 1x1 group conv與module最後的1x1 group conv pointwise模組,使得input channels數目與output channels數目差別較大,違反了G1和G2。其次由於它整體網路結構中過多的group conv操作的使用從而違反了G3。最後類似於Residual模組中的大量Element-wise sum的使用則進而違反了G4。因此作者在ShuffleNet V2中避免了這種操作!
上圖就是ShuffleNet V1和V2的比較,前面兩個為第一版的結構圖,可以看出,第二版為了效率捨棄了原來的pointwise的分組卷積形式,改成普通卷積。為了避免BasicBlock中最後element-wise sum的操作,引入了channel split首先將通道分成兩半,進入兩個支路,最後使用Concat操作來代替原來的sum操作,既保持了通道數量的不變性又避免了element-wise的操作!太厲害了!進行Concat操作後,接著跟著一個channel shuffle的模組,用於通道間的資訊交流!
在這裡面3x3 Depthwise操作相當於線性操作,沒有加ReLU,這不同於MobileNet V2,其是1x1的pointwise操作中沒有ReLU,充當線性層!
網路結構
在大模型上面的對比:
以上為筆者整理的常用分類網路結構,也歡迎大家留言補充,一起學習交流~~
*延伸閱讀
點選左下角 “ 閱讀原文 ”, 即可申請加入極市 目標跟蹤、目標檢測、工業檢測、人臉方向、視覺競賽等技術交流群, 更有每月大咖直播分享、真實專案需求對接、乾貨資訊彙總,行業技術交流, 一起來讓思想之光照的更遠吧~
覺得有用麻煩給個好看啦~