轉(zhuǎn)載https://www.cnblogs.com/skyfsm/p/8451834.html
先膜拜大神,講得太詳細了囤捻。
CNN網(wǎng)絡架構演進:從LeNet到DenseNet
卷積神經(jīng)網(wǎng)絡可謂是現(xiàn)在深度學習領域中大紅大紫的網(wǎng)絡框架惨篱,尤其在計算機視覺領域更是一枝獨秀辛块。CNN從90年代的LeNet開始摘完,21世紀初沉寂了10年沼头,直到12年AlexNet開始又再煥發(fā)第二春移袍,從ZF Net到VGG解藻,GoogLeNet再到ResNet和最近的DenseNet,網(wǎng)絡越來越深葡盗,架構越來越復雜螟左,解決反向傳播時梯度消失的方法也越來越巧妙。新年有假期觅够,就好好總結一波CNN的各種經(jīng)典架構吧胶背,領略一下CNN的發(fā)展歷程中各路大神之間的智慧碰撞之美。
上面那圖是ILSVRC歷年的Top-5錯誤率喘先,我們會按照以上經(jīng)典網(wǎng)絡出現(xiàn)的時間順序?qū)λ麄冞M行介紹钳吟。
本文將會談到以下經(jīng)典的卷積神經(jīng)網(wǎng)絡:
? ? 1. LeNet
? ? 2. AlexNet
? ? 3. ZF
? ? 4. VGG
? ? 5. GoogLeNet
? ? 6. ResNet
? ? 7. DenseNet
開山之作:LeNet
閃光點:定義了CNN的基本組件,是CNN的鼻祖窘拯。
LeNet是卷積神經(jīng)網(wǎng)絡的祖師爺LeCun在1998年提出红且,用于解決手寫數(shù)字識別的視覺任務坝茎。自那時起,CNN的最基本的架構就定下來了:卷積層暇番、池化層嗤放、全連接層。如今各大深度學習框架中所使用的LeNet都是簡化改進過的LeNet-5(-5表示具有5個層)壁酬,和原始的LeNet有些許不同次酌,比如把激活函數(shù)改為了現(xiàn)在很常用的ReLu。
LeNet-5跟現(xiàn)有的conv->pool->ReLU的套路不同厨喂,它使用的方式是conv1->pool->conv2->pool2再接全連接層和措,但是不變的是庄呈,卷積層后緊接池化層的模式依舊不變蜕煌。
以上圖為例,對經(jīng)典的LeNet-5做深入分析:
? ? 1. 首先輸入圖像是單通道的28*28大小的圖像诬留,用矩陣表示就是[1,28,28]
? ? 2. 第一個卷積層conv1所用的卷積核尺寸為5*5斜纪,滑動步長為1,卷積核數(shù)目為20文兑,那么經(jīng)過該層后圖像尺寸變?yōu)?4盒刚,28-5+1=24,輸出矩陣為[20,24,24]绿贞。
? ? 3. 第一個池化層pool核尺寸為2*2因块,步長2,這是沒有重疊的max pooling籍铁,池化操作后涡上,圖像尺寸減半,變?yōu)?2×12拒名,輸出矩陣為[20,12,12]吩愧。
? ? 4. 第二個卷積層conv2的卷積核尺寸為5*5,步長1增显,卷積核數(shù)目為50雁佳,卷積后圖像尺寸變?yōu)?,這是因為12-5+1=8,輸出矩陣為[50,8,8].
? ? 5. 第二個池化層pool2核尺寸為2*2同云,步長2糖权,這是沒有重疊的max pooling,池化操作后炸站,圖像尺寸減半星澳,變?yōu)?×4,輸出矩陣為[50,4,4]武契。
? ? 6. pool2后面接全連接層fc1募判,神經(jīng)元數(shù)目為500荡含,再接relu激活函數(shù)。
? ? 7. 再接fc2届垫,神經(jīng)元個數(shù)為10释液,得到10維的特征向量,用于10個數(shù)字的分類訓練装处,送入softmaxt分類误债,得到分類結果的概率output。
王者歸來:AlexNet
AlexNet在2012年ImageNet競賽中以超過第二名10.9個百分點的絕對優(yōu)勢一舉奪冠妄迁,從此深度學習和卷積神經(jīng)網(wǎng)絡名聲鵲起寝蹈,深度學習的研究如雨后春筍般出現(xiàn),AlexNet的出現(xiàn)可謂是卷積神經(jīng)網(wǎng)絡的王者歸來登淘。
閃光點:
? ? 更深的網(wǎng)絡
? ? 數(shù)據(jù)增廣
? ? ReLU
? ? Dropout
? ? LRN
以上圖AlexNet架構為例箫老,這個網(wǎng)絡前面5層是卷積層,后面三層是全連接層黔州,最終softmax輸出是1000類耍鬓,取其前兩層進行詳細說明。
? ? 1. AlexNet共包含5層卷積層和三層全連接層流妻,層數(shù)比LeNet多了不少牲蜀,但卷積神經(jīng)網(wǎng)絡總的流程并沒有變化,只是在深度上加了不少绅这。
? ? 2. AlexNet針對的是1000類的分類問題涣达,輸入圖片規(guī)定是256×256的三通道彩色圖片,為了增強模型的泛化能力证薇,避免過擬合度苔,作者使用了隨機裁剪的思路對原來256×256的圖像進行隨機裁剪,得到尺寸為3×224×224的圖像棕叫,輸入到網(wǎng)絡訓練林螃。
? ? 1. 因為使用多GPU訓練,所以可以看到第一層卷積層后有兩個完全一樣的分支俺泣,以加速訓練疗认。
? ? 2. 針對一個分支分析:第一層卷積層conv1的卷積核尺寸為11×11,滑動步長為4伏钠,卷積核數(shù)目為48横漏。卷積后得到的輸出矩陣為[48,55,55]。這里的55是個難以理解的數(shù)字熟掂,作者也沒有對此說明缎浇,如果按照正常計算的話(224-11)/4+1 != 55的,所以這里是做了padding再做卷積的赴肚,即先padiing圖像至227×227素跺,再做卷積(227-11)/4+1 = 55二蓝。這些像素層經(jīng)過relu1單元的處理简烘,生成激活像素層诅蝶,尺寸仍為2組48×55×55的像素層數(shù)據(jù)虑绵。然后經(jīng)過歸一化處理芥玉,歸一化運算的尺度為5*5。第一卷積層運算結束后形成的像素層的規(guī)模為48×27×27朵纷。
? ? 3. 輸入矩陣是[48,55,55].接著是池化層汰瘫,做max pooling操作疹娶,池化運算的尺度為3*3箕憾,運算的步長為2牡借,則池化后圖像的尺寸為(55-3)/2+1=27。所以得到的輸出矩陣是[48,27,27]袭异。后面層不再重復敘述钠龙。
AlexNet用到訓練技巧:
? ? 數(shù)據(jù)增廣技巧來增加模型泛化能力。
? ? 用ReLU代替Sigmoid來加快SGD的收斂速度
? ? Dropout:Dropout原理類似于淺層學習算法的中集成算法扁远,該方法通過讓全連接層的神經(jīng)元(該模型在前兩個全連接層引入Dropout)以一定的概率失去活性(比如0.5)失活的神經(jīng)元不再參與前向和反向傳播俊鱼,相當于約有一半的神經(jīng)元不再起作用刻像。在測試的時候畅买,讓所有神經(jīng)元的輸出乘0.5。Dropout的引用细睡,有效緩解了模型的過擬合谷羞。
? ? Local Responce Normalization:局部響應歸一層的基本思路是,假如這是網(wǎng)絡的一塊溜徙,比如是 13×13×256湃缎, LRN 要做的就是選取一個位置,比如說這樣一個位置蠢壹,從這個位置穿過整個通道嗓违,能得到 256 個數(shù)字,并進行歸一化图贸。進行局部響應歸一化的動機是蹂季,對于這張 13×13 的圖像中的每個位置來說,我們可能并不需要太多的高激活神經(jīng)元疏日。但是后來偿洁,很多研究者發(fā)現(xiàn) LRN 起不到太大作用,因為并不重要沟优,而且我們現(xiàn)在并不用 LRN 來訓練網(wǎng)絡涕滋。
穩(wěn)步前行:ZF-Net
ZFNet是2013ImageNet分類任務的冠軍,其網(wǎng)絡結構沒什么改進挠阁,只是調(diào)了調(diào)參宾肺,性能較Alex提升了不少溯饵。ZF-Net只是將AlexNet第一層卷積核由11變成7,步長由4變?yōu)?锨用,第3瓣喊,4,5卷積層轉(zhuǎn)變?yōu)?84黔酥,384藻三,256。這一年的ImageNet還是比較平靜的一屆跪者,其冠軍ZF-Net的名堂也沒其他屆的經(jīng)典網(wǎng)絡架構響亮棵帽。
越走越深:VGG-Nets
VGG-Nets是由牛津大學VGG(Visual Geometry Group)提出,是2014年ImageNet競賽定位任務的第一名和分類任務的第二名的中的基礎網(wǎng)絡渣玲。VGG可以看成是加深版本的AlexNet. 都是conv layer + FC layer逗概,在當時看來這是一個非常深的網(wǎng)絡了,因為層數(shù)高達十多層忘衍,我們從其論文名字就知道了(《Very Deep Convolutional Networks for Large-Scale Visual Recognition》)逾苫,當然以現(xiàn)在的目光看來VGG真的稱不上是一個very deep的網(wǎng)絡。
上面一個表格是描述的是VGG-Net的網(wǎng)絡結構以及誕生過程枚钓。為了解決初始化(權重初始化)等問題铅搓,VGG采用的是一種Pre-training的方式,這種方式在經(jīng)典的神經(jīng)網(wǎng)絡中經(jīng)常見得到搀捷,就是先訓練一部分小網(wǎng)絡星掰,然后再確保這部分網(wǎng)絡穩(wěn)定之后,再在這基礎上逐漸加深嫩舟。表1從左到右體現(xiàn)的就是這個過程氢烘,并且當網(wǎng)絡處于D階段的時候,效果是最優(yōu)的家厌,因此D階段的網(wǎng)絡也就是VGG-16了播玖!E階段得到的網(wǎng)絡就是VGG-19了!VGG-16的16指的是conv+fc的總層數(shù)是16饭于,是不包括max pool的層數(shù)蜀踏!
下面這個圖就是VGG-16的網(wǎng)絡結構。
由上圖看出镰绎,VGG-16的結構非常整潔脓斩,深度較AlexNet深得多,里面包含多個conv->conv->max_pool這類的結構,VGG的卷積層都是same的卷積畴栖,即卷積過后的輸出圖像的尺寸與輸入是一致的随静,它的下采樣完全是由max pooling來實現(xiàn)。
VGG網(wǎng)絡后接3個全連接層,filter的個數(shù)(卷積后的輸出通道數(shù))從64開始燎猛,然后沒接一個pooling后其成倍的增加恋捆,128、512重绷,VGG的注意貢獻是使用小尺寸的filter沸停,及有規(guī)則的卷積-池化操作。
閃光點:
? ? 卷積層使用更小的filter尺寸和間隔
與AlexNet相比昭卓,可以看出VGG-Nets的卷積核尺寸還是很小的愤钾,比如AlexNet第一層的卷積層用到的卷積核尺寸就是11*11,這是一個很大卷積核了候醒。而反觀VGG-Nets能颁,用到的卷積核的尺寸無非都是1×1和3×3的小卷積核,可以替代大的filter尺寸倒淫。
3×3卷積核的優(yōu)點:
? ? 1. 多個3×3的卷基層比一個大尺寸filter卷基層有更多的非線性伙菊,使得判決函數(shù)更加具有判決性
? ? 2. 多個3×3的卷積層比一個大尺寸的filter有更少的參數(shù),假設卷基層的輸入和輸出的特征圖大小相同為C敌土,那么三個3×3的卷積層參數(shù)個數(shù)3×(3×3×C×C)=27CC镜硕;一個7×7的卷積層參數(shù)為49CC;所以可以把三個3×3的filter看成是一個7×7filter的分解(中間層有非線性的分解)
1*1卷積核的優(yōu)點:
? ? 作用是在不影響輸入輸出維數(shù)的情況下返干,對輸入進行線性形變兴枯,然后通過Relu進行非線性處理,增加網(wǎng)絡的非線性表達能力犬金。
大浪推手:GoogLeNet
GoogLeNet在2014的ImageNet分類任務上擊敗了VGG-Nets奪得冠軍念恍,其實力肯定是非常深厚的,GoogLeNet跟AlexNet,VGG-Nets這種單純依靠加深網(wǎng)絡結構進而改進網(wǎng)絡性能的思路不一樣晚顷,它另辟幽徑,在加深網(wǎng)絡的同時(22層)疗疟,也在網(wǎng)絡結構上做了創(chuàng)新该默,引入Inception結構代替了單純的卷積+激活的傳統(tǒng)操作(這思路最早由Network in Network提出)。GoogLeNet進一步把對卷積神經(jīng)網(wǎng)絡的研究推上新的高度策彤。
閃光點:
? ? 1. 引入Inception結構
? ? 2. 中間層的輔助LOSS單元
? ? 3. 后面的全連接層全部替換為簡單的全局平均pooling
上圖結構就是Inception栓袖,結構里的卷積stride都是1,另外為了保持特征響應圖大小一致店诗,都用了零填充裹刮。最后每個卷積層后面都立刻接了個ReLU層。在輸出前有個叫concatenate的層庞瘸,直譯的意思是“并置”捧弃,即把4組不同類型但大小相同的特征響應圖一張張并排疊起來,形成新的特征響應圖。Inception結構里主要做了兩件事:1. 通過3×3的池化违霞、以及1×1嘴办、3×3和5×5這三種不同尺度的卷積核,一共4種方式對輸入的特征響應圖做了特征提取买鸽。2. 為了降低計算量涧郊。同時讓信息通過更少的連接傳遞以達到更加稀疏的特性,采用1×1卷積核來實現(xiàn)降維眼五。
這里想再詳細談談1×1卷積核的作用妆艘,它究竟是怎么實現(xiàn)降維的。現(xiàn)在運算如下:下面圖1是3×3卷積核的卷積看幼,圖2是1×1卷積核的卷積過程双仍。對于單通道輸入,1×1的卷積確實不能起到降維作用桌吃,但對于多通道輸入朱沃,就不不同了。假設你有256個特征輸入茅诱,256個特征輸出逗物,同時假設Inception層只執(zhí)行3×3的卷積。這意味著總共要進行 256×256×3×3的卷積(589000次乘積累加(MAC)運算)瑟俭。這可能超出了我們的計算預算翎卓,比方說,在Google服務器上花0.5毫秒運行該層摆寄。作為替代失暴,我們決定減少需要卷積的特征的數(shù)量,比如減少到64(256/4)個微饥。在這種情況下逗扒,我們首先進行256到64的1×1卷積,然后在所有Inception的分支上進行64次卷積欠橘,接著再使用一個64到256的1×1卷積矩肩。
? ? 256×64×1×1 = 16000
? ? 64×64×3×3 = 36000
? ? 64×256×1×1 = 16000
現(xiàn)在的計算量大約是70000(即16000+36000+16000),相比之前的約600000肃续,幾乎減少了10倍黍檩。這就通過小卷積核實現(xiàn)了降維。
現(xiàn)在再考慮一個問題:為什么一定要用1×1卷積核始锚,3×3不也可以嗎刽酱?考慮[50,200,200]的矩陣輸入,我們可以使用20個1×1的卷積核進行卷積瞧捌,得到輸出[20,200,200]棵里。有人問,我用20個3×3的卷積核不是也能得到[20,200,200]的矩陣輸出嗎,為什么就使用1×1的卷積核衍慎?我們計算一下卷積參數(shù)就知道了转唉,對于1×1的參數(shù)總數(shù):20×200×200×(1×1),對于3×3的參數(shù)總數(shù):20×200×200×(3×3)稳捆,可以看出赠法,使用1×1的參數(shù)總數(shù)僅為3×3的總數(shù)的九分之一!所以我們使用的是1×1卷積核乔夯。
GoogLeNet網(wǎng)絡結構中有3個LOSS單元砖织,這樣的網(wǎng)絡設計是為了幫助網(wǎng)絡的收斂。在中間層加入輔助計算的LOSS單元末荐,目的是計算損失時讓低層的特征也有很好的區(qū)分能力侧纯,從而讓網(wǎng)絡更好地被訓練。在論文中甲脏,這兩個輔助LOSS單元的計算被乘以0.3眶熬,然后和最后的LOSS相加作為最終的損失函數(shù)來訓練網(wǎng)絡。
GoogLeNet還有一個閃光點值得一提块请,那就是將后面的全連接層全部替換為簡單的全局平均pooling娜氏,在最后參數(shù)會變的更少。而在AlexNet中最后3層的全連接層參數(shù)差不多占總參數(shù)的90%墩新,使用大網(wǎng)絡在寬度和深度允許GoogleNet移除全連接層贸弥,但并不會影響到結果的精度,在ImageNet中實現(xiàn)93.3%的精度海渊,而且要比VGG還要快绵疲。
里程碑式創(chuàng)新:ResNet
2015年何愷明推出的ResNet在ISLVRC和COCO上橫掃所有選手,獲得冠軍臣疑。ResNet在網(wǎng)絡結構上做了大創(chuàng)新盔憨,而不再是簡單的堆積層數(shù),ResNet在卷積神經(jīng)網(wǎng)絡的新思路朝捆,絕對是深度學習發(fā)展歷程上里程碑式的事件般渡。
閃光點:
? ? 層數(shù)非常深,已經(jīng)超過百層
? ? 引入殘差單元來解決退化問題
從前面可以看到芙盘,隨著網(wǎng)絡深度增加,網(wǎng)絡的準確度應該同步增加脸秽,當然要注意過擬合問題儒老。但是網(wǎng)絡深度增加的一個問題在于這些增加的層是參數(shù)更新的信號,因為梯度是從后向前傳播的记餐,增加網(wǎng)絡深度后驮樊,比較靠前的層梯度會很小。這意味著這些層基本上學習停滯了,這就是梯度消失問題囚衔。深度網(wǎng)絡的第二個問題在于訓練挖腰,當網(wǎng)絡更深時意味著參數(shù)空間更大,優(yōu)化問題變得更難练湿,因此簡單地去增加網(wǎng)絡深度反而出現(xiàn)更高的訓練誤差猴仑,深層網(wǎng)絡雖然收斂了,但網(wǎng)絡卻開始退化了肥哎,即增加網(wǎng)絡層數(shù)卻導致更大的誤差辽俗,比如下圖,一個56層的網(wǎng)絡的性能卻不如20層的性能好篡诽,這不是因為過擬合(訓練集訓練誤差依然很高)崖飘,這就是煩人的退化問題。殘差網(wǎng)絡ResNet設計一種殘差模塊讓我們可以訓練更深的網(wǎng)絡杈女。
這里詳細分析一下殘差單元來理解ResNet的精髓朱浴。
從下圖可以看出,數(shù)據(jù)經(jīng)過了兩條路線达椰,一條是常規(guī)路線翰蠢,另一條則是捷徑(shortcut),直接實現(xiàn)單位映射的直接連接的路線砰碴,這有點類似與電路中的“短路”躏筏。通過實驗,這種帶有shortcut的結構確實可以很好地應對退化問題呈枉。我們把網(wǎng)絡中的一個模塊的輸入和輸出關系看作是y=H(x)趁尼,那么直接通過梯度方法求H(x)就會遇到上面提到的退化問題,如果使用了這種帶shortcut的結構猖辫,那么可變參數(shù)部分的優(yōu)化目標就不再是H(x),若用F(x)來代表需要優(yōu)化的部分的話酥泞,則H(x)=F(x)+x,也就是F(x)=H(x)-x啃憎。因為在單位映射的假設中y=x就相當于觀測值芝囤,所以F(x)就對應著殘差,因而叫殘差網(wǎng)絡辛萍。為啥要這樣做悯姊,因為作者認為學習殘差F(X)比直接學習H(X)簡單!設想下贩毕,現(xiàn)在根據(jù)我們只需要去學習輸入和輸出的差值就可以了悯许,絕對量變?yōu)橄鄬α浚℉(x)-x 就是輸出相對于輸入變化了多少),優(yōu)化起來簡單很多辉阶。
考慮到x的維度與F(X)維度可能不匹配情況先壕,需進行維度匹配瘩扼。這里論文中采用兩種方法解決這一問題(其實是三種,但通過實驗發(fā)現(xiàn)第三種方法會使performance急劇下降垃僚,故不采用):
? ? 1. zero_padding:對恒等層進行0填充的方式將維度補充完整集绰。這種方法不會增加額外的參數(shù)
? ? 2. projection:在恒等層采用1x1的卷積核來增加維度。這種方法會增加額外的參數(shù)?
下圖展示了兩種形態(tài)的殘差模塊谆棺,左圖是常規(guī)殘差模塊栽燕,有兩個3×3卷積核卷積核組成,但是隨著網(wǎng)絡進一步加深包券,這種殘差結構在實踐中并不是十分有效纫谅。針對這問題,右圖的“瓶頸殘差模塊”(bottleneck residual block)可以有更好的效果溅固,它依次由1×1付秕、3×3、1×1這三個卷積層堆積而成侍郭,這里的1×1的卷積能夠起降維或升維的作用询吴,從而令3×3的卷積可以在相對較低維度的輸入上進行,以達到提高計算效率的目的亮元。?
繼往開來:DenseNet
自Resnet提出以后猛计,ResNet的變種網(wǎng)絡層出不窮,都各有其特點爆捞,網(wǎng)絡性能也有一定的提升奉瘤。本文介紹的最后一個網(wǎng)絡是CVPR 2017最佳論文DenseNet,論文中提出的DenseNet(Dense Convolutional Network)主要還是和ResNet及Inception網(wǎng)絡做對比煮甥,思想上有借鑒盗温,但卻是全新的結構,網(wǎng)絡結構并不復雜成肘,卻非常有效卖局,在CIFAR指標上全面超越ResNet∷簦可以說DenseNet吸收了ResNet最精華的部分砚偶,并在此上做了更加創(chuàng)新的工作,使得網(wǎng)絡性能進一步提升洒闸。
閃光點:
密集連接:緩解梯度消失問題染坯,加強特征傳播,鼓勵特征復用丘逸,極大的減少了參數(shù)量
DenseNet 是一種具有密集連接的卷積神經(jīng)網(wǎng)絡酒请。在該網(wǎng)絡中,任何兩層之間都有直接的連接鸣个,也就是說羞反,網(wǎng)絡每一層的輸入都是前面所有層輸出的并集,而該層所學習的特征圖也會被直接傳給其后面所有層作為輸入囤萤。下圖是 DenseNet 的一個dense block示意圖昼窗,一個block里面的結構如下,與ResNet中的BottleNeck基本一致:BN-ReLU-Conv(1×1)-BN-ReLU-Conv(3×3) 涛舍,而一個DenseNet則由多個這種block組成澄惊。每個DenseBlock的之間層稱為transition layers,由BN?>Conv(1×1)?>averagePooling(2×2)組成
密集連接不會帶來冗余嗎富雅?不會掸驱!密集連接這個詞給人的第一感覺就是極大的增加了網(wǎng)絡的參數(shù)量和計算量。但實際上 DenseNet 比其他網(wǎng)絡效率更高没佑,其關鍵就在于網(wǎng)絡每層計算量的減少以及特征的重復利用毕贼。DenseNet則是讓l層的輸入直接影響到之后的所有層,它的輸出為:xl=Hl([X0,X1,…,xl?1])蛤奢,其中[x0,x1,...,xl?1]就是將之前的feature map以通道的維度進行合并鬼癣。并且由于每一層都包含之前所有層的輸出信息,因此其只需要很少的特征圖就夠了啤贩,這也是為什么DneseNet的參數(shù)量較其他模型大大減少的原因待秃。這種dense connection相當于每一層都直接連接input和loss,因此就可以減輕梯度消失現(xiàn)象痹屹,這樣更深網(wǎng)絡不是問題
需要明確一點章郁,dense connectivity 僅僅是在一個dense block里的,不同dense block 之間是沒有dense connectivity的志衍,比如下圖所示暖庄。
但內(nèi)存占用極大。
?
垃圾博客太不好編輯了W慊P劬浴!