AlexNet拆解分析

學(xué)習(xí)深度學(xué)習(xí)后接觸的第一個復(fù)雜的神經(jīng)網(wǎng)絡(luò)就是AlexNet,剛開始看到它時還是比較暈菜的,因為是自學(xué),感覺看過去就算了,但自己又有種鉆牛角尖的精神,回過頭來一遍一遍地分析AlexNet,推算每一步的由來,經(jīng)過多方資料的整合和驗算,終于得出了自己較為滿意的理解。

首先,看一下整體的網(wǎng)絡(luò)結(jié)構(gòu)圖:

AlexNet神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)圖

圖中可以看出,整個過程共分為8層,而每一個步驟又不盡相同,共分為5個卷積層,3個全連接層(注:全連接層后不能再加卷積層和池化層)。其中,在第1,2,5層使用了Max?pooling,且1,2層還使用了LRN操作;第6,7,8層使用了dense操作,且6,7層使用了dropout全連接操作。接下來,簡單介紹下AlexNet網(wǎng)絡(luò)中存在的一些知識點。

?Relu激活函數(shù):AlexNet首次使用了Relu激活函數(shù),表達式為max(0,x),即x為負數(shù)時,結(jié)果為0。

?2-GPU并行結(jié)構(gòu):該網(wǎng)絡(luò)使用了兩個GPU,使運算速度能夠得到有效提升。

?Max?pooling:池化層有最大值池化、平均值池化,這里使用的是最大池化層,用來減少計算量,一定程度解決平移魯棒。

?dropout全連接層:將某一層50%的神經(jīng)元的隨機置為0,為了降低過擬合。

?LRN:局部響應(yīng)歸一化分為通道間歸一化和通道內(nèi)歸一化,這里使用通道間歸一化。

接下來就是對AlexNet進行拆解分析了。

第1層


第一層輸入為227*227*3大小的圖片(多方證實227為正確的輸入尺寸大小,且便于后續(xù)計算),使用96個11*11*3的卷積核進行卷積后得到55*55*96個像素層(注55的由來:(227-11)/4+1=55),由于系統(tǒng)使用了雙GPU,因此分為兩組55*55*48的像素層。由于第二層的輸入尺寸為27*27*128,因此這里的max?pooling池化層使用了規(guī)模為3*3,步長為2進行處理,池化后的像素層即在每一個GPU上生成了27*27*48的像素層(注27的由來:(55-3)/2+1=27)。最后,在5個通道數(shù)的相鄰?fù)ǖ篱g進行LRN局部歸一化處理,最終得到兩組27*27*48的像素層。

第一層的參數(shù)共為11*11*3*96+96=34944個。

第二層


第二層中,在每一個GPU上輸入的尺寸為27*27*48,使用128個5*5*48的卷積核進行卷積操作,得出27*27*128的像素層(注27的由來:(27-5+2*2)/1+1=27,其中2*2為padding操作,其實主要是為了便于后續(xù)計算方便,有種“拼湊”的感覺)。由于第三層的輸入尺寸為13*13*192,因此max?pooling池化層使用了規(guī)模為3*3,步長為2進行處理,池化后的像素層即在每一個GPU上生成了13*13*128的像素層(注6的由來:(27-3)/2+1=13)。最后,在5個通道數(shù)的相鄰?fù)ǖ篱g進行LRN局部歸一化處理,最終得到兩組13*13*128的像素層。

第二層的參數(shù)共為(5*5*48*128+128)*2=307456個。

第三層


第三層中,由圖中可以看到虛線的指向和前面不同,這里可以理解為將兩個GPU的像素層合并后進行卷積,之后再重新分為兩組,這樣有利于樣本的隨機性。因此結(jié)合兩組GPU輸入的尺寸為13*13*256,使用384個3*3*256的卷積核進行卷積操作,得出13*13*384的像素層(注13的由來:(13-3+2*1)/1+1=13,其中2*1為padding操作,這里仍然是為了便于后續(xù)計算方便,有種“拼湊”的感覺)。第三層只是簡單的卷積操作,因此最終得到兩組13*13*192的像素層。

第三層的參數(shù)共為3*3*256*384+384=885120個。

第四層


第四層更為簡單,在每一個GPU上輸入的尺寸為13*13*192,使用192個3*3*192的卷積核進行卷積,最終得到兩組13*13*192的像素層(注13的由來:(13-3+2*1)/1+1=13,原因同上)。

第四層的參數(shù)共為(3*3*192*192+192)*2=663936個。

第五層


第五層中,在每一個GPU上的輸入尺寸為13*13*192,使用128個3*3*192的卷積核進行卷積后得到13*13*128的像素層(注13的由來:(13-3+2*1)/1+1=13,原因同上)。然后同樣使用規(guī)模為3*3,步長為2的max?pooling池化層,池化后的像素層即在每一個GPU上生成了6*6*128的像素層(注6的由來:(13-3)/2+1=6)。最終得到兩組6*6*128的像素層。

第五層的參數(shù)共為(3*3*192*128+128)*2=442624個。

第六層


第六層由圖中可見,這里同樣將兩個GPU的像素層合并后進行全連接,之后再重新分為兩組,因此結(jié)合兩組GPU輸入的尺寸為6*6*256,由于這里是dropout全連接層,因此使用了4096個神經(jīng)元進行輸出,且該過程中了使用Relu激活函數(shù),降低了過擬合,提高了計算速度和準(zhǔn)確度。最終得到4096個輸出。

第六層的參數(shù)共為6*6*256*4096+4096=37752832個。

第七層


第七層同第六層類似,即將兩個GPU的像素層合并后進行全連接,之后再重新分為兩組,同樣這里是dropout全連接層,使用了4096個神經(jīng)元進行輸出,且該過程中了使用Relu激活函數(shù),降低了過擬合,提高了計算速度和準(zhǔn)確度。最終得到4096個輸出。

第七層的參數(shù)共為1*1*4096*4096+4096=16781312個。

第八層


終于到達最后一層了。在第八層中,對4096個輸入使用1000個神經(jīng)元進行全連接輸出,最終得到1000個輸出。

第八層的參數(shù)共為1*1*4096*1000+1000=4097000個。

總結(jié):AlexNet神經(jīng)網(wǎng)絡(luò)共經(jīng)歷了8層包括卷積、池化、全連接操作,總參數(shù)有60965224個,其中參數(shù)量多在全連接層。我對AlexNet神經(jīng)網(wǎng)絡(luò)的研究在深度學(xué)習(xí)領(lǐng)域只是一個開始,研究生期間一直在研究聚類算法,結(jié)合過簡單的如Hopfield等神經(jīng)網(wǎng)絡(luò)并取得了一定的效果,畢業(yè)后進入工作,業(yè)余時間用來自學(xué)深度學(xué)習(xí),發(fā)現(xiàn)自己對人工智能方面的認識只是九牛一毛,很快被其強大及神秘深深地吸引。第一次在簡書上寫文章,有不足之處還望大家多多包涵,指出問題共同探討。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容