CNN發展

CNN 發展

這裏寫圖片描述

LeNet5理解

LeNet5的網絡結構如圖所示(該圖來自論文)
這裏寫圖片描述
網路結構分析:
輸入層:
輸入圖像:32*32*1

第一層:卷積層
卷積核大小:5*5*1*6,卷積核width = hight = 5, in_channels = 1 , out_channels = 6,padding=0,stride = 1。
尺度變化公式:out_width = (in_width - filter_width) / stride + 1 = (32-5) / 1 + 1 = 28
輸出圖像:28*28*6

第二層:池化層
卷積核大小:2*2*6*6,padding = 0,stride = 2。
輸出圖像大小:14*14*6

第三層:卷積層
卷積核大小:5*5*14*16,in_channels= 14, out_channels = 16,padding = 0, stride = 1。
尺度變化公式:out_width = (in_width - filter_width) / stride + 1 = (14-5) / 1 + 1 =10
輸出圖像:10*10*16

第四層:池化層
卷積核:2*2*16*16, padding = 0, stride = 2。
輸出圖像大小:5*5*16*16

第一層全鏈接:
在第一層全鏈接前,需要先將上一層的feature mappings 展開,得到 num_samples 個400緯度(5*5*16 = 400) 樣本特徵。
權重:400*120
輸出緯度:120

第二層全鏈接:
權重:120*84
輸出緯度:84

輸出層:
權重:84*10
輸出緯度:10

VGGNet網絡理解

VGGNet 網絡是14年發出的。

網絡結構

這裏寫圖片描述

該表格來自論文,每一列代表一個VGGNet網絡。表中的conv3-n表示一個卷積層(卷積+激活),其中n代表輸出圖像的通道數。在VGGNet網絡中,所有卷積層,卷積的步長爲1。
在VGGNet網絡中,每次卷積前對圖像進行先對圖像進行padding,padding大小爲1,這讓對於filter爲3*3,stride=1的卷積來說,就不會改變圖像的大小(output_height = (input_height + 2 * 1 - 3) / 1 + 1 = input_height)。

VGGNet主要改進

1.引入了更小的卷積核,卷積步長改爲1;

2.引入了1*1的卷積

引入小的卷積核的好處有三方面:

作用1:最直觀的作用就是減少了權重的數目,
比如:如果將原來 5*5 的卷積替換爲兩個連續的3*3的卷積
原來權重數目:5 * 5 = 25;
現在權重數目:3 * 3 * 2 = 18
如果將原來7*7 的卷積替換爲三個連續的卷積
原來權重數目:7 * 7 = 49
現在權重數目:3 * 3 * 3 = 27
那麼爲數目兩個連續的3*3的卷積可以代替一個5*5的卷積呢?請看如下這個圖:
這裏寫圖片描述
如圖,如果假設輸入feature map 是5*5的,經過兩個3*3卷積和經過一個5*5的卷積,最重的得到的feature map的大小都是1*1的。
作用2:引入了更多的非線性,使得網絡具有更強的識別能力。
作用3:更小的卷積使得網絡引入了正則話。原文是這樣說的:

we decrease the number of parameters.This can be seen as imposing a regularisation on the 7 × 7 conv. filters, forcing them to have a decomposition through the 3 × 3 filters (with non-linearity injected in between).

另外作者將網絡加深後仍能很好的運行,而沒有出現梯度消失或梯度爆炸的問題歸功於卷積核的改變:(原文是這樣說的)

To this end, we fix other parameters of the architecture, and steadily increase the depth of the network by adding more convolutional layers, which is feasible due to the use of very small (3 × 3) convolution filters in all layers.

對於作用3,需要進一步研究,哪個小夥伴有好的見解,可以在評論區解釋一下。

引入1*1卷積的作用:

The incorporation of 1 × 1 conv. layers (configuration C, Table 1) is a way to increase the non- linearity of the decision function without affecting the receptive fields of the conv. layers.

大概意思就是說,該1*1卷積並不是爲了改變feature map的通道數,而是爲了引入更多的非線性。

總的來說,VGGNet進一步證明了,網絡越深網絡的識別能力越強,並且並不是卷積核越大越好。

並且在VGGNet 網絡中,我認爲作者採用了遷移學習的方法(我個人是這樣認爲的,如若有不同意見,歡迎討論)。論文中這樣寫道:

The initialisation of the network weights is important, since bad initialisation can stall learning due to the instability of gradient in deep nets. To circumvent this problem, we began with training the configuration A (Table 1), shallow enough to be trained with random initialisation. Then, when training deeper architectures, we initialised the first four convolutional layers and the last three fully- connected layers with the layers of net A (the intermediate layers were initialised randomly).

大概意思:網絡權重的初始化是很重要的,不好的權重初始化會導致網絡訓練過程中梯度的不穩定。爲了避免這種情況,作者在訓練更深層網絡前,先訓練淺層網絡A,然後將A的結構替換更深網絡中的對應結構。該論文對應網絡在該節開始位置。

GoogLeNet理解

GoogLeNet這個名字的誕生由兩方面促成,一是設計者在Google工作,二是向LeNet致敬。GoogLeNet只是一個名字,它的核心內容是發明了Inception Architecture(以下簡稱IA),發明IA的靈感來自於2013年的一篇論文《Provable Bounds for Learning Some Deep Representations》,這篇論文讀起來非常困難,需要很多的數學知識,有興趣的可以看看。
首先GoogLeNet 有三個大的改進:
(1)在低層時候仍然用傳統的方式,高層用Inception塊疊加。(論文中說這可能反應了當前構造的不足)
(2)用Average pooling 替換傳統的FC
(3)爲了解決梯度彌散的問題,在4a 和4d的後面添加輔助loss,該loss僅在訓練的時候以一定的weight參與梯度傳遞,而在test的時候不用。
下面讓我們來具體瞭解一下Inception模塊(包括如何發現的Inception模塊,遇到的問題,如何解決,爲什麼Inception模塊能提高模型識別能力)(該圖來自於該博客
這裏寫圖片描述
Inception模塊的工作原理:輸入圖像通過1*1卷積、3*3卷積、5*5卷積和Max pooling之後得到4個輸出圖像,它們在”Filter concatenation”階段的連接是發生在圖像深度方向,即通道上。

最初Inception模塊如下圖(a)(該圖來自論文)所示

這裏寫圖片描述

但是,最初的Inception模塊(a)會導致一個問題:參數過大。 如下圖所示(該圖來自於該博客
這裏寫圖片描述
上圖看起來,參數計算量不是很大,但是在實際的Inception模塊中,最終的feature map 是有4個feature maps組成的。所以5*5的卷積會帶來大量的計算負擔(原GoogLeNet有9個Inception模塊)。所以作者提出了改進--引進了1*1卷積,爲了進行通道壓縮,得到改進的Inception(b)。即在3*3卷積、5*5卷積之前,池化之後引入1*1卷積,拿5*5卷積爲例,如下圖所示。(該圖來自該博客)
這裏寫圖片描述
加入了1*1卷積之後,權重的數目由原來的120M減少到12.4M,權重數目大大減少,模型變得簡單,減少模型過擬合的機率。

爲什麼GoogLeNet網絡將傳統卷積替換成Inception,準確率會提高?
個人理解:在之前的卷積網絡中,每一層都採用固定的大小的卷積核去提取前一層的feature map的特徵,但是該大小的卷積覈對於上一層的某些特徵並不適用,就像在特徵提取上,Gabor變換比普通傅立葉變換效果要好。因爲在Gabor變換中引入了窗口,不同大小的窗口針對不同的特徵,而傅立葉變換直接對全局信息做處理,沒有針對性。同理,在Inception 模塊中,用不同的大小的卷積覈對feature map 做卷積,原feature map 中的特徵更好的被提取出來,然後在通過 “Filter concatenation”得到輸出feature map。

GoogLeNet 網絡結構:
這裏寫圖片描述

ResNet

ResNet在2015年被Kaiming He等人提出,在ImageNet比賽classification任務上獲得第一名,因爲它“簡單與實用”並存,之後很多方法都建立在ResNet50或者ResNet101的基礎上完成的,檢測,分割,識別等領域都紛紛使用ResNet。下面我們從實用的角度去看看ResNet。

該ResNet是針對隨着網絡深度的加深,出現的 “degradation problem”(網絡退化問題)而提出的。

隨着網絡的加深,首先出現的問題就是梯度消失問題,但隨之被 batch normalization 解決。那加了BN層之後再加深,網絡性能是不是就更高了呢?錯!作者在論文中說:通過試驗證明,當隨着網絡的加深,正確率達到一定程度之後,不增反降。這時就出現了“網絡退化問題”。
這裏寫圖片描述

作者做了這樣的試驗,先訓練一個淺層網絡A,然後在已經訓練過的A的後面添加若干個identity mapping,得到深層網絡B。那麼,理論情況下,B的訓練誤差應該小於等於網絡A的,但是實際上,B的訓練誤差高於A的訓練誤差。
結論:這種下降即不是梯度消失引起的也不是overfit造成的,而是由於網絡過於複雜,不是所有的網絡都容易優化。以至於光靠不加約束的放養式的訓練很難達到理想的錯誤率。degradation problem不是網絡結構本身的問題,而是現有的訓練方式不夠理想造成的。當前廣泛使用的訓練方法,無論是SGD,還是AdaGrad,還是RMSProp,都無法在網絡深度變大後達到理論上最優的收斂結果。

======未完待續=====

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章