深度學習——卷積神經網絡 的經典網絡(LeNet-5、AlexNet、ZFNet、VGG-16、GoogLeNet、ResNet)
一、CNN卷積神經網絡的經典網絡綜述
下面圖片參照博客:http://blog.csdn.net/cyh_24/article/details/51440344
二、LeNet-5網絡
- 輸入尺寸:32*32
- 卷積層:2個
- 降采樣層(池化層):2個
- 全連接層:2個
- 輸出層:1個。10個類別(數字0-9的概率)
LeNet-5網絡是針對灰度圖進行訓練的,輸入圖像大小為32*32*1,不包含輸入層的情況下共有7層,每層都包含可訓練參數(連接權重)。註:每個層有多個Feature Map,每個Feature Map通過一種卷積濾波器提取輸入的一種特征,然後每個Feature Map有多個神經元。
1、C1層是一個卷積層(通過卷積運算,可以使原信號特征增強,並且降低噪音)
第一層使用5*5大小的過濾器6個,步長s = 1,padding = 0。即:由6個特征圖Feature Map構成,特征圖中每個神經元與輸入中5*5的鄰域相連,輸出得到的特征圖大小為28*28*6。C1有156個可訓練參數(每個濾波器5*5=25個unit參數和一個bias參數,一共6個濾波器,共(5*5+1)*6=156個參數),共156*(28*28)=122,304個連接。
2、S2層是一個下采樣層(平均池化層)(利用圖像局部相關性的原理,對圖像進行子抽樣,可以減少數據處理量同時保留有用信息,降低網絡訓練參數及模型的過擬合程度)。
第二層使用2*2大小的過濾器,步長s = 2,padding = 0。即:特征圖中的每個單元與C1中相對應特征圖的2*2鄰域相連接,有6個14*14的特征圖,輸出得到的特征圖大小為14*14*6。池化層只有一組超參數 f 和 s,沒有需要學習的參數。
3、C3層是一個卷積層
第三層使用5*5大小的過濾器16個,步長s = 1,padding = 0。即:由16個特征圖Feature Map構成,特征圖中每個神經元與輸入中5*5的鄰域相連,輸出得到的特征圖大小為10*10*16。C3有416個可訓練參數(每個濾波器5*5=25個unit參數和一個bias參數,一共16個濾波器,共(5*5+1)*16=416個參數)。
4、S4層是一個下采樣層(平均池化層)
第四層使用2*2大小的過濾器,步長s = 2,padding = 0。即:特征圖中的每個單元與C3中相對應特征圖的2*2
鄰域相連接,有16個5*5的特征圖,輸出得到的特征圖大小為5*5*16。沒有需要學習的參數。
5、F5層是一個全連接層
有120個單元。每個單元與S4層的全部400個單元之間進行全連接。F5層有120*(400+1)=48120個可訓練參數。
如同經典神經網絡,F5層計算輸入向量和權重向量之間的點積,再加上一個偏置。
6、F6層是一個全連接層
有84個單元。每個單元與F5層的全部120個單元之間進行全連接。F6層有84*(120+1)=10164個可訓練參數。
如同經典神經網絡,F6層計算輸入向量和權重向量之間的點積,再加上一個偏置。
7、Output輸出層
輸出層由歐式徑向基函數(Euclidean Radial Basis Function)單元組成,每類一個單元,每個有84個輸入。
換句話說,每個輸出RBF單元計算輸入向量和參數向量之間的歐式距離。輸入離參數向量越遠,RBF輸出的越大。
用概率術語來說,RBF輸出可以被理解為F6層配置空間的高斯分布的負log-likelihood。
給定一個輸式,損失函數應能使得F6的配置與RBF參數向量(即模式的期望分類)足夠接近。
總結:
隨著網絡越來越深,圖像的寬度和高度都在縮小,信道數量一直在增加。目前,一個或多個卷積層後邊跟一個
池化層,再接上一個全連接層的排列方式很常用。
層(layer) | 激活後的維度(Activation Shape) | 激活後的大小(Activation Size) | 參數w、b(parameters) |
Input | (32,32,1) | 1024 | 0 |
CONV1(f=5,s=1) | (28,28,6) | 4704 | (5*5+1)*6=156 |
POOL1 | (14,14,6) | 1176 | 0 |
CONV2(f=5,s=1) | (10,10,16) | 1600 | (5*5*6+1)*16=2416 |
POOL2 | (5,5,16) | 400 | 0 |
FC3 | (120,1) | 120 | 120*(400+1)=48120 |
FC4 | (84,1) | 84 | 84*(120+1)=10164 |
Softmax | (10,1) | 10 | 10*(84+1)=850 |
三、AlexNet網絡
AlexNet網絡共有:卷積層 5個,池化層 3個,全連接層:3個(其中包含輸出層)。
卷積神經網絡的結構並不是各個層的簡單組合,它是由一個個“模塊”有機組成的,在模塊內部,
各個層的排列是有講究的。比如AlexNet的結構圖,它是由八個模塊組成的。
1、AlexNet——模塊一和模塊二
結構類型為:卷積-激活函數(ReLU)-降采樣(池化)-標準化
這兩個模塊是CNN的前面部分,構成了一個計算模塊,這個可以說是一個卷積過程的標配,從宏觀的角度來看,
就是一層卷積,一層降采樣這樣循環的,中間適當地插入一些函數來控制數值的範圍,以便後續的循環計算。
2、AlexNet——模塊三和模塊四
模塊三和四也是兩個same卷積過程,差別是少了降采樣(池化層),原因就跟輸入的尺寸有關,特征的數據量已經比較小了,
所以沒有降采樣。
3、AlexNet——模塊五
模塊五也是一個卷積和池化過程,和模塊一、二一樣的。模塊五輸出的其實已經是6\6的小塊兒了。
(一般設計可以到1\1的小塊,由於ImageNet的圖像大,所以6\6也正常的。)
原來輸入的227\227像素的圖像會變成6\*6這麽小,主要原因是歸功於降采樣(池化層),
當然卷積層也會讓圖像變小,一層層的下去,圖像越來越小。
4、模塊六、七、八
模塊六和七就是所謂的全連接層了,全連接層就和人工神經網絡的結構一樣的,結點數超級多,連接線也超多,
所以這兒引出了一個dropout層,來去除一部分沒有足夠激活的層。
模塊八是一個輸出的結果,結合上softmax做出分類。有幾類,輸出幾個結點,每個結點保存的是屬於該類別的概率值。
AlexNet總結:
- 輸入尺寸:227*227*3
- 卷積層:5個
- 降采樣層(池化層):3個
- 全連接層:2個
- 輸出層:1個。1000個類別
四、ZFNet
五、VGG-16網絡
VGGNet是牛津大學計算機視覺組(Visual Geometry Group)和Google DeepMind公司的研究員一起研發的深度卷積神經網絡。
VGGNet探索了卷積神經網絡的深度與其性能之間的關系,通過反復堆疊3*3的小型卷積核和2*2的最大池化層,
VGGNet成功地構築了16~19層深的卷積神經網絡。VGGNet相比之前state-of-the-art的網絡結構,錯誤率大幅下降,
VGGNet論文中全部使用了3*3的小型卷積核和2*2的最大池化核,通過不斷加深網絡結構來提升性能。
VGG-16和VGG-19結構如下:
總結:
(1)VGG-16網絡中的16代表的含義為:含有參數的有16個層,共包含參數約為1.38億。
(2)VGG-16網絡結構很規整,沒有那麽多的超參數,專註於構建簡單的網絡,都是幾個卷積層後面跟一個可以壓縮
圖像大小的池化層。即:全部使用3*3的小型卷積核和2*2的最大池化層。
卷積層:CONV=3*3 filters, s = 1, padding = same convolution。
池化層:MAX_POOL = 2*2 , s = 2。
(3)優點:簡化了卷積神經網絡的結構;缺點:訓練的特征數量非常大。
(4)隨著網絡加深,圖像的寬度和高度都在以一定的規律不斷減小,
每次池化後剛好縮小一半,信道數目不斷增加一倍。
六、Inception網絡(google公司)——GoogLeNet網絡
(一)綜述
獲得高質量模型最保險的做法就是增加模型的深度(層數)或者是其寬度(層核或者神經元數),
但是這裏一般設計思路的情況下會出現如下的缺陷:
1.參數太多,若訓練數據集有限,容易過擬合;
2.網絡越大計算復雜度越大,難以應用;
3.網絡越深,梯度越往後穿越容易消失,難以優化模型。
解決上述兩個缺點的根本方法是將全連接甚至一般的卷積都轉化為稀疏連接。為了打破網絡對稱性和提高
學習能力,傳統的網絡都使用了隨機稀疏連接。但是,計算機軟硬件對非均勻稀疏數據的計算效率很差,
所以在AlexNet中又重新啟用了全連接層,目的是為了更好地優化並行運算。現在的問題是有沒有一種方法,
既能保持網絡結構的稀疏性,又能利用密集矩陣的高計算性能。
(二)Inception模塊介紹
Inception架構的主要思想是找出如何用密集成分來近似最優的局部稀疏結。
對上圖做以下說明:
1 . 采用不同大小的卷積核意味著不同大小的感受野,最後拼接意味著不同尺度特征的融合;
2 . 之所以卷積核大小采用1*1、3*3和5*5,主要是為了方便對齊。設定卷積步長stride=1之後,
只要分別設定padding =0、1、2,采用same卷積可以得到相同維度的特征,然後這些特征直接拼接在一起;
3 . 文章說很多地方都表明pooling挺有效,所以Inception裏面也嵌入了pooling。
4 . 網絡越到後面特征越抽象,且每個特征涉及的感受野也更大,隨著層數的增加,3x3和5x5卷積的比例也要增加。
Inception的作用:代替人工確定卷積層中的過濾器類型或者確定是否需要創建卷積層和池化層,即:不需要人為的
決定使用哪個過濾器,是否需要池化層等,由網絡自行決定這些參數,可以給網絡添加所有可能值,將輸出連接
起來,網絡自己學習它需要什麽樣的參數。
naive版本的Inception網絡的缺陷:計算成本。使用5x5的卷積核仍然會帶來巨大的計算量,約需要1.2億次的計算量。
為減少計算成本,采用1x1卷積核來進行降維。 示意圖如下:
在3x3和5x5的過濾器前面,max pooling後分別加上了1x1的卷積核,最後將它們全部以通道/厚度為軸拼接起來,
最終輸出大小為28*28*256,卷積的參數數量比原來減少了4倍,得到最終版本的Inception模塊:
(三)googLeNet介紹
1、googLeNet——Inception V1結構
googlenet的主要思想就是圍繞這兩個思路去做的:
(1).深度,層數更深,文章采用了22層,為了避免上述提到的梯度消失問題,
googlenet巧妙的在不同深度處增加了兩個loss來保證梯度回傳消失的現象。
(2).寬度,增加了多種核 1x1,3x3,5x5,還有直接max pooling的,
但是如果簡單的將這些應用到feature map上的話,concat起來的feature map厚度將會很大,
所以在googlenet中為了避免這一現象提出的inception具有如下結構,在3x3前,5x5前,
max pooling後分別加上了1x1的卷積核起到了降低feature map厚度的作用。
對上圖做如下說明:(1)顯然GoogLeNet采用了Inception模塊化(9個)的結構,共22層,方便增添和修改; (2)網絡最後采用了average pooling來代替全連接層,想法來自NIN,參數量僅為AlexNet的1/12,性能優於AlexNet, 事實證明可以將TOP1 accuracy提高0.6%。但是,實際在最後還是加了一個全連接層,主要是為了方便finetune; (3)雖然移除了全連接,但是網絡中依然使用了Dropout ; (4)為了避免梯度消失,網絡額外增加了2個輔助的softmax用於向前傳導梯度。 文章中說這兩個輔助的分類器的loss應該加一個衰減系數,但看caffe中的model也沒有加任何衰減。 此外,實際測試的時候,這兩個額外的softmax會被去掉。
(5)上述的GoogLeNet的版本成它使用的Inception V1結構。
2、Inception V2結構
大尺寸的卷積核可以帶來更大的感受野,也意味著更多的參數,比如5x5卷積核參數是3x3卷積核的25/9=2.78倍。
為此,作者提出可以用2個連續的3x3卷積層(stride=1)組成的小網絡來代替單個的5x5卷積層,這便是Inception V2結構,
保持感受野範圍的同時又減少了參數量,如下圖:
3、Inception V3結構
大卷積核完全可以由一系列的3x3卷積核來替代,那能不能分解的更小一點呢。
文章考慮了 nx1 卷積核,如下圖所示的取代3x3卷積:
於是,任意nxn的卷積都可以通過1xn卷積後接nx1卷積來替代。實際上,作者發現在網絡的前期使用這種分解效果
並不好,還有在中度大小的feature map上使用效果才會更好,對於mxm大小的feature map,建議m在12到20之間。
用nx1卷積來代替大卷積核,這裏設定n=7來應對17x17大小的feature map。該結構被正式用在GoogLeNet V2中。
4、Inception V4結構,它結合了殘差神經網絡ResNet。
參考鏈接:http://blog.csdn.net/stdcoutzyx/article/details/51052847
http://blog.csdn.net/shuzfan/article/details/50738394#googlenet-inception-v2
七、殘差神經網絡——ResNet
(一)綜述
深度學習網絡的深度對最後的分類和識別的效果有著很大的影響,所以正常想法就是能把網絡設計的越深越好,
但是事實上卻不是這樣,常規的網絡的堆疊(plain network)在網絡很深的時候,效果卻越來越差了。其中原因之一
即是網絡越深,梯度消失的現象就越來越明顯,網絡的訓練效果也不會很好。 但是現在淺層的網絡(shallower network)
又無法明顯提升網絡的識別效果了,所以現在要解決的問題就是怎樣在加深網絡的情況下又解決梯度消失的問題。
(二)殘差模塊——Residual bloack
通過在一個淺層網絡基礎上疊加 y=x 的層(稱identity mappings,恒等映射),可以讓網絡隨深度增加而不退化。
這反映了多層非線性網絡無法逼近恒等映射網絡。但是,不退化不是我們的目的,我們希望有更好性能的網絡。
resnet學習的是殘差函數F(x) = H(x) - x, 這裏如果F(x) = 0, 那麽就是上面提到的恒等映射。事實上,
resnet是“shortcut connections”的在connections是在恒等映射下的特殊情況,它沒有引入額外的參數和計算復雜度。
假如優化目標函數是逼近一個恒等映射, 而不是0映射, 那麽學習找到對恒等映射的擾動會比重新學習一個映射函數要容易。
殘差函數一般會有較小的響應波動,表明恒等映射是一個合理的預處理。
殘差模塊小結:
非常深的網絡很難訓練,存在梯度消失和梯度爆炸問題,學習 skip connection它可以從某一層獲得激活,然後迅速反饋給另外一層甚至更深層,利用 skip connection可以構建殘差網絡ResNet來訓練更深的網絡,ResNet網絡是由殘差模塊構建的。
上圖中,是一個兩層的神經網絡,在l層進行激活操作,得到a[l+1],再次進行激活得到a[l+2]。由下面公式:
a[l+2] 加上了 a[l]的殘差塊,即:殘差網絡中,直接將a[l]向後拷貝到神經網絡的更深層,在ReLU非線性激活前面
加上a[l],a[l]的信息直接達到網絡深層。使用殘差塊能夠訓練更深層的網絡,構建一個ResNet網絡就是通過將很多
這樣的殘差塊堆積在一起,形成一個深度神經網絡。
(三)殘差網絡——ResNet
上圖中是用5個殘差塊連接在一起構成的殘差網絡,用梯度下降算法訓練一個神經網絡,若沒有殘差,會發現
隨著網絡加深,訓練誤差先減少後增加,理論上訓練誤差越來越小比較好。而對於殘差網絡來講,隨著層數增加,
訓練誤差越來越減小,這種方式能夠到達網絡更深層,有助於解決梯度消失和梯度爆炸的問題,讓我們訓練更深網絡
同時又能保證良好的性能。
殘差網絡有很好表現的原因舉例:
假設有一個很大的神經網絡,輸入矩陣為X,輸出激活值為a[l],加入給這個網絡額外增加兩層,最終輸出結果為a[l+2],
可以把這兩層看做一個殘差模塊,在整個網絡中使用ReLU激活函數,所有的激活值都大於等於0。
對於大型的網絡,無論把殘差塊添加到神經網絡的中間還是末端,都不會影響網絡的表現。
殘差網絡起作用的主要原因是:It‘s so easy for these extra layers to learn the itentity function.
這些殘差塊學習恒等函數非常容易。可以確定網絡性能不受影響,很多時候甚至可以提高學習效率。
模型構建好後進行實驗,在plain上觀測到明顯的退化現象,而且ResNet上不僅沒有退化,34層網絡的效果反而比18層的更好,而且不僅如此,ResNet的收斂速度比plain的要快得多。
實際中,考慮計算的成本,對殘差塊做了計算優化,即將兩個3x3的卷積層替換為1x1 + 3x3 + 1x1, 如下圖。新結構中的中間3x3的卷積層首先在一個降維1x1卷積層下減少了計算,然後在另一個1x1的卷積層下做了還原,既保持了精度又減少了計算量。
這相當於對於相同數量的層又減少了參數量,因此可以拓展成更深的模型。於是作者提出了50、101、152層的ResNet,而且不僅沒有出現退化問題,錯誤率也大大降低,同時計算復雜度也保持在很低的程度。
這個時候ResNet的錯誤率已經把其他網絡落下幾條街了,但是似乎還並不滿足,於是又搭建了更加變態的1202層的網絡,對於這麽深的網絡,優化依然並不困難,但是出現了過擬合的問題,這是很正常的,作者也說了以後會對這個1202層的模型進行進一步的改進。
深度學習——卷積神經網絡 的經典網絡(LeNet-5、AlexNet、ZFNet、VGG-16、GoogLeNet、ResNet)