手撕 CNN 经典网络之 AlexNet(理论篇)
大家好,我是紅色石頭!
第一個(gè)典型的CNN是LeNet5網(wǎng)絡(luò),而第一個(gè)大放異彩的CNN卻是AlexNet。2012年在全球知名的圖像識(shí)別競(jìng)賽 ILSVRC 中,AlexNet 橫空出世,直接將錯(cuò)誤率降低了近 10 個(gè)百分點(diǎn),這是之前所有機(jī)器學(xué)習(xí)模型無法做到的。
AlexNet的作者是多倫多大學(xué)的Alex Krizhevsky等人。Alex Krizhevsky是Hinton的學(xué)生。網(wǎng)上流行說 Hinton、LeCun和Bengio是神經(jīng)網(wǎng)絡(luò)領(lǐng)域三巨頭,LeCun就是LeNet5的作者(Yann LeCun)。
在正式介紹AlexNet之前,簡(jiǎn)單講一下該網(wǎng)絡(luò)是用來干嘛的。AlexNet跟LeNet-5類似也是一個(gè)用于圖像識(shí)別的卷積神經(jīng)網(wǎng)絡(luò)。AlexNet網(wǎng)絡(luò)結(jié)構(gòu)更加復(fù)雜,參數(shù)更多。在ILSVRC比賽中,AlexNet所用的數(shù)據(jù)集是ImageNet,總共識(shí)別1000個(gè)類別。
論文《ImageNet Classification with Deep Convolutional Neural Networks》
論文傳送門:
http://www.cs.toronto.edu/~fritz/absps/imagenet.pdf
1.?網(wǎng)絡(luò)結(jié)構(gòu)
AlexNet整體的網(wǎng)絡(luò)結(jié)構(gòu)包括:1個(gè)輸入層(input layer)、5個(gè)卷積層(C1、C2、C3、C4、C5)、2個(gè)全連接層(FC6、FC7)和1個(gè)輸出層(output layer)。下面對(duì)網(wǎng)絡(luò)結(jié)構(gòu)詳細(xì)介紹。
上面這張圖就是AlexNet的網(wǎng)絡(luò)結(jié)構(gòu)。初看這張圖有的讀者可能會(huì)覺得有個(gè)疑問:網(wǎng)絡(luò)上部分是不是沒有畫完?其實(shí)不是的。鑒于當(dāng)時(shí)的硬件資源限制,由于AlexNet結(jié)構(gòu)復(fù)雜、參數(shù)很龐大,難以在單個(gè)GPU上進(jìn)行訓(xùn)練。因此AlexNet采用兩路GTX 580 3GB GPU并行訓(xùn)練。也就是說把原先的卷積層平分成兩部分FeatureMap分別在兩塊GPU上進(jìn)行訓(xùn)練(例如卷積層55x55x96分成兩個(gè)FeatureMap:55x55x48)。上圖中上部分和下部分是對(duì)稱的,所以上半部分沒有完全畫出來。?
值得一提的是,卷積層 C2、C4、C5中的卷積核只和位于同一GPU的上一層的FeatureMap相連,C3的卷積核與兩個(gè)GPU的上一層的FeautureMap都連接。
1.1 輸入層(Input layer)?
原論文中,AlexNet的輸入圖像尺寸是224x224x3。但是實(shí)際圖像尺寸為227x227x3。據(jù)說224x224可能是寫paper時(shí)候的手誤?還是后來對(duì)網(wǎng)絡(luò)又做了調(diào)整?
1.2 卷積層(C1)
該層的處理流程是:卷積-->ReLU-->局部響應(yīng)歸一化(LRN)-->池化。?
卷積:輸入是227x227x3,使用96個(gè)11x11x3的卷積核進(jìn)行卷積,padding=0,stride=4,根據(jù)公式:(input_size + 2 * padding - kernel_size) / stride + 1=(227+2*0-11)/4+1=55,得到輸出是55x55x96。?
ReLU:將卷積層輸出的FeatureMap輸入到ReLU函數(shù)中。?
局部響應(yīng)歸一化:局部響應(yīng)歸一化層簡(jiǎn)稱LRN,是在深度學(xué)習(xí)中提高準(zhǔn)確度的技術(shù)方法。一般是在激活、池化后進(jìn)行。LRN對(duì)局部神經(jīng)元的活動(dòng)創(chuàng)建競(jìng)爭(zhēng)機(jī)制,使得其中響應(yīng)比較大的值變得相對(duì)更大,并抑制其他反饋較小的神經(jīng)元,增強(qiáng)了模型的泛化能力。
LRN的公式如下:
a為歸一化之前的神經(jīng)元,b為歸一化之后的神經(jīng)元;N是卷積核的個(gè)數(shù),也就是生成的FeatureMap的個(gè)數(shù);k,α,β,n是超參數(shù),論文中使用的值是k=2,n=5,α=0.0001,β=0.75。
局部響應(yīng)歸一化的輸出仍然是55x55x96。將其分成兩組,每組大小是55x55x48,分別位于單個(gè)GPU上。
池化:使用3x3,stride=2的池化單元進(jìn)行最大池化操作(max pooling)。注意這里使用的是重疊池化,即stride小于池化單元的邊長(zhǎng)。根據(jù)公式:(55+2*0-3)/2+1=27,每組得到的輸出為27x27x48。
1.3 卷積層(C2)
該層的處理流程是:卷積-->ReLU-->局部響應(yīng)歸一化(LRN)-->池化。?
卷積:兩組輸入均是27x27x48,各組分別使用128個(gè)5x5x48的卷積核進(jìn)行卷積,padding=2,stride=1,根據(jù)公式:(input_size + 2 * padding - kernel_size) / stride + 1=(27+2*2-5)/1+1=27,得到每組輸出是27x27x128。?
ReLU:將卷積層輸出的FeatureMap輸入到ReLU函數(shù)中。?
局部響應(yīng)歸一化:使用參數(shù)k=2,n=5,α=0.0001,β=0.75進(jìn)行歸一化。每組輸出仍然是27x27x128。?
池化:使用3x3,stride=2的池化單元進(jìn)行最大池化操作(max pooling)。注意這里使用的是重疊池化,即stride小于池化單元的邊長(zhǎng)。根據(jù)公式:(27+2*0-3)/2+1=13,每組得到的輸出為13x13x128。
1.4 卷積層(C3)
該層的處理流程是: 卷積-->ReLU?
卷積:輸入是13x13x256,使用384個(gè)3x3x256的卷積核進(jìn)行卷積,padding=1,stride=1,根據(jù)公式:(input_size + 2 * padding - kernel_size) / stride + 1=(13+2*1-3)/1+1=13,得到輸出是13x13x384。?
ReLU:將卷積層輸出的FeatureMap輸入到ReLU函數(shù)中。將輸出其分成兩組,每組FeatureMap大小是13x13x192,分別位于單個(gè)GPU上。
1.5 卷積層(C4)
該層的處理流程是:卷積-->ReLU?
卷積:兩組輸入均是13x13x192,各組分別使用192個(gè)3x3x192的卷積核進(jìn)行卷積,padding=1,stride=1,根據(jù)公式:(input_size + 2 * padding - kernel_size) / stride + 1=(13+2*1-3)/1+1=13,得到每組FeatureMap輸出是13x13x192。?
ReLU:將卷積層輸出的FeatureMap輸入到ReLU函數(shù)中。
1.6 卷積層(C5)
該層的處理流程是:卷積-->ReLU-->池化?
卷積:兩組輸入均是13x13x192,各組分別使用128個(gè)3x3x192的卷積核進(jìn)行卷積,padding=1,stride=1,根據(jù)公式:(input_size + 2 * padding - kernel_size) / stride + 1=(13+2*1-3)/1+1=13,得到每組FeatureMap輸出是13x13x128。?
ReLU:將卷積層輸出的FeatureMap輸入到ReLU函數(shù)中。?
池化:使用3x3,stride=2的池化單元進(jìn)行最大池化操作(max pooling)。注意這里使用的是重疊池化,即stride小于池化單元的邊長(zhǎng)。根據(jù)公式:(13+2*0-3)/2+1=6,每組得到的輸出為6x6x128。
1.7 全連接層(FC6)
該層的流程為:(卷積)全連接 -->ReLU -->Dropout (卷積)
全連接:輸入為6×6×256,使用4096個(gè)6×6×256的卷積核進(jìn)行卷積,由于卷積核尺寸與輸入的尺寸完全相同,即卷積核中的每個(gè)系數(shù)只與輸入尺寸的一個(gè)像素值相乘一一對(duì)應(yīng),根據(jù)公式:(input_size + 2 * padding - kernel_size) / stride + 1=(6+2*0-6)/1+1=1,得到輸出是1x1x4096。既有4096個(gè)神經(jīng)元,該層被稱為全連接層。?
ReLU:這4096個(gè)神經(jīng)元的運(yùn)算結(jié)果通過ReLU激活函數(shù)中。?
Dropout:隨機(jī)的斷開全連接層某些神經(jīng)元的連接,通過不激活某些神經(jīng)元的方式防止過擬合。4096個(gè)神經(jīng)元也被均分到兩塊GPU上進(jìn)行運(yùn)算。
1.8 全連接層(FC7)
該層的流程為:(卷積)全連接 -->ReLU -->Dropout
全連接:輸入為4096個(gè)神經(jīng)元,輸出也是4096個(gè)神經(jīng)元(作者設(shè)定的)。
ReLU:這4096個(gè)神經(jīng)元的運(yùn)算結(jié)果通過ReLU激活函數(shù)中。
Dropout:隨機(jī)的斷開全連接層某些神經(jīng)元的連接,通過不激活某些神經(jīng)元的方式防止過擬合。
4096個(gè)神經(jīng)元也被均分到兩塊GPU上進(jìn)行運(yùn)算。
1.9 輸出層(Output layer)
該層的流程為:(卷積)全連接 -->Softmax?
全連接:輸入為4096個(gè)神經(jīng)元,輸出是1000個(gè)神經(jīng)元。這1000個(gè)神經(jīng)元即對(duì)應(yīng)1000個(gè)檢測(cè)類別。?
Softmax:這1000個(gè)神經(jīng)元的運(yùn)算結(jié)果通過Softmax函數(shù)中,輸出1000個(gè)類別對(duì)應(yīng)的預(yù)測(cè)概率值。
2. 網(wǎng)絡(luò)參數(shù)
2.1 AlexNet神經(jīng)元數(shù)量
層數(shù) | 定義 | 數(shù)量 |
C1 | C1層的FeatureMap的神經(jīng)元個(gè)數(shù) | 55x55x48x2=290400 |
C2 | C2層的FeatureMap的神經(jīng)元個(gè)數(shù) | 27x27x128x2=186624 |
C3 | C3層的FeatureMap的神經(jīng)元個(gè)數(shù) | 13x13x192x2=64896 |
C4 | C4層的FeatureMap的神經(jīng)元個(gè)數(shù) | 13x13x192x2=64896 |
C5 | C5層的FeatureMap的神經(jīng)元個(gè)數(shù) | 13x13x128x2=43264 |
FC6 | FC6全連接層神經(jīng)元個(gè)數(shù) | 4096 |
FC7 | FC7全連接層神經(jīng)元個(gè)數(shù) | 4096 |
Output layer | 輸出層神經(jīng)元個(gè)數(shù) | 1000 |
整個(gè)AlexNet網(wǎng)絡(luò)包含的神經(jīng)元個(gè)數(shù)為:?
290400 + 186624 + 64896 + 64896 + 43264 + 4096 + 4096 + 1000 = 659272?
大約65萬個(gè)神經(jīng)元。
2.2 AlexNet參數(shù)數(shù)量
層數(shù) | 定義 | 數(shù)量 |
C1 | 卷積核11x11x3,96個(gè)卷積核,偏置參數(shù) | (11x11x3+1)x96=34944 |
C2 | 卷積核5x5x48,128個(gè)卷積核,2組,偏置參數(shù) | (5x5x48+1)x128x2=307456 |
C3 | 卷積核3x3x256,384個(gè)卷積核,偏置參數(shù) | (3x3x256+1)x384=885120 |
C4 | 卷積核3x3x192,192個(gè)卷積核,2組,偏置參數(shù) | (3x3x192+1)x192x2=663936 |
C5 | 卷積核3x3x192,128個(gè)卷積核,2組,偏置參數(shù) | (3x3x192+1)x128x2=442624 |
FC6 | 卷積核6x6x256,4096個(gè)神經(jīng)元,偏置參數(shù) | (6x6x256+1)x4096=37752832 |
FC7 | 全連接層,4096個(gè)神經(jīng)元,偏置參數(shù) | (4096+1)x4096=16781312 |
Output layer | 全連接層,1000個(gè)神經(jīng)元 | 1000x4096=4096000 |
整個(gè)AlexNet網(wǎng)絡(luò)包含的參數(shù)數(shù)量為:?
34944 + 307456 + 885120 + 663936 + 442624 + 37752832 + 16781312 + 4096000 = 60964224?
大約6千萬個(gè)參數(shù)。?
設(shè)定每個(gè)參數(shù)是32位浮點(diǎn)數(shù),每個(gè)浮點(diǎn)數(shù)4個(gè)字節(jié)。這樣參數(shù)占用的空間為:?
60964224 x 4 = 243856896(Byte) = 238141.5(Kb) = 232.56(Mb)?
參數(shù)共占用了大約232Mb的空間。
2.3 FLOPs
FLOPS(即“每秒浮點(diǎn)運(yùn)算次數(shù)”,“每秒峰值速度”),是“每秒所執(zhí)行的浮點(diǎn)運(yùn)算次數(shù)”(floating-point operations per second)的縮寫。它常被用來估算電腦的執(zhí)行效能,尤其是在使用到大量浮點(diǎn)運(yùn)算的科學(xué)計(jì)算領(lǐng)域中。正因?yàn)镕LOPS字尾的那個(gè)S,代表秒,而不是復(fù)數(shù),所以不能省略掉。?
一個(gè)MFLOPS(megaFLOPS)等于每秒一佰萬(=10^6)次的浮點(diǎn)運(yùn)算,?
一個(gè)GFLOPS(gigaFLOPS)等于每秒十億(=10^9)次的浮點(diǎn)運(yùn)算,
一個(gè)TFLOPS(teraFLOPS)等于每秒一萬億(=10^12)次的浮點(diǎn)運(yùn)算,(1太拉)?
一個(gè)PFLOPS(petaFLOPS)等于每秒一千萬億(=10^15)次的浮點(diǎn)運(yùn)算,?
一個(gè)EFLOPS(exaFLOPS)等于每秒一佰京(=10^18)次的浮點(diǎn)運(yùn)算。?
在AlexNet網(wǎng)絡(luò)中,對(duì)于卷積層,FLOPS=num_params?(H?W)。其中num_params為參數(shù)數(shù)量,H*W為卷積層的高和寬。對(duì)于全連接層,FLOPS=num_params。
層數(shù) | 定義 | 數(shù)量 |
C1 | num_params?(H?W) | 34944x55x55=105705600 |
C2 | num_params?(H?W) | 307456x27x27=224135424 |
C3 | num_params?(H?W) | 885120x13x13=149585280 |
C4 | num_params?(H?W) | 663936x13x13=112205184 |
C5 | num_params?(H?W) | 442624x13x13=74803456 |
FC6 | num_params | 37752832 |
FC7 | num_params | 16781312 |
Output layer | num_params | 4096000 |
AlexNet整體的網(wǎng)絡(luò)結(jié)構(gòu),包含各層參數(shù)個(gè)數(shù)、FLOPS如下圖所示:
3. AlexNet創(chuàng)新之處
3.1 Data Augmentation?
在本文中,作者采用了兩種數(shù)據(jù)增強(qiáng)(data augmentation)方法,分別是:?
鏡像反射和隨機(jī)剪裁
改變訓(xùn)練樣本RGB通道的強(qiáng)度值
鏡像反射和隨機(jī)剪裁的做法是,先對(duì)圖像做鏡像反射:
然后在原圖和鏡像反射的圖(256×256)中隨機(jī)裁剪227×227的區(qū)域:
測(cè)試的時(shí)候,對(duì)左上、右上、左下、右下、中間分別做了5次裁剪,然后翻轉(zhuǎn),共10個(gè)裁剪,之后對(duì)結(jié)果求平均。?
改變訓(xùn)練樣本RGB通道的強(qiáng)度值,做法是對(duì)RGB空間做PCA(主成分分析),然后對(duì)主成分做一個(gè)(0, 0.1)的高斯擾動(dòng),也就是對(duì)顏色、光照作變換,結(jié)果使錯(cuò)誤率又下降了1%。
3.2 激活函數(shù)ReLU
在當(dāng)時(shí),標(biāo)準(zhǔn)的神經(jīng)元激活函數(shù)是tanh()函數(shù),這種飽和的非線性函數(shù)在梯度下降的時(shí)候要比非飽和的非線性函數(shù)慢得多,因此,在AlexNet中使用ReLU函數(shù)作為激活函數(shù)。
ReLU函數(shù)是一個(gè)分段線性函數(shù),小于等于0則輸出0;大于0的則恒等輸出。反向傳播中,ReLU有輸出的部分,導(dǎo)數(shù)始終為1。而且ReLU會(huì)使一部分神經(jīng)元的輸出為0,這樣就造成了網(wǎng)絡(luò)的稀疏性,并且減少了參數(shù)的相互依存關(guān)系,緩解了過擬合問題的發(fā)生。
下圖展示了在一個(gè)4層的卷積網(wǎng)絡(luò)中使用ReLU函數(shù)在CIFAR-10數(shù)據(jù)集上達(dá)到25%的訓(xùn)練錯(cuò)誤率要比在相同網(wǎng)絡(luò)相同條件下使用tanh函數(shù)快6倍。(黑實(shí)線是使用ReLU激活函數(shù),黑虛線是使用tanh激活函數(shù))
3.3 局部響應(yīng)歸一化?
局部響應(yīng)歸一化(LRN)對(duì)局部神經(jīng)元的活動(dòng)創(chuàng)建競(jìng)爭(zhēng)機(jī)制,使得其中響應(yīng)比較大的值變得相對(duì)更大,并抑制其他反饋較小的神經(jīng)元,增強(qiáng)了模型的泛化能力。
3.4 Dropout Dropout
是神經(jīng)網(wǎng)絡(luò)中比較常用的抑制過擬合的方法。在神經(jīng)網(wǎng)絡(luò)中Dropout通過修改神經(jīng)網(wǎng)絡(luò)本身結(jié)構(gòu)來實(shí)現(xiàn),對(duì)于某一層的神經(jīng)元,通過定義的概率將神經(jīng)元置為0,這個(gè)神經(jīng)元就不參與前向和后向傳播,就如同在網(wǎng)絡(luò)中被刪除了一樣,同時(shí)保持輸入層與輸出層神經(jīng)元的個(gè)數(shù)不變,然后按照神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)方法進(jìn)行參數(shù)更新。在下一次迭代中,又重新隨機(jī)刪除一些神經(jīng)元(置為0),直至訓(xùn)練結(jié)束。?
在AlexNet網(wǎng)絡(luò)中,全連接層FC6、FC7就使用了Dropout方法。?
Dropout應(yīng)該算是AlexNet中一個(gè)很大的創(chuàng)新,現(xiàn)在神經(jīng)網(wǎng)絡(luò)中的必備結(jié)構(gòu)之一。Dropout也可以看成是一種模型組合,每次生成的網(wǎng)絡(luò)結(jié)構(gòu)都不一樣,通過組合多個(gè)模型的方式能夠有效地減少過擬合,Dropout只需要兩倍的訓(xùn)練時(shí)間即可實(shí)現(xiàn)模型組合(類似取平均)的效果,非常高效。
3.5 重疊池化?
在以前的CNN中普遍使用平均池化層(average pooling),AlexNet全部使用最大池化層 max pooling。避免了平均池化層的模糊化的效果,并且步長(zhǎng)比池化的核的尺寸小,這樣池化層的輸出之間有重疊,提升了特征的豐富性。重疊池化可以避免過擬合,這個(gè)策略貢獻(xiàn)了0.3%的Top-5錯(cuò)誤率。?
3.6 雙GPU訓(xùn)練?
受當(dāng)時(shí)硬件水平限制,AlexNet訓(xùn)練作者使用了雙GPU,這是工程上的一種創(chuàng)新做法。雙GPU網(wǎng)絡(luò)的訓(xùn)練時(shí)間比單GPU網(wǎng)絡(luò)更少,分別將top-1和top-5錯(cuò)誤率分別降低了1.7%和1.2%。?
3.7 端到端訓(xùn)練?
AlexNet網(wǎng)絡(luò),CNN的輸入直接是一張圖片,而當(dāng)時(shí)比較多的做法是先使用特征提取算法對(duì)RGB圖片進(jìn)行特征提取。AlexNet使用了端對(duì)端網(wǎng)絡(luò),除了將每個(gè)像素中減去訓(xùn)練集的像素均值之外,沒有以任何其他方式對(duì)圖像進(jìn)行預(yù)處理,直接使用像素的RGB值訓(xùn)練網(wǎng)絡(luò)。
手撕 CNN 系列:
手撕 CNN 經(jīng)典網(wǎng)絡(luò)之 LeNet-5(理論篇)
手撕 CNN 經(jīng)典網(wǎng)絡(luò)之 LeNet-5(MNIST 實(shí)戰(zhàn)篇)
手撕 CNN 經(jīng)典網(wǎng)絡(luò)之 LeNet-5(CIFAR10 實(shí)戰(zhàn)篇)
手撕 CNN 經(jīng)典網(wǎng)絡(luò)之 LeNet-5(自定義實(shí)戰(zhàn)篇)
如果覺得這篇文章有用的話,麻煩點(diǎn)個(gè)在看或轉(zhuǎn)發(fā)朋友圈!
推薦閱讀
(點(diǎn)擊標(biāo)題可跳轉(zhuǎn)閱讀)
干貨 | 公眾號(hào)歷史文章精選
我的深度學(xué)習(xí)入門路線
我的機(jī)器學(xué)習(xí)入門路線圖
重磅!
AI有道年度技術(shù)文章電子版PDF來啦!
掃描下方二維碼,添加?AI有道小助手微信,可申請(qǐng)入群,并獲得2020完整技術(shù)文章合集PDF(一定要備注:入群?+ 地點(diǎn) + 學(xué)校/公司。例如:入群+上海+復(fù)旦。?
長(zhǎng)按掃碼,申請(qǐng)入群
(添加人數(shù)較多,請(qǐng)耐心等待)
感謝你的分享,點(diǎn)贊,在看三連??
總結(jié)
以上是生活随笔為你收集整理的手撕 CNN 经典网络之 AlexNet(理论篇)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如果你还在徘徊在程序员的门口,那就赶紧来
- 下一篇: 如何移动当前正在使用的文件