【附論文】白話CNN經典模型:AlexNet

2021-02-23 大數據與人工智慧Lab

2012年,Alex Krizhevsky、Ilya Sutskever在多倫多大學Geoff Hinton的實驗室設計出了一個深層的卷積神經網絡AlexNet,奪得了2012年ImageNet LSVRC的冠軍,且準確率遠超第二名(top5錯誤率為15.3%,第二名為26.2%),引起了很大的轟動。AlexNet可以說是具有歷史意義的一個網絡結構,在此之前,深度學習已經沉寂了很長時間,自2012年AlexNet誕生之後,後面的ImageNet冠軍都是用卷積神經網絡(CNN)來做的,並且層次越來越深,使得CNN成為在圖像識別分類的核心算法模型,帶來了深度學習的大爆發。

在本公眾號之前的文章中已經介紹過了卷積神經網絡(CNN)的技術原理(白話卷積神經網絡),也回顧過卷積神經網絡(CNN)的三個重要特點(白話CNN經典模型:LeNet),有興趣的同學可以打開連結重新回顧一下,在此就不再重複CNN基礎知識的介紹了。下面將先介紹AlexNet的特點,然後再逐層分解解析AlexNet網絡結構。

一、AlexNet模型的特點

AlexNet之所以能夠成功,跟這個模型設計的特點有關,主要有:

1、使用ReLU激活函數

傳統的神經網絡普遍使用Sigmoid或者tanh等非線性函數作為激勵函數,然而它們容易出現梯度彌散或梯度飽和的情況。以Sigmoid函數為例,當輸入的值非常大或者非常小的時候,這些神經元的梯度接近於0(梯度飽和現象),如果輸入的初始值很大的話,梯度在反向傳播時因為需要乘上一個Sigmoid導數,會造成梯度越來越小,導致網絡變的很難學習。(詳見本公眾號的文章:深度學習中常用的激勵函數)。

在AlexNet中,使用了ReLU (Rectified Linear Units)激勵函數,該函數的公式為:f(x)=max(0,x),當輸入信號<0時,輸出都是0,當輸入信號>0時,輸出等於輸入,如下圖所示:     

使用ReLU替代Sigmoid/tanh,由於ReLU是線性的,且導數始終為1,計算量大大減少,收斂速度會比Sigmoid/tanh快很多,如下圖所示: 

2、數據擴充(Data augmentation)

有一種觀點認為神經網絡是靠數據餵出來的,如果能夠增加訓練數據,提供海量數據進行訓練,則能夠有效提升算法的準確率,因為這樣可以避免過擬合,從而可以進一步增大、加深網絡結構。而當訓練數據有限時,可以通過一些變換從已有的訓練數據集中生成一些新的數據,以快速地擴充訓練數據。

其中,最簡單、通用的圖像數據變形的方式:水平翻轉圖像,從原始圖像中隨機裁剪、平移變換,顏色、光照變換,如下圖所示:

 

AlexNet在訓練時,在數據擴充(data augmentation)這樣處理:

(1)隨機裁剪,對256×256的圖片進行隨機裁剪到224×224,然後進行水平翻轉,相當於將樣本數量增加了((256-224)^2)×2=2048倍;

(2)測試的時候,對左上、右上、左下、右下、中間分別做了5次裁剪,然後翻轉,共10個裁剪,之後對結果求平均。作者說,如果不做隨機裁剪,大網絡基本上都過擬合;

(3)對RGB空間做PCA(主成分分析),然後對主成分做一個(0, 0.1)的高斯擾動,也就是對顏色、光照作變換,結果使錯誤率又下降了1%。

3、重疊池化 (Overlapping Pooling)

一般的池化(Pooling)是不重疊的,池化區域的窗口大小與步長相同,如下圖所示: 

在AlexNet中使用的池化(Pooling)卻是可重疊的,也就是說,在池化的時候,每次移動的步長小於池化的窗口長度。AlexNet池化的大小為3×3的正方形,每次池化移動步長為2,這樣就會出現重疊。重疊池化可以避免過擬合,這個策略貢獻了0.3%的Top-5錯誤率。

4、局部歸一化(Local Response Normalization,簡稱LRN)

在神經生物學有一個概念叫做「側抑制」(lateral inhibitio),指的是被激活的神經元抑制相鄰神經元。歸一化(normalization)的目的是「抑制」,局部歸一化就是借鑑了「側抑制」的思想來實現局部抑制,尤其當使用ReLU時這種「側抑制」很管用,因為ReLU的響應結果是無界的(可以非常大),所以需要歸一化。使用局部歸一化的方案有助於增加泛化能力。

LRN的公式如下,核心思想就是利用臨近的數據做歸一化,這個策略貢獻了1.2%的Top-5錯誤率。 

5、Dropout

引入Dropout主要是為了防止過擬合。在神經網絡中Dropout通過修改神經網絡本身結構來實現,對於某一層的神經元,通過定義的概率將神經元置為0,這個神經元就不參與前向和後向傳播,就如同在網絡中被刪除了一樣,同時保持輸入層與輸出層神經元的個數不變,然後按照神經網絡的學習方法進行參數更新。在下一次迭代中,又重新隨機刪除一些神經元(置為0),直至訓練結束。

Dropout應該算是AlexNet中一個很大的創新,以至於「神經網絡之父」Hinton在後來很長一段時間裡的演講中都拿Dropout說事。Dropout也可以看成是一種模型組合,每次生成的網絡結構都不一樣,通過組合多個模型的方式能夠有效地減少過擬合,Dropout只需要兩倍的訓練時間即可實現模型組合(類似取平均)的效果,非常高效。

如下圖所示: 

6、多GPU訓練

AlexNet當時使用了GTX580的GPU進行訓練,由於單個GTX 580 GPU只有3GB內存,這限制了在其上訓練的網絡的最大規模,因此他們在每個GPU中放置一半核(或神經元),將網絡分布在兩個GPU上進行並行計算,大大加快了AlexNet的訓練速度。

二、AlexNet網絡結構的逐層解析

下圖是AlexNet的網絡結構圖: 

AlexNet網絡結構共有8層,前面5層是卷積層,後面3層是全連接層,最後一個全連接層的輸出傳遞給一個1000路的softmax層,對應1000個類標籤的分布。

由於AlexNet採用了兩個GPU進行訓練,因此,該網絡結構圖由上下兩部分組成,一個GPU運行圖上方的層,另一個運行圖下方的層,兩個GPU只在特定的層通信。例如第二、四、五層卷積層的核只和同一個GPU上的前一層的核特徵圖相連,第三層卷積層和第二層所有的核特徵圖相連接,全連接層中的神經元和前一層中的所有神經元相連接。

下面逐層解析AlexNet結構:

1、第一層(卷積層) 

該層的處理流程為:卷積-->ReLU-->池化-->歸一化,流程圖如下: 

(1)卷積

輸入的原始圖像大小為224×224×3(RGB圖像),在訓練時會經過預處理變為227×227×3。在本層使用96個11×11×3的卷積核進行卷積計算,生成新的像素。由於採用了兩個GPU並行運算,因此,網絡結構圖中上下兩部分分別承擔了48個卷積核的運算。

卷積核沿圖像按一定的步長往x軸方向、y軸方向移動計算卷積,然後生成新的特徵圖,其大小為:floor((img_size - filter_size)/stride) +1 = new_feture_size,其中floor表示向下取整,img_size為圖像大小,filter_size為核大小,stride為步長,new_feture_size為卷積後的特徵圖大小,這個公式表示圖像尺寸減去卷積核尺寸除以步長,再加上被減去的核大小像素對應生成的一個像素,結果就是卷積後特徵圖的大小。

AlexNet中本層的卷積移動步長是4個像素,卷積核經移動計算後生成的特徵圖大小為 (227-11)/4+1=55,即55×55。

(2)ReLU

卷積後的55×55像素層經過ReLU單元的處理,生成激活像素層,尺寸仍為2組55×55×48的像素層數據。

(3)池化

RuLU後的像素層再經過池化運算,池化運算的尺寸為3×3,步長為2,則池化後圖像的尺寸為 (55-3)/2+1=27,即池化後像素的規模為27×27×96

(4)歸一化

池化後的像素層再進行歸一化處理,歸一化運算的尺寸為5×5,歸一化後的像素規模不變,仍為27×27×96,這96層像素層被分為兩組,每組48個像素層,分別在一個獨立的GPU上進行運算。

2、第二層(卷積層) 

該層與第一層類似,處理流程為:卷積-->ReLU-->池化-->歸一化,流程圖如下: 

(1)卷積

第二層的輸入數據為第一層輸出的27×27×96的像素層(被分成兩組27×27×48的像素層放在兩個不同GPU中進行運算),為方便後續處理,在這裡每幅像素層的上下左右邊緣都被填充了2個像素(填充0),即圖像的大小變為 (27+2+2) ×(27+2+2)。第二層的卷積核大小為5×5,移動步長為1個像素,跟第一層第(1)點的計算公式一樣,經卷積核計算後的像素層大小變為 (27+2+2-5)/1+1=27,即卷積後大小為27×27。

本層使用了256個5×5×48的卷積核,同樣也是被分成兩組,每組為128個,分給兩個GPU進行卷積運算,結果生成兩組27×27×128個卷積後的像素層。

(2)ReLU

這些像素層經過ReLU單元的處理,生成激活像素層,尺寸仍為兩組27×27×128的像素層。

(3)池化

再經過池化運算的處理,池化運算的尺寸為3×3,步長為2,池化後圖像的尺寸為(57-3)/2+1=13,即池化後像素的規模為2組13×13×128的像素層

(4)歸一化

然後再經歸一化處理,歸一化運算的尺度為5×5,歸一化後的像素層的規模為2組13×13×128的像素層,分別由2個GPU進行運算。

3、第三層(卷積層) 

第三層的處理流程為:卷積-->ReLU 

(1)卷積

第三層輸入數據為第二層輸出的2組13×13×128的像素層,為便於後續處理,每幅像素層的上下左右邊緣都填充1個像素,填充後變為 (13+1+1)×(13+1+1)×128,分布在兩個GPU中進行運算。

這一層中每個GPU都有192個卷積核,每個卷積核的尺寸是3×3×256。因此,每個GPU中的卷積核都能對2組13×13×128的像素層的所有數據進行卷積運算。如該層的結構圖所示,兩個GPU有通過交叉的虛線連接,也就是說每個GPU要處理來自前一層的所有GPU的輸入。

本層卷積的步長是1個像素,經過卷積運算後的尺寸為 (13+1+1-3)/1+1=13,即每個GPU中共13×13×192個卷積核,2個GPU中共有13×13×384個卷積後的像素層。

(2)ReLU

卷積後的像素層經過ReLU單元的處理,生成激活像素層,尺寸仍為2組13×13×192的像素層,分配給兩組GPU處理。

4、第四層(卷積層) 

與第三層類似,第四層的處理流程為:卷積-->ReLU 

(1)卷積

第四層輸入數據為第三層輸出的2組13×13×192的像素層,類似於第三層,為便於後續處理,每幅像素層的上下左右邊緣都填充1個像素,填充後的尺寸變為 (13+1+1)×(13+1+1)×192,分布在兩個GPU中進行運算。

這一層中每個GPU都有192個卷積核,每個卷積核的尺寸是3×3×192(與第三層不同,第四層的GPU之間沒有虛線連接,也即GPU之間沒有通信)。卷積的移動步長是1個像素,經卷積運算後的尺寸為 (13+1+1-3)/1+1=13,每個GPU中有13×13×192個卷積核,2個GPU卷積後生成13×13×384的像素層。

(2)ReLU

卷積後的像素層經過ReLU單元處理,生成激活像素層,尺寸仍為2組13×13×192像素層,分配給兩個GPU處理。

5、第五層(卷積層) 

第五層的處理流程為:卷積-->ReLU-->池化 

(1)卷積

第五層輸入數據為第四層輸出的2組13×13×192的像素層,為便於後續處理,每幅像素層的上下左右邊緣都填充1個像素,填充後的尺寸變為 (13+1+1)×(13+1+1) ,2組像素層數據被送至2個不同的GPU中進行運算。

這一層中每個GPU都有128個卷積核,每個卷積核的尺寸是3×3×192,卷積的步長是1個像素,經卷積後的尺寸為 (13+1+1-3)/1+1=13,每個GPU中有13×13×128個卷積核,2個GPU卷積後生成13×13×256的像素層。

(2)ReLU

卷積後的像素層經過ReLU單元處理,生成激活像素層,尺寸仍為2組13×13×128像素層,由兩個GPU分別處理。

(3)池化

2組13×13×128像素層分別在2個不同GPU中進行池化運算處理,池化運算的尺寸為3×3,步長為2,池化後圖像的尺寸為 (13-3)/2+1=6,即池化後像素的規模為兩組6×6×128的像素層數據,共有6×6×256的像素層數據。

6、第六層(全連接層) 

第六層的處理流程為:卷積(全連接)-->ReLU-->Dropout 

(1)卷積(全連接)

第六層輸入數據是第五層的輸出,尺寸為6×6×256。本層共有4096個卷積核,每個卷積核的尺寸為6×6×256,由於卷積核的尺寸剛好與待處理特徵圖(輸入)的尺寸相同,即卷積核中的每個係數只與特徵圖(輸入)尺寸的一個像素值相乘,一一對應,因此,該層被稱為全連接層。由於卷積核與特徵圖的尺寸相同,卷積運算後只有一個值,因此,卷積後的像素層尺寸為4096×1×1,即有4096個神經元。

(2)ReLU

這4096個運算結果通過ReLU激活函數生成4096個值。

(3)Dropout

然後再通過Dropout運算,輸出4096個結果值。

7、第七層(全連接層) 

第七層的處理流程為:全連接-->ReLU-->Dropout 

第六層輸出的4096個數據與第七層的4096個神經元進行全連接,然後經ReLU進行處理後生成4096個數據,再經過Dropout處理後輸出4096個數據。

8、第八層(全連接層) 

第八層的處理流程為:全連接 

第七層輸出的4096個數據與第八層的1000個神經元進行全連接,經過訓練後輸出1000個float型的值,這就是預測結果。

以上就是關於AlexNet網絡結構圖的逐層解析了,看起來挺複雜的,下面是一個簡圖,看起來就清爽很多啊 

通過前面的介紹,可以看出AlexNet的特點和創新之處,主要如下:

 

牆裂建議

Alex等人在2012年發表了關於AlexNet的經典論文《ImageNet Classification with Deep Convolutional Neural Networks》(基於深度卷積神經網絡的 ImageNet 分類),整個過程都有詳細的介紹,建議閱讀這篇論文,進一步了解細節

想要閱讀 完整版本的《ImageNet Classification with Deep Convolutional Neural Networks》的論文內容,請關注本公眾號,然後回復「論文」關鍵字可在線閱讀這篇經典論文的內容。

1、長按識別二維碼關注本公眾號「大數據與人工智慧Lab」(BigdataAILab)

2、在公眾號的消息框裡面回復「論文」關鍵字,即可在線閱讀《ImageNet Classification with Deep Convolutional Neural Networks》論文的內容

推薦相關閱讀


搜索」大數據與人工智慧Lab「微信號(BigdataAILab),或掃描二維碼關注我們

你的每一份支持將是我們最大的動力,感謝你的支持,感謝你的讚賞

相關焦點

  • 【附論文】白話文本識別經典模型:CRNN
    在前一篇文章中(詳見本公眾號文章:白話文本檢測經典模型 CTPN),介紹了文字識別在現實生活中的廣泛應用,以及文字識別的簡單流程: 在介紹CRNN之前,先來梳理一下要實現「文本識別」的模型,需要具備哪些要素:(1)首先是要讀取輸入的圖像,提取圖像特徵,因此,需要有個卷積層用於讀取圖像和提取特徵。具體原理可詳見本公眾號的文章:白話卷積神經網絡(CNN);(2)由於文本序列是不定長的,因此在模型中需要引入RNN(循環神經網絡),一般是使用雙向LSTM來處理不定長序列預測的問題。
  • 【附經典論文】白話CNN經典模型:LeNet
    CNN發展至今,已經有很多變種,其中有幾個經典模型在CNN發展歷程中有著裡程碑的意義,它們分別是:LeNet、Alexnet、Googlenet、VGG、DRL等,接下來將分期進行逐一介紹。在之前的文章中,已經介紹了卷積神經網絡(CNN)的技術原理,細節部分就不再重複了,有興趣的同學再打開連結看看,在此簡單回顧一下CNN的幾個特點:局部感知、參數共享、池化。
  • 【深度學習系列】用PaddlePaddle和Tensorflow實現經典CNN網絡AlexNet
    原理詳解(一)——基本原理【深度學習系列】PaddlePaddle之數據預處理  【深度學習系列】卷積神經網絡詳解(二)——自己手寫一個卷積神經網絡  【深度學習系列】用PaddlePaddle和Tensorflow進行圖像分類上周我們用PaddlePaddle和Tensorflow實現了圖像分類,分別用自己手寫的一個簡單的CNN網絡simple_cnn
  • 深度學習筆記16:CNN經典論文研讀之AlexNet及其Tensorflow實現
    濾波器個數:256輸出: 6 x 6 x 256F6層是個全連接層,其輸入輸出結構如下:輸入:6 x 6 x 256輸出:4096F7層是個全連接層,其輸入輸出結構如下:輸入:4096輸出:4096F8層也是個全連接層,即輸出層,其輸入輸出結構如下:輸入:4096輸出:1000      在論文中
  • 一行代碼即可調用18款主流模型!PyTorch Hub輕鬆解決論文可復現性
    推出了PyTorch Hub,類似TensorFlow Hub的一個模型共享庫,加載ResNet、BERT、GPT、VGG、PGAN還是MobileNet等經典模型只需一行代碼。用戶可以提交、瀏覽模型,極大的改善了論文的可復現性難題。機器學習論文的可復現性一直是個難題。許多機器學習相關論文要麼無法復現,要麼難以重現。有時候論文讀者經常為了調用各種經典機器學習模型,還要重複造輪子。隨著提交給arXiv以及各種會議上的論文數量開始暴漲,可復現性的重要性也越來越凸顯。
  • AlexNet--CNN經典網絡模型詳解(pytorch實現)
    建議大家可以實踐下,代碼都很詳細,有不清楚的地方評論區見~二、AlexNet在imagenet上的圖像分類challenge上大神Alex提出的alexnet網絡結構模型贏得了2012屆的冠軍,振奮人心,利用CNN實現了圖片分類,別人用傳統的機器學習算法調參跳到半死也就那樣,Alex
  • AlexNet模型思想詳解及核心代碼實現
    LeNet-5模型的套路可以總結為:conv1->pool->conv2->pool2再接全連接層,永恆不變的愛是:卷積層後緊接池化層的模式(卷積必池化)。其經典的模型結構如圖所示:那麼就存在一個問題,如何讓網絡變的更深,且提取的特徵豐富呢?
  • 經典的CNN模型架構-LeNet、AlexNet、VGG、GoogleLeNet、ResNet
    作者:微塵,上海交大應用數學專業知乎ID:微塵,感興趣的朋友可以關注本文將引入 ImageNet圖像資料庫,並介紹以下幾種經典的CNN模型架構:LeNet、AlexNet、VGG、GoogleLeNet、ResNet1.ImageNet介紹 ImageNet
  • AlexNet:深度學習時代的開始
    缺少數據深度學習需要大量的有標籤的數據才能表現得比其他經典方法更好。限於早期計算機有限的存儲和90年代有限的研究預算,大部分研究只基於小的公開數據集。例如,不少研究論文基於加州大學歐文分校(UCI)提供的若干個公開數據集,其中許多數據集只有幾百至幾千張圖像。這一狀況在2010年前後興起的大數據浪潮中得到改善。
  • 乾貨 TensorFlow之深入理解AlexNet
    ,刷新了Image Classification的機率,從此deep learning在Image這塊開始一次次超過state-of-art,甚至於搭到打敗人類的地步,看這邊文章的過程中,發現了很多以前零零散散看到的一些優化技術,但是很多沒有深入了解,這篇文章講解了他們alexnet如何做到能達到那麼好的成績,好的廢話不多說,來開始看文章這張圖是基本的caffe中alexnet
  • 如何從Tensorflow中創建CNN,並在GPU上運行該模型(附代碼)
    最後,您將學習如何在GPU上運行該模型,以便您可以花時間創建更好的模型,而不是等待它們匯聚。驗證集允許您通過提供附加數據來調整超參數來更好地訓練您的模型。每1000次迭代,您將根據驗證集測試模型,以了解準確性。最後,您將根據測試數據集評估經過訓練的模型,以獲得樣本外精度的度量。在10k次迭代時,您應該看到98.0%左右的準確度。
  • 架構模型技巧全都有,大牛LeCun推薦
    有這麼一份乾貨,匯集了機器學習架構和模型的經典知識點,還有各種TensorFlow和PyTorch的Jupyter Notebook筆記資源,地址都在,無需等待即可取用。除了取用方便,這份名為Deep Learning Models的資源還尤其全面。
  • 文本分類經典論文:fasttext,textcnn解讀
    文本分類是自然語言處理領域一個非常經典的任務,一般文本分類分為三種,基於規則的文本分類,基於機器學習的文本分類和基於深度學習的文本分類。本文我們重點關注基於深度學習的文本分類,並為大家介紹文本分類中非常經典的fasttext和textcnn。
  • 【資源】Python實現多種模型(Naive Bayes, SVM, CNN, LSTM, etc)用於推文情感分析
    執行logistic.py運行logistic回歸模型或執行maxent-nltk.py <>運行NLTK的最大熵模型。令TRAIN = True時,將顯示10%驗證數據集的準確性。 運行cnn.py,將運行報告中所述的4-Conv-NN(4個conv層神經網絡)模型。如果要運行CNN的其他版本,只需注釋或刪除添加Conv對應的行。使用10%的數據進行驗證,並在./models/中為每個epoch保存模型。(確保在運行cnn.py之前,此目錄已經存在)。
  • 深度學習第25講:目標檢測算法經典論文研讀之R-CNN
    本文就將 R-CNN 的論文拿出來作為目標檢測的經典論文進行研讀和分析。       論文的摘要給出了 R-CNN 的兩點關鍵的貢獻:一是提出生成和使用候選框來對目標物體進行定位和分割的方法,二是在缺乏足夠的打標數據的情形下使用有監督的預訓練(即遷移學習)方法來進行特徵提取。
  • CNN:我不是你想的那樣
    我個人覺得本文應該作為cv領域從業者的必讀論文。論文名稱:High-frequency Component Helps Explain the Generalization of Convolutional Neural Networks論文地址:https://arxiv.org/abs/1905.135451 論文思想
  • 【乾貨】基於pytorch的CNN、LSTM神經網絡模型調參小結
    這是最近兩個月來的一個小總結,實現的demo已經上傳github,裡面包含了CNN、LSTM、BiLSTM、GRU以及CNN與LSTM、BiLSTM的結合還有多層多通道CNN、LSTM、BiLSTM等多個神經網絡模型的的實現
  • 經典目標檢測方法Faster R-CNN和Mask R-CNN|基於PaddlePaddle深度...
    作為經典的目標檢測框架 Faster R-CNN,雖然是 2015 年的論文,但是它至今仍然是許多目標檢測算法的基礎,這在飛速發展的深度學習領域十分難得。而在 Faster R-CNN 的基礎上改進的 Mask R-CNN 在 2018 年被提出,並斬獲了 ICCV2017 年的最佳論文。
  • 用PaddlePaddle 和 Tensorflow 實現經典 CNN 網絡 GoogLeNet
    GoogLeNet 是由 google 的 Christian Szegedy 等人在 2014 年的論文《Going Deeper with Convolutions》提出,其最大的亮點是提出一種叫 Inception 的結構,以此為基礎構建 GoogLeNet,並在當年的 ImageNet 分類和檢測任務中獲得第一,ps:GoogLeNet 的取名是為了向 YannLeCun 的 LeNet 系列致敬