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