2012年,Hinton為了證明深度學習的潛力,首次參加ImageNet影象識別比賽,其透過構建的

CNN網路——AlexNet

一舉奪得冠軍,且碾壓第二名SVM方法。也正是由於該比賽,CNN吸引到了眾多研究者的注意。從此,深度學習進入爆發增長期。雖然近兩年CVPR開始流行Transformer這一新正規化,但CNN為基礎的模型依然是是計算機視覺的中流砥柱。

本文詳細整理了

影象分類

領域基於CNN的模型結構發展。

1. CNN基本部件介紹

0. 卷積(Convolution)

(1) 標準卷積

卷積層的作用都是用來自動提取影象的一些視覺特徵,代替傳統的手動方法提取特徵不精確,不全面等缺點。常見的一般卷積操作都包括以下四個引數:

卷積核大小(Kernel Size):卷積核定義了卷積的大小範圍,在網路中代表感受野的大小,二維卷積核最常見的就是 3*3 的卷積核,也可以根據網路設計5*5或者7*7,甚至1*1等不同size的卷積核,來提取不同尺度的特徵。在卷積神經網路中,一般情況下,卷積核越大,感受野(receptive field)越大,看到的圖片資訊越多,所獲得的全域性特徵越好。雖說如此,但是大的卷積核會導致計算量的暴增,不利於模型深度的增加,計算效能也會降低。如上圖中卷積核的size為3*3

步長(Stride):卷積核的步長度代表提取的精度, 步長定義了當卷積核在影象上面進行卷積操作的時候,每次卷積跨越的長度。在預設情況下,步長通常為 1,但我們也可以採用步長是 2 的下采樣過程,類似於 MaxPooling 操作。對於size為3的卷積核,如果step為1,那麼相鄰步感受野之間就會有重複區域;如果step為2,那麼相鄰感受野不會重複,也不會有覆蓋不到的地方;如果step為3,那麼相鄰步感受野之間會有一道大小為1顆畫素的縫隙,從某種程度來說,這樣就遺漏了原圖的資訊。

填充(Padding):卷積核與影象尺寸不匹配,往往填充影象缺失區域,如上圖,原始圖片尺寸為5*5,卷積核的大小為3*3,如果不進行填充,步長為1的話,當卷積核沿著圖片滑動後只能滑動出一個3*3的圖片出來,這就造成了卷積後的圖片和卷積前的圖片尺寸不一致,這顯然不是我們想要的結果,所以為了避免這種情況,需要先對原始圖片做邊界填充處理。

輸入和輸出通道數(Input & Output Channels):卷積核的輸入通道數(in depth)由輸入矩陣的通道數所決定;輸出矩陣的通道數(out depth)由卷積核的輸出通道數所決定。每一層卷積有多少channel數,以及一共有多少層卷積,這些暫時沒有理論支撐,一般都是靠感覺去設定幾組候選值,然後透過實驗挑選出其中的最佳值。這也是現在深度卷積神經網路雖然效果拔群,但是一直為人詬病的原因之一。

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

(2)

空洞卷積

空洞卷積是針對影象語義分割問題中下采樣會降低影象解析度、丟失資訊而提出的一種卷積思路。透過間隔取值擴大感受野,讓原本3x3的卷積核,在相同引數量和計算量下擁有更大的感受野。這裡面有個擴張率(dilation rate)的係數,這個係數定義了這個間隔的大小,標準卷積相當於dilation rate為1的空洞卷積,下圖展示的是dilation rate為2的空洞卷積計算過程,可以看出3×3的卷積核可以感知標準的5×5卷積核的範圍,還有一種理解思路就是先對3×3的卷積核間隔補0,使它變成5×5的卷積,然後再執行標準卷積的操作。

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

(3)

轉置卷積

轉置卷積又稱反捲積,它和空洞卷積的思路正好相反,是為上取樣而生,也應用於語義分割當中,而且他的計算也和空洞卷積正好相反,先對輸入的feature map間隔補0,卷積核不變,然後使用標準的卷積進行計算,得到更大尺寸的feature map。

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

1. 區域性感受野(Receptive Field)

感受野指的是卷積神經網路每一層輸出的特徵圖(feature map)上每個畫素點映射回輸入影象上的區域大小,神經元感受野的範圍越大表示其能接觸到的原始影象範圍就越大,也意味著它能學習更為全域性,語義層次更高的特徵資訊,相反,範圍越小則表示其所包含的特徵越趨向區域性和細節。因此感受野的範圍可以用來大致判斷每一層的抽象層次,並且我們可以很明顯地知道網路越深,神經元的感受野越大。

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

2. 池化(Pooling)

池化是

將輸入影象進行縮小

,減少畫素資訊,只保留重要資訊,主要是為了減少計算量。主要包括

最大池化和均值池化

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

3. 啟用函式(Activation)

啟用函式的用是用來加入非線性。常見的啟用函式有sigmod, tanh, relu,leaky relu,前兩者常用在全連線層,relu和leaky relu常見於卷積層。

4. 解析度(Resolution)

解析度指的是輸入模型的影象尺寸,即長寬大小。通常情況會根據模型下采樣次數n和最後一次下采樣後feature map的解析度k×k來決定輸入解析度的大小,即:

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

從輸入r×r到最後一個卷積特徵feature map的k×k,整個過程是一個資訊逐漸抽象化的過程,即網路學習到的資訊逐漸由低階的幾何資訊轉變為高階的語義資訊,這個feature map的大小可以是3×3,5×5,7×7,9×9等等,k太大會增加後續的計算量且資訊抽象層次不夠高,影響網路效能,k太小會造成非常嚴重的資訊丟失,如原始解析度對映到最後一層的feature map有效區域可能不到一個畫素點,使得訓練無法收斂。

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

5. 下采樣和上取樣(Down-Sampling and Up-Sampling)

下采樣層有兩個作用,

一是減少計算量,防止過擬合,二是增大感受野,使得後面的卷積核能夠學到更加全域性的資訊

。下采樣的設計有兩種:

採用stride為2的池化層,如Max-pooling或Average-pooling,目前通常使用Max-pooling,因為它計算簡單且最大響應能更好保留紋理特徵;

採用stride為2的卷積層,下采樣的過程是一個資訊損失的過程,而池化層是不可學習的,用stride為2的可學習卷積層來代替pooling可以得到更好的效果,當然同時也增加了一定的計算量。

在卷積神經網路中,由於輸入影象透過卷積神經網路(CNN)提取特徵後,輸出的尺寸往往會變小,而有時我們需要將影象恢復到原來的尺寸以便進行進一步的計算(如影象的語義分割),這個使影象由小解析度對映到大解析度的操作,叫做上取樣,它的實現一般有三種方式:

插值,一般使用的是雙線性插值,因為效果最好,雖然計算上比其他插值方式複雜,但是相對於卷積計算可以說不值一提;

轉置卷積又或是說反捲積,透過對輸入feature map間隔填充0,再進行標準的卷積計算,可以使得輸出feature map的尺寸比輸入更大;

Max Unpooling,在對稱的max pooling位置記錄最大值的索引位置,然後在unpooling階段時將對應的值放置到原先最大值位置,其餘位置補0;

#FormatImgID_15##FormatImgID_16#

2. 影象分類經典網路結構

LeNet5 (1998)

由兩個卷積層,兩個池化層,兩個全連線層組成。卷積核都是5×5,stride=1,池化層使用maxpooling。

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

AlexNet(2012)

模型共八層(不算input層),包含五個卷積層、三個全連線層。最後一層使用softmax做分類輸出。

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

VGG-16(2014)

提高深度神經網路效能的最直接方法是增加網路的深度。視覺幾何組織(VGG)的人們發明了VGG-16,它有13個卷積層和3個完全連線層,帶有AlexNet的ReLU傳統。同樣,這個網路只是在AlexNet的基礎上加深網路層。它由138M 引數組成,佔用大約500MB的儲存空間。並且他們還設計了更深層的變體VGG-19。

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

GoogLeNet(2014, based on Inception-v1)

GoogLeNet透過增加網路寬度的方式來增加網路複雜度,讓網路可以自己去應該如何選擇卷積核。這種設計減少了引數 ,同時提高了網路對多種尺度的適應性。使用了1×1卷積可以使網路在不增加引數的情況下增加網路複雜度。

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

Inception-v1~Inception-v3(2014-2016)

- Inception-v1

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

Inception-v1具有5M引數的22層架構。如論文中所述,Inception模組的體系結構設計是近似稀疏結構研究的產物。每個模組提出3個想法:

具有不同濾波器的並行卷積塔,隨後是串聯,以1×1,3×3和5×5捕獲不同的特徵,從而“聚類”它們。

1×1卷積用於降低維數以消除計算瓶頸。

1×1卷積在卷積內增加非線性(基於Network In Network論文)

作者還引入了 兩個輔助分類器,以鼓勵分類器中較低階段的歧視,增加傳播回來的梯度訊號,並提供額外的正則化。所述輔助網路(即連線到輔助分類的分支),在推理時間將被丟棄。

- Inception-v2

在v1的基礎上加入batch normalization技術,在tensorflow中,使用BN在啟用函式之前效果更好;將5×5卷積替換成兩個連續的3×3卷積,使網路更深,引數更少。

- Inception-v3

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

Inception-v3是Inception-v1的後繼產品,具有24M引數。那麼Inception-v2呢?它是v3的早期原型,因此非常類似於v3但不常用。當作者推出Inception-v2時,他們在其上進行了許多實驗,並進行一些調整。Inception-v3是包含這些調整的網路(調整最佳化器,剪枝功能並向輔助網路中的輔助層新增批次標準化)。Inception-v2和Inception-v3的動機是避免表徵性瓶頸(這意味著大幅減少下一層的輸入維度),並透過使用因子分解方法進行更有效的計算。

- Inception-v4結構

Inception- v4是Inception-v3的改進。主要區別在於Stem組和Inception-C模組中的一些小變化。作者還為每個網格尺寸的Inception塊做出了統一的選擇。他們還提到殘差連線可以顯著提高訓練速度。

與Inception-v3相比改進了什麼?

更改Stem模組

新增更多Inception模組

統一選擇Inception-v3模組,意味著為每個模組使用相同數量的過濾器。

總之,由於模型大小的增加,Inception-v4的效果更好。

Xception(2016)

#FormatImgID_29##FormatImgID_30#

在Inception-v3的基礎上提出,基本思想是通道分離式卷積,但是又有區別。模型引數稍微減少,但是精度更高。Xception先做1×1卷積再做3×3卷積,即先將通道合併,再進行空間卷積。depthwise正好相反,先進行空間3×3卷積,再進行通道1×1卷積。核心思想是遵循一個假設:卷積的時候要將通道的卷積與空間的卷積進行分離。而MobileNet-v1用的就是depthwise的順序,並且加了BN和ReLU。Xception的引數量與Inception-v3相差不大,其增加了網路寬度,旨在提升網路準確率,而MobileNet-v1旨在減少網路引數,提高效率。

MobileNet系列(2017)

MobileNet系列一共有V1,V2和V3三篇論文,簡要的講:

- MobileNet V1主要思想是提出了一種新的結構—深度可分離卷積(Depthwise Separable Convolution)來代替標準3×3卷積,從而大大減少模型的引數量和計算量;

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

- MobileNet V2在V1的基礎上提出了一種倒置殘差的模組,這個模組有三個卷積,第一個部分是一個1×1標準卷積,用來升維,第二個部分是由3×3深度卷積+1×1標準卷積構成的深度分離卷積,用來學習特徵和降維,模組的輸出和輸入再進行一個Addition的操作,由於和ResNet中維度升降方式相反,所以稱為倒置殘差。中間升維的作用是讓深度可分離卷積得到更充分的學習,計算量相對於標準卷積來說也不大,而且這種升降維的方式非常靈活,可以大大減少計算量。本文還從流形學的角度探究了輸入深度可分離卷積上一層的ReLU6對資訊傳遞的影響,理論證明去掉上一個1×1標準卷積的ReLU啟用函式能更有利於後面的深度可分離卷積對特徵的學習

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

- MobileNet V3感覺相對於前兩篇沒有那麼大的結構創新了,主要思想是神經架構搜尋(NAS)和硬體友好結構,總的來看V3的結構是在V2的基礎上進行了一些修改,如增加了SE block這種已被提出的

注意力機制

,啟用函式換成了H-swish,last stage減少了幾層計算,針對語義分割提出了Lite R-ASPP的head(不在討論之列),整個論文看著像是堆tricks,重點不是很突出,有點年底衝業績的嫌疑。

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

EffNet(2018)

EffNet是對MobileNet-v1的改進,主要思想是:將MobileNet-1的dw層分解層兩個3×1和1×3的dw層,這樣 第一層之後就採用pooling,從而減少第二層的計算量。EffNet比MobileNet-v1和ShuffleNet-v1模型更小,進度更高。

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

EfficientNet(2019)

研究網路設計時在depth, width, resolution上進行擴充套件的方式,以及之間的相互關係。可以取得更高的效率和準確率。

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

ResNet(2015)

VGG證明更深的網路層數是提高精度的有效手段,但是更深的網路極易導致梯度彌散,從而導致網路無法收斂。經測試,20層以上會隨著層數增加收斂效果越來越差。ResNet可以很好的解決梯度消失的問題(其實是緩解,並不能真正解決),ResNet增加了shortcut連邊。

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

DenseNet(2017)

DenseNet透過特徵重用來大幅減少網路的引數量,又在一定程度上緩解了梯度消失問題。

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

SqueezeNet(2016)

提出了fire-module:squeeze層+expand層。Squeeze層就是1×1卷積,expand層用1×1和3×3分別卷積,然後concatenation。squeezeNet引數是alexnet的1/50,經過壓縮之後是1/510,但是準確率和alexnet相當。

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

ShuffleNet系列(2017)

-

ShuffleNet-v1

透過分組卷積與1×1的逐點群卷積核來降低計算量,透過重組通道來豐富各個通道的資訊。Xception和ResNeXt在小型網路模型中效率較低,因為大量的1×1卷積很耗資源,因此提出逐點群卷積來降低計算複雜度,但是使用逐點群卷積會有副作用,故在此基礎上提出通道shuffle來幫助資訊流通。雖然dw可以減少計算量和引數量,但是在低功耗裝置上,與密集的操作相比,計算、儲存訪問的效率更差,故shufflenet上旨在bottleneck上使用深度卷積,儘可能減少開銷。

-

ShuffleNet-v2

使神經網路更加高效的CNN網路結構設計準則:輸入通道數與輸出通道數保持相等可以最小化記憶體訪問成本; 分組卷積中使用過多的分組會增加記憶體訪問成本; 網路結構太複雜(分支和基本單元過多)會降低網路的並行程度; element-wise的操作消耗也不可忽略

【深度學習】卷積神經網路CNN結構發展整理(影象分類)

SENET

SENET在ImageNet 2017中的Image Classification奪得冠軍。SENet另闢蹊徑,嘗試著從channel特徵中尋找最佳化點。作者認為在每層卷積中輸出的每個channel,其資訊重要性是不同的,我們需要為每個channel的feature map設定一個權重,來重新量化每個channel的特徵資訊。

【深度學習】卷積神經網路CNN結構發展整理(影象分類)