【深度學(xué)習(xí)基礎(chǔ)】經(jīng)典卷積神經(jīng)網(wǎng)絡(luò)
導(dǎo)語
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks, CNN)是一類包含卷積計(jì)算且具有深度結(jié)構(gòu)的前饋神經(jīng)網(wǎng)絡(luò)(Feedforward Neural Networks),是深度學(xué)習(xí)(deep learning)的代表算法之一。經(jīng)典的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),分別是LeNet-5、AlexNet和VGGNet。本問對經(jīng)典卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行講解。
本文來源于吳恩達(dá)老師的深度學(xué)習(xí)課程[1]筆記部分。
作者:黃海廣[2]
備注:筆記和作業(yè)(含數(shù)據(jù)、原始作業(yè)文件)、視頻都在?github[3]中下載。
正文開始
?經(jīng)典網(wǎng)絡(luò)(Classic networks)
我們來學(xué)習(xí)幾個(gè)經(jīng)典的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),分別是LeNet-5、AlexNet和VGGNet,開始吧。
首先看看LeNet-5的網(wǎng)絡(luò)結(jié)構(gòu),假設(shè)你有一張32×32×1的圖片,LeNet-5可以識別圖中的手寫數(shù)字,比如像這樣手寫數(shù)字7。LeNet-5是針對灰度圖片訓(xùn)練的,所以圖片的大小只有32×32×1。實(shí)際上LeNet-5的結(jié)構(gòu)和我們上周講的最后一個(gè)范例非常相似,使用6個(gè)5×5的過濾器,步幅為1。由于使用了6個(gè)過濾器,步幅為1,padding為0,輸出結(jié)果為28×28×6,圖像尺寸從32×32縮小到28×28。然后進(jìn)行池化操作,在這篇論文寫成的那個(gè)年代,人們更喜歡使用平均池化,而現(xiàn)在我們可能用最大池化更多一些。在這個(gè)例子中,我們進(jìn)行平均池化,過濾器的寬度為2,步幅為2,圖像的尺寸,高度和寬度都縮小了2倍,輸出結(jié)果是一個(gè)14×14×6的圖像。我覺得這張圖片應(yīng)該不是完全按照比例繪制的,如果嚴(yán)格按照比例繪制,新圖像的尺寸應(yīng)該剛好是原圖像的一半。

接下來是卷積層,我們用一組16個(gè)5×5的過濾器,新的輸出結(jié)果有16個(gè)通道。LeNet-5的論文是在1998年撰寫的,當(dāng)時(shí)人們并不使用padding,或者總是使用valid卷積,這就是為什么每進(jìn)行一次卷積,圖像的高度和寬度都會縮小,所以這個(gè)圖像從14到14縮小到了10×10。然后又是池化層,高度和寬度再縮小一半,輸出一個(gè)5×5×16的圖像。將所有數(shù)字相乘,乘積是400。
下一層是全連接層,在全連接層中,有400個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)有120個(gè)神經(jīng)元,這里已經(jīng)有了一個(gè)全連接層。但有時(shí)還會從這400個(gè)節(jié)點(diǎn)中抽取一部分節(jié)點(diǎn)構(gòu)建另一個(gè)全連接層,就像這樣,有2個(gè)全連接層。
最后一步就是利用這84個(gè)特征得到最后的輸出,我們還可以在這里再加一個(gè)節(jié)點(diǎn)用來預(yù)測的值,有10個(gè)可能的值,對應(yīng)識別0-9這10個(gè)數(shù)字。在現(xiàn)在的版本中則使用softmax函數(shù)輸出十種分類結(jié)果,而在當(dāng)時(shí),LeNet-5網(wǎng)絡(luò)在輸出層使用了另外一種,現(xiàn)在已經(jīng)很少用到的分類器。
相比現(xiàn)代版本,這里得到的神經(jīng)網(wǎng)絡(luò)會小一些,只有約6萬個(gè)參數(shù)。而現(xiàn)在,我們經(jīng)常看到含有一千萬到一億個(gè)參數(shù)的神經(jīng)網(wǎng)絡(luò),比這大1000倍的神經(jīng)網(wǎng)絡(luò)也不在少數(shù)。
不管怎樣,如果我們從左往右看,隨著網(wǎng)絡(luò)越來越深,圖像的高度和寬度在縮小,從最初的32×32縮小到28×28,再到14×14、10×10,最后只有5×5。與此同時(shí),隨著網(wǎng)絡(luò)層次的加深,通道數(shù)量一直在增加,從1增加到6個(gè),再到16個(gè)。

這個(gè)神經(jīng)網(wǎng)絡(luò)中還有一種模式至今仍然經(jīng)常用到,就是一個(gè)或多個(gè)卷積層后面跟著一個(gè)池化層,然后又是若干個(gè)卷積層再接一個(gè)池化層,然后是全連接層,最后是輸出,這種排列方式很常用。
對于那些想嘗試閱讀論文的同學(xué),我再補(bǔ)充幾點(diǎn)。接下來的部分主要針對那些打算閱讀經(jīng)典論文的同學(xué),所以會更加深入。這些內(nèi)容你完全可以跳過,算是對神經(jīng)網(wǎng)絡(luò)歷史的一種回顧吧,聽不懂也不要緊。
讀到這篇經(jīng)典論文時(shí),你會發(fā)現(xiàn),過去,人們使用sigmod函數(shù)和tanh函數(shù),而不是ReLu函數(shù),這篇論文中使用的正是sigmod函數(shù)和tanh函數(shù)。這種網(wǎng)絡(luò)結(jié)構(gòu)的特別之處還在于,各網(wǎng)絡(luò)層之間是有關(guān)聯(lián)的,這在今天看來顯得很有趣。
比如說,你有一個(gè)的網(wǎng)絡(luò),有個(gè)通道,使用尺寸為的過濾器,每個(gè)過濾器的通道數(shù)和它上一層的通道數(shù)相同。這是由于在當(dāng)時(shí),計(jì)算機(jī)的運(yùn)行速度非常慢,為了減少計(jì)算量和參數(shù),經(jīng)典的LeNet-5網(wǎng)絡(luò)使用了非常復(fù)雜的計(jì)算方式,每個(gè)過濾器都采用和輸入模塊一樣的通道數(shù)量。論文中提到的這些復(fù)雜細(xì)節(jié),現(xiàn)在一般都不用了。
我認(rèn)為當(dāng)時(shí)所進(jìn)行的最后一步其實(shí)到現(xiàn)在也還沒有真正完成,就是經(jīng)典的LeNet-5網(wǎng)絡(luò)在池化后進(jìn)行了非線性函數(shù)處理,在這個(gè)例子中,池化層之后使用了sigmod函數(shù)。如果你真的去讀這篇論文,這會是最難理解的部分之一,我們會在后面的課程中講到。
下面要講的網(wǎng)絡(luò)結(jié)構(gòu)簡單一些,幻燈片的大部分類容來自于原文的第二段和第三段,原文的后幾段介紹了另外一種思路。文中提到的這種圖形變形網(wǎng)絡(luò)如今并沒有得到廣泛應(yīng)用,所以在讀這篇論文的時(shí)候,我建議精讀第二段,這段重點(diǎn)介紹了這種網(wǎng)絡(luò)結(jié)構(gòu)。泛讀第三段,這里面主要是一些有趣的實(shí)驗(yàn)結(jié)果。
我要舉例說明的第二種神經(jīng)網(wǎng)絡(luò)是AlexNet,是以論文的第一作者Alex Krizhevsky的名字命名的,另外兩位合著者是ilya Sutskever和Geoffery Hinton。

AlexNet首先用一張227×227×3的圖片作為輸入,實(shí)際上原文中使用的圖像是224×224×3,但是如果你嘗試去推導(dǎo)一下,你會發(fā)現(xiàn)227×227這個(gè)尺寸更好一些。第一層我們使用96個(gè)11×11的過濾器,步幅為4,由于步幅是4,因此尺寸縮小到55×55,縮小了4倍左右。然后用一個(gè)3×3的過濾器構(gòu)建最大池化層,,步幅為2,卷積層尺寸縮小為27×27×96。接著再執(zhí)行一個(gè)5×5的卷積,padding之后,輸出是27×27×276。然后再次進(jìn)行最大池化,尺寸縮小到13×13。再執(zhí)行一次same卷積,相同的padding,得到的結(jié)果是13×13×384,384個(gè)過濾器。再做一次same卷積,就像這樣。再做一次同樣的操作,最后再進(jìn)行一次最大池化,尺寸縮小到6×6×256。6×6×256等于9216,將其展開為9216個(gè)單元,然后是一些全連接層。最后使用softmax函數(shù)輸出識別的結(jié)果,看它究竟是1000個(gè)可能的對象中的哪一個(gè)。
實(shí)際上,這種神經(jīng)網(wǎng)絡(luò)與LeNet有很多相似之處,不過AlexNet要大得多。正如前面講到的LeNet或LeNet-5大約有6萬個(gè)參數(shù),而AlexNet包含約6000萬個(gè)參數(shù)。當(dāng)用于訓(xùn)練圖像和數(shù)據(jù)集時(shí),AlexNet能夠處理非常相似的基本構(gòu)造模塊,這些模塊往往包含著大量的隱藏單元或數(shù)據(jù),這一點(diǎn)AlexNet表現(xiàn)出色。AlexNet比LeNet表現(xiàn)更為出色的另一個(gè)原因是它使用了ReLu激活函數(shù)。

同樣的,我還會講一些比較深奧的內(nèi)容,如果你并不打算閱讀論文,不聽也沒有關(guān)系。第一點(diǎn),在寫這篇論文的時(shí)候,GPU的處理速度還比較慢,所以AlexNet采用了非常復(fù)雜的方法在兩個(gè)GPU上進(jìn)行訓(xùn)練。大致原理是,這些層分別拆分到兩個(gè)不同的GPU上,同時(shí)還專門有一個(gè)方法用于兩個(gè)GPU進(jìn)行交流。

論文還提到,經(jīng)典的AlexNet結(jié)構(gòu)還有另一種類型的層,叫作“局部響應(yīng)歸一化層”(Local Response Normalization),即LRN層,這類層應(yīng)用得并不多,所以我并沒有專門講。局部響應(yīng)歸一層的基本思路是,假如這是網(wǎng)絡(luò)的一塊,比如是13×13×256,LRN要做的就是選取一個(gè)位置,比如說這樣一個(gè)位置,從這個(gè)位置穿過整個(gè)通道,能得到256個(gè)數(shù)字,并進(jìn)行歸一化。進(jìn)行局部響應(yīng)歸一化的動機(jī)是,對于這張13×13的圖像中的每個(gè)位置來說,我們可能并不需要太多的高激活神經(jīng)元。但是后來,很多研究者發(fā)現(xiàn)LRN起不到太大作用,這應(yīng)該是被我劃掉的內(nèi)容之一,因?yàn)椴⒉恢匾?,而且我們現(xiàn)在并不用LRN來訓(xùn)練網(wǎng)絡(luò)。
如果你對深度學(xué)習(xí)的歷史感興趣的話,我認(rèn)為在AlexNet之前,深度學(xué)習(xí)已經(jīng)在語音識別和其它幾個(gè)領(lǐng)域獲得了一些關(guān)注,但正是通過這篇論文,計(jì)算機(jī)視覺群體開始重視深度學(xué)習(xí),并確信深度學(xué)習(xí)可以應(yīng)用于計(jì)算機(jī)視覺領(lǐng)域。此后,深度學(xué)習(xí)在計(jì)算機(jī)視覺及其它領(lǐng)域的影響力與日俱增。如果你并不打算閱讀這方面的論文,其實(shí)可以不用學(xué)習(xí)這節(jié)課。但如果你想讀懂一些相關(guān)的論文,這是比較好理解的一篇,學(xué)起來會容易一些。
AlexNet網(wǎng)絡(luò)結(jié)構(gòu)看起來相對復(fù)雜,包含大量超參數(shù),這些數(shù)字(55×55×96、27×27×96、27×27×256……)都是Alex Krizhevsky及其合著者不得不給出的。

這節(jié)課要講的第三個(gè),也是最后一個(gè)范例是VGG,也叫作VGG-16網(wǎng)絡(luò)。值得注意的一點(diǎn)是,VGG-16網(wǎng)絡(luò)沒有那么多超參數(shù),這是一種只需要專注于構(gòu)建卷積層的簡單網(wǎng)絡(luò)。首先用3×3,步幅為1的過濾器構(gòu)建卷積層,padding參數(shù)為same卷積中的參數(shù)。然后用一個(gè)2×2,步幅為2的過濾器構(gòu)建最大池化層。因此VGG網(wǎng)絡(luò)的一大優(yōu)點(diǎn)是它確實(shí)簡化了神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),下面我們具體講講這種網(wǎng)絡(luò)結(jié)構(gòu)。

假設(shè)要識別這個(gè)圖像,在最開始的兩層用64個(gè)3×3的過濾器對輸入圖像進(jìn)行卷積,輸出結(jié)果是224×224×64,因?yàn)槭褂昧?strong>same卷積,通道數(shù)量也一樣。VGG-16其實(shí)是一個(gè)很深的網(wǎng)絡(luò),這里我并沒有把所有卷積層都畫出來。

假設(shè)這個(gè)小圖是我們的輸入圖像,尺寸是224×224×3,進(jìn)行第一個(gè)卷積之后得到224×224×64的特征圖,接著還有一層224×224×64,得到這樣2個(gè)厚度為64的卷積層,意味著我們用64個(gè)過濾器進(jìn)行了兩次卷積。正如我在前面提到的,這里采用的都是大小為3×3,步幅為1的過濾器,并且都是采用same卷積,所以我就不再把所有的層都畫出來了,只用一串?dāng)?shù)字代表這些網(wǎng)絡(luò)。
接下來創(chuàng)建一個(gè)池化層,池化層將輸入圖像進(jìn)行壓縮,從224×224×64縮小到多少呢?沒錯,減少到112×112×64。然后又是若干個(gè)卷積層,使用129個(gè)過濾器,以及一些same卷積,我們看看輸出什么結(jié)果,112×112×128.然后進(jìn)行池化,可以推導(dǎo)出池化后的結(jié)果是這樣(56×56×128)。接著再用256個(gè)相同的過濾器進(jìn)行三次卷積操作,然后再池化,然后再卷積三次,再池化。如此進(jìn)行幾輪操作后,將最后得到的7×7×512的特征圖進(jìn)行全連接操作,得到4096個(gè)單元,然后進(jìn)行softmax激活,輸出從1000個(gè)對象中識別的結(jié)果。

順便說一下,VGG-16的這個(gè)數(shù)字16,就是指在這個(gè)網(wǎng)絡(luò)中包含16個(gè)卷積層和全連接層。確實(shí)是個(gè)很大的網(wǎng)絡(luò),總共包含約1.38億個(gè)參數(shù),即便以現(xiàn)在的標(biāo)準(zhǔn)來看都算是非常大的網(wǎng)絡(luò)。但VGG-16的結(jié)構(gòu)并不復(fù)雜,這點(diǎn)非常吸引人,而且這種網(wǎng)絡(luò)結(jié)構(gòu)很規(guī)整,都是幾個(gè)卷積層后面跟著可以壓縮圖像大小的池化層,池化層縮小圖像的高度和寬度。同時(shí),卷積層的過濾器數(shù)量變化存在一定的規(guī)律,由64翻倍變成128,再到256和512。作者可能認(rèn)為512已經(jīng)足夠大了,所以后面的層就不再翻倍了。無論如何,每一步都進(jìn)行翻倍,或者說在每一組卷積層進(jìn)行過濾器翻倍操作,正是設(shè)計(jì)此種網(wǎng)絡(luò)結(jié)構(gòu)的另一個(gè)簡單原則。這種相對一致的網(wǎng)絡(luò)結(jié)構(gòu)對研究者很有吸引力,而它的主要缺點(diǎn)是需要訓(xùn)練的特征數(shù)量非常巨大。

有些文章還介紹了VGG-19網(wǎng)絡(luò),它甚至比VGG-16還要大,如果你想了解更多細(xì)節(jié),請參考幻燈片下方的注文,閱讀由Karen Simonyan和Andrew Zisserman撰寫的論文。由于VGG-16的表現(xiàn)幾乎和VGG-19不分高下,所以很多人還是會使用VGG-16。我最喜歡它的一點(diǎn)是,文中揭示了,隨著網(wǎng)絡(luò)的加深,圖像的高度和寬度都在以一定的規(guī)律不斷縮小,每次池化后剛好縮小一半,而通道數(shù)量在不斷增加,而且剛好也是在每組卷積操作后增加一倍。也就是說,圖像縮小的比例和通道數(shù)增加的比例是有規(guī)律的。從這個(gè)角度來看,這篇論文很吸引人。
以上就是三種經(jīng)典的網(wǎng)絡(luò)結(jié)構(gòu),如果你對這些論文感興趣,我建議從介紹AlexNet的論文開始,然后就是VGG的論文,最后是LeNet的論文。雖然有些晦澀難懂,但對于了解這些網(wǎng)絡(luò)結(jié)構(gòu)很有幫助。
參考資料
[1]??深度學(xué)習(xí)課程:?https://mooc.study.163.com/university/deeplearning_ai
[2]黃海廣:?https://github.com/fengdu78
[3]github:?https://github.com/fengdu78/deeplearning_ai_books
[2]黃海廣:?https://github.com/fengdu78
[3]github:?https://github.com/fengdu78/deeplearning_ai_books
往期精彩回顧
獲取本站知識星球優(yōu)惠券,復(fù)制鏈接直接打開:
https://t.zsxq.com/y7uvZF6
本站qq群704220115。
加入微信群請掃碼:
