10 大 CNN 核心模型完全解析(附源代碼,已全部跑通)

  • 2019 年 10 月 10 日
  • 筆記

點擊上方「Datawhale」,選擇「星標」公眾號

第一時間獲取價值內容

目錄: 1 LeNet 2 AlexNet 3 VGG 4 GoogLeNet 5 ResNet 6 DenseNet 7 Non-Local Networks 8 Deformable Convolutional Networks 9 Dilated Convolutional Networks 10 SENET

1. LeNet

LeNet雖然不是CNN的起點,但卻是後來CNN興起的標誌模型。LeNet-5是1998年YannLeCun設計用於手寫數字識別的模型。

圖1.1 LeNet-5網絡結構

圖1.2 LeNet-5網絡結構

在當年神經網絡還是MLP(Multilayer Perceptron,多層感知機)大行其道時,能設計出這樣的模型已實屬不易,也為後來CNN模型的發展奠定了基礎。

特點:

  • 相比MLP,LeNet使用了相對更少的參數,獲得了更好的結果。
  • 設計了maxpool來提取特徵。

2. AlexNet

AlexNet是Hinton和他的學生Alex在2012設計的網絡,並獲得了當年的ImageNet競賽冠軍。

圖2.1: AlexNet網絡

圖2.2 AlexNet網絡

特點:

  • 相比LeNet,AlexNet設計了更深層的網絡。
  • 在每個卷機後面添加了Relu激活函數,解決了Sigmoid的梯度消失問題,使收斂更快。
  • 添加了歸一化LRN(Local Response Normalization,局部響應歸一化)層,使準確率更高。
  • 設計並使用了dropout層,減輕了模型的過擬合。
  • 通過裁剪,旋轉等方式增強了訓練數據。
  • 受於當時的算力限制,Alexnet創新地將圖像分為上下兩塊分別訓練,然後在全連接層合併在一起(AlexNet網絡圖1,可以看到有上下兩部分)。

3. VGGNet

VGGNet在2014年的ImageNet比賽中,分別在定位和分類跟蹤任務中取得第一名和第二名。

特點:

  • 探索了更深層次的網絡結構圖,可以看成是AlexNet的加強版本。
  • 在卷機設計上,使用了更小的卷機核,驗證了小尺寸的卷機核在深度網絡中,不僅減少了參數,也達到了更好的效果。

圖3.1 VGGNet網絡結構圖

4. GoogLeNet

4.1 GoogLeNet v1

GoogLeNet v1版本誕生於2014年,在ILSVRC 比賽中獲得冠軍,其性能與同年誕生的VGG差不多,但參數量少於VGG。該模型並沒有單純的將網絡加深,而是引入了Inception概念,通過多個卷積核提取圖像不同尺度的信息,最後進行融合,可以得到圖像更好的表徵。

特點:

  • 引入Inception概念,在當時流行模型『加深』情況下,設計了『加寬』的思路
  • 採用Network in Network中用Average pool來代替全連接層的思想。實際在最後一層還是添加了一個全連接層,是為了大家做finetune。
  • 另外增加了兩個輔助的softmax分支,作用有兩點,一是為了避免梯度消失,用於向前傳導梯度。反向傳播時如果有一層求導為0,鏈式求導結果則為0。二是將中間某一層輸出用作分類,起到模型融合作用。最後的loss=loss_2 + 0.3 * loss_1 + 0.3 * loss_0。實際測試時,這兩個輔助softmax分支會被去掉。

圖4.1 Inception

圖4.2

圖4.3 GoogLeNet V1整體結構

4.2 GoogLeNet V2,V3

在2015年,同篇論文中發佈了 GoogLeNet V2和V3版本。

特點:

  • 學習VGGNet的特點,用兩個3*3卷積代替5*5卷積,降低參數量,提高計算速度,從而提升性能。(下圖Figure5)
  • 它們將濾波器大小nxn的卷積分解為1xn和nx1卷積的組合。例如,3×3卷積相當於首先執行1×3卷積,然後在其輸出上執行3×1卷積。他們發現這種方法比單個3×3卷積便宜33%。(下圖Figure6)
  • 模塊中的濾波器組被擴展(更寬而不是更深)以消除代表性瓶頸。如果模塊變得更深,則尺寸會過度減少,從而導致信息丟失。(下圖Figure7)

圖4.4 3種Inception結構

圖4.5 GoogLeNet v2結構

V3包含了為V2規定的所有上述改進,另外還使用了以下內容:

  • RMSProp優化器。
  • 學習Factorization into small convolutions的思想,將7×7分解成兩個一維的卷積(1×7,7×1),3×3也是一樣(1×3,3×1),這樣的好處,既可以加速計算(多餘的計算能力可以用來加深網絡),又可以將1個conv拆成2個conv,使得網絡深度進一步增加,增加了網絡的非線性,還有值得注意的地方是網絡輸入從224×224變為了299×299,更加精細設計了35×35/17×17/8×8的模塊。
  • 輔助分類器中的BatchNorm。BN算法是一個正則化方法,可以提高大網絡的收斂速度。簡單介紹一下BN算法。就是對輸入層信息分佈標準化處理,使得規範化為N(0,1)的高斯分佈,收斂速度大大提高。
  • 標籤平滑(添加到損失公式中的一種正規化組件,可防止網絡對類過於自信。
  • 防止過度擬合)。

4.3 GoogLeNet V4 ,Inception-ResNet v1和v2

圖4.6 V4版本 3種Inception結構

圖4.7 4種Reduction結構

圖4.8 3種Inception-ResNet-V1結構

圖4.9 3種Inception-ResNet-V2結構

圖4.10 Inception-ResNet結構中加入 Activation Scaling,防止網絡「死亡」

4.11 Stem與最終網絡結構圖

V4與之前的V3,V2版本主要改動有:

  • 修改了stem,這裡的stem是指在引入Inception塊之前執行的初始操作集。
  • V4引入了專門的「Reduction Blocks」,用於改變網格的寬度和高度。
  • 早期版本沒有顯式Reduction Blocks,但實現了類似功能。
  • V4版本的3種Inception與之前版本的3種Inception非常相似,但也做了細節的修改。

Inception-ResNet V1和V2特點:

  • 在Inception設計中加入了ResNet思想。從圖4.8和圖4.9可以看到,V1和V2中的3種Inception-ResNet結構相同,不同的只是超參數。
  • Inception-ResNet V1與V2的整體結構不同,Inception-ResNet V1的計算成本與Inception v3類似,Inception-ResNet V2的計算成本與Inception v4類似。
  • 為了實現殘差加法,卷積後的輸入和輸出必須具有相同的尺寸。因此,我們在Inception卷積之後使用1×1卷積來匹配深度大小(卷積後的深度增加)。
  • 主要Inception模塊內的池化操作被替換為有利於殘差連接。但是,您仍然可以在reduction blocks中找到這些操作。Reduction Block A與Inception v4中的相同。
  • 如果濾波器的數量超過1000,那麼網絡架構中更深的殘差單元會導致網絡「死亡」。因此,為了增加穩定性,作者將殘差激活量調整,係數為0.1到0.3,如圖4.10。
  • 為了在單個GPU上訓練模型,原始論文在求和之後沒有使用BatchNorm(以使整個模型適合單個GPU)。
  • 結果發現,Inception-ResNet模型能夠再用較少的epoch時獲得更高的精度。

5. ResNet

隨着算力的不斷更新,越來越深的網絡能夠得到計算,但研究者發現隨着網絡的加深,模型變得越來越不能夠訓練,遇到了梯度消失或爆炸問題。在ResNet出現之前,人們通過BN,Relu等方式去緩解此問題,但仍然不能把網絡做到足夠深。

15年何愷明提出了ResNet網絡,該思路啟發於LSTM的控制門的思想。

y = H(x,WH)•T(x,WT) + X•(1- T(x,WT))

可以看出,當T(x,WT) = 0,y=x,當T(x,WT) = 1,y= H(x,WH)

圖5.1 ResNet中的block示意圖

從圖5.1可以看出:相比傳統網絡:y=f(x),ResNet Block公式為:y=f(x) + x,可以稱之為skip connect。

圖5.2 ResNet網絡中使用的兩種Block

圖5.3 不同層數的ResNet設計方式

圖5.4 34層ResNet與其他網絡的比較

題外話:

Orhan等發表的論文《Skip connections eliminate singularities》提出神經網絡的退化才是難以訓練深層網絡根本原因所在,而不是梯度消散。雖然梯度範數大,但是如果網絡的可用自由度對這些範數的貢獻非常不均衡,也就是每個層中只有少量的隱藏單元對不同的輸入改變它們的激活值,而大部分隱藏單元對不同的輸入都是相同的反應,此時整個權重矩陣的秩不高。並且隨着網絡層數的增加,連乘後使得整個秩變的更低。這也是我們常說的網絡退化問題,雖然是一個很高維的矩陣,但是大部分維度卻沒有信息,表達能力沒有看起來那麼強大。殘差連接正是強制打破了網絡的對稱性。總的來說一句話,打破了網絡的對稱性,提升了網絡的表徵能力。也可查看文獻《Understanding and Improving Convolutional Neural Networks via Concatenated Rectified Linear Units》。

6. DenseNet

從圖6.1中可以看出,DenseNet是借鑒了ResNet,是ResNet的升級版,從上述ResNet可以看到,一般每個Block會有一個skip connect,而DenseNet會在每層conv間有一個skip connect。

圖6.1 ResNet Block與DenseNetBlock區別

圖6.2 DenseNet Block示意圖

圖6.3 DenseNet 各網絡結構圖

圖6.4 DenseNet 網絡

神經網絡越深,網絡的能力越強,就越有可能過度學習數據集,導致過擬合。大家應該還記得,作為第一個深層網絡Alexnet網絡,它提出了重要的策略dropout,對於提高模型的泛化能力非常有效。alexnet網絡至今仍然可以用於很多的任務,這足以說明其魯棒性。後來BN和數據增強等正則化策略替代dropout也在一定程度上緩解了過擬合的問題。文《Deep networks with stochastic depth》(Huang G, Sun Y, Liu Z, et al. )是DenseNet作者們早期的研究,它們通過訓練時隨機丟掉一些網絡層,提高了ResNet的泛化性能。 從這裡可以看出來一個重要特性,這也是神經網絡中大家比較關心的問題,網絡的冗餘性絕對是存在的,而且不小,通過探索dropout值的比例對性能的影響可以去估算這個冗餘。 既然丟掉某些層間連接或者整個層不影響性能,就說明這一層學習到的非線性轉變很小,既然轉變很小,那麼每一層學習幾百個通道,還有必要嗎?這幾百個通道,正是萬惡的計算量所在。 考慮到這一點,densenet就同時做了兩件事情,一是將網絡中的每一層都直接與其前面層相連,提高特徵的利用率;二是把網絡的每一層設計得很窄,也就是卷積的輸出通道數通常很小,只有幾十,該層學習非常少的特徵圖並與輸入concat使用。 這實現了資源的最大化利用和計算量的壓縮。ImageNet分類數據集上達到同樣的準確率,DenseNet 所需的參數量不到ResNet的一半,所需的計算量也只有ResNet的一半左右。 引用自【模型解讀】「全連接」的卷積網絡,有什麼好?

7. Non-Local Networks

Non-Local Networks啟發於non-local means濾波算法,該濾波算法是經典的圖像去噪算法之一。在CNN模型中不論是conv層還是pool層(全局pool除外),它們對數據的感受野都是局部的。為了增大conv或pool的感受野,傳統方式是增加網絡的深度(網絡越深,後面conv和pool的感受野越大),但這樣會增加訓練的難度(越深越難訓練),而且降低效率(參數增加)。該論文提出的Non-local Networks可以在每層計算中參考全局信息。

該方法屬於自注意力機制的範疇

圖7.1 non-local means 濾波示意圖:non-local顧名思義,將這個鄰域擴展到全圖。如上圖p作為中心像素,q1,q2,q3對p的濾波都有貢獻,實際上圖像上任意一個點都有貢獻。

圖7.2 None-local的實現方式

圖7.3 None-local公式

Non-Local Networks 代碼(pytorch):

self.g = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels, kernel_size=1, stride=1, padding=0)self.theta = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels, kernel_size=1, stride=1, padding=0)self.phi = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels, kernel_size=1, stride=1, padding=0)self.W = conv_nd(in_channels=self.inter_channels, out_channels=self.in_channels, kernel_size=1, stride=1, padding=0)    g_x = self.g(x).view(batch_size, self.inter_channels, -1).permute(0, 2, 1)theta_x = self.theta(x).view(batch_size, self.inter_channels, -1).permute(0, 2, 1)phi_x = self.phi(x).view(batch_size, self.inter_channels, -1)f = torch.matmul(theta_x, phi_x)f_div_C = F.softmax(f, dim=-1)y = torch.matmul(f_div_C, g_x).permute(0, 2, 1).contiguous()y = y.view(batch_size, self.inter_channels, *x.size()[2:])W_y = self.W(y)z = W_y + x

圖7.4 Non-local 網絡結構

特點:

  • 對於視頻分類,non-local會好於相應的一般網絡,畢竟沒有大的感受野未必能很魯棒的捕捉一個動作到底是跳高還是跳水。
  • 依據作者們的結論,在網絡淺層效果會更好,畢竟隨着網絡深度增加,傳統網絡感受野也會增加了,Non-local的效果也就不再明顯。

補充:

這裡的Non-Local和NLP中的Self-Attention有異曲同工之妙,它們本質是一樣的,NLP是當前token與上下文的關係,此處圖片是當前像素與全圖像素的關係。

NLP中的Self-Attention計算圖如下:

NLP在計算Self-Attention時,會生成3個向量:查詢向量q,鍵向量k和值向量v;

步驟:

  • 詢向量q*鍵向量k,得到上下文的全局token與當前token的關聯度,再通過求均值和softmax將關聯度做歸一化;
  • 上下文的每個token向量乘以其對應的關聯度,再求和,從而得到當前token的word embedding。

Non-Local與NLP self-attention的共同點:

  • Non-Local代碼中的theta_x和phi_x相當於NLP中的查詢向量和鍵向量, 通過torch.matmul(theta_x, phi_x)得到全圖像素與當前像素的關聯度,再通過 F.softmax(f, dim=-1)做關聯度的歸一化;
  • 全圖像素乘以其對應的關聯度,再求和,從而得到當前的像素值(特徵值)。

8. Deformable Convolutional Networks

同樣的物體在圖像中可能呈現出不同的大小、姿態、視角變化甚至非剛體形變,如何適應這些複雜的幾何形變是物體識別的主要難點。而Deformable Conv模型嘗試着解決這類問題。

首次在卷積神經網絡(convolutional neutral networks,CNN)中引入了學習空間幾何形變的能力,得到可變形卷積網絡(deformable convolutional networks),從而更好地解決了具有空間形變的圖像識別任務。研究員們通過大量的實驗結果驗證了該方法在複雜的計算機視覺任務(如目標檢測和語義分割)上的有效性,首次表明在深度卷積神經網絡(deep CNN)中學習空間上密集的幾何形變是可行的。 作者: 微軟亞洲研究院 鏈接: https://www.zhihu.com/question/57493889/answer/184578752

當前深度模型對物體的幾何形變適應能力幾乎還是來自於數據本身的多樣性,模型內部並不具有適應幾何形變的機制。作者認為造成這樣的問題是卷積操作本身就是固定的幾何結構。

圖7.5 展示了卷積核大小為 3×3 的正常卷積和可變形卷積的採樣方式,(a) 所示的正常卷積規律的採樣 9 個點(綠點),(b)(c)(d) 為可變形卷積,在正常的採樣坐標上加上一個位移量(藍色箭頭),其中(c)(d) 作為 (b) 的特殊情況,展示了可變形卷積可以作為尺度變換,比例變換和旋轉變換的特殊情況作

圖7.6 示例圖

9. Dilated Convolutional Networks

Dilated Convolution 被中文翻譯為「空洞卷積」或「膨脹卷積」,我更傾向於稱之為「膨脹卷積」。該模型最早由Fisher Yu在2016年ICLR上發表的論文《Multi-Scale Context Aggregation by Dilation Convolutions》中提出。該模型最早應用於圖像分割,因為傳統CNN模型需要通過pooling層來縮小圖像尺寸,並擴大下一層的感受野,即進行下採樣(down sampling);這一過程肯定會有信息丟失。因為圖像分割是pixel-wise的,且在圖像預測時還需要進行上採樣(up sampling)操作,丟失的信息在上採樣過程中也很難再找回。

為了解決上述問題,Fisher Yu提出了Dilated Convolution方法,通過Dilated Convolution來替代pooling層進行下採樣操作,不僅擴大了感受野,也不會丟失信息。

下面看一下dilated conv原始論文中的示意圖:

(a)圖對應3×3的1-dilated conv,和普通的卷積操作一樣

(b)圖對應3×3的2-dilated conv,實際的卷積kernel size還是3×3,但是空洞為1,也就是對於一個7×7的圖像patch,只有9個紅色的點和3×3的kernel發生卷積操作,其餘的點略過。也可以理解為kernel的size為7×7,但是只有圖中的9個點的權重不為0,其餘都為0。可以看到雖然kernel size只有3×3,但是這個卷積的感受野已經增大到了7×7(如果考慮到這個2-dilated conv的前一層是一個1-dilated conv的話,那麼每個紅點就是1-dilated的卷積輸出,所以感受野為3×3,所以1-dilated和2-dilated合起來就能達到7×7的conv)

(c)圖是4-dilated conv操作,同理跟在兩個1-dilated和2-dilated conv的後面,能達到15×15的感受野。對比傳統的conv操作,3層3×3的卷積加起來,stride為1的話,只能達到(kernel-1)*layer+1=7的感受野,也就是和層數layer成線性關係,而dilated conv的感受野是指數級的增長。

10. SENET

SENET在ImageNet 2017中的Image Classification奪得冠軍。並在CVPR 2017中發表論文《Squeeze-and-excitation networks》。

作者大概總結了前人對CNN模型的改進:卷積核作為卷積神經網絡的核心,通常被看做是在局部感受野上,將空間上(spatial)的信息和特徵維度上(channel-wise)的信息進行聚合的信息聚合體。卷積神經網絡由一系列卷積層、非線性層和下採樣層構成,這樣它們能夠從全局感受野上去捕獲圖像的特徵來進行圖像的描述。

近很多工作被提出來從空間維度層面來提升網絡的性能,如Inception結構中嵌入了多尺度信息,聚合多種不同感受野上的特徵來獲得性能增益;還如Non-local,deformable conv,dilated conv等都是在空間層面進行改進。

本文提到的SENet另闢蹊徑,嘗試着從channel特徵中尋找優化點。作者認為在每層卷積中輸出的每個channel,其信息重要性是不同的,我們需要為每個channel的feature map設置一個權重,來重新量化每個channel的特徵信息。作者的設計如下圖所示:

圖中Fsq為Squeeze操作,將每個二維的特徵通道變成一個實數,這個實數某種程度上具有全局的感受野,並且輸出的維度和輸入的特徵通道數相匹配。

圖中Fex為Excitation操作,它是一個類似於循環神經網絡中門的機制。通過參數 來為每個特徵通道生成權重,其中參數 被學習用來顯式地建模特徵通道間的相關性。

圖中Fscale是一個Reweight操作。完成了每個channel的特徵圖權重計算。

SE作為一個模塊,可以跟其他CNN模型進行組合使用,下圖是分別於Inception和ResNet進行組合。

參考文獻:

https://mp.weixin.qq.com/s/IMkvod2Lj2VOIWbFtAirzA

https://zhuanlan.zhihu.com/p/45189981

https://www.zhihu.com/question/312556066

https://www.zhihu.com/question/57493889/answer/184578752

https://www.zhihu.com/question/54149221/answer/192025860

GitHub地址:https://github.com/liuyuemaicha/cnn_model

GitHub代碼依賴:python 2.7, Pytorch 0.3.1