文章目錄
- 引言
- 1.卷積神經網絡(CNN)的誕生背景
- 2.卷積神經網絡(CNN)介紹
- 2.1 什么是卷積神經網絡?
- 2.2 卷積神經網絡(CNN)的基本特征
- 2.2.1 局部感知(Local Connectivity)
- 2.2.2 權值共享(Weight Sharing)
- 3. 卷積神經網絡(CNN)結構
- 3.1 整體架構
- 3.2 卷積層(Convolutional Layer)
- 3.2.1 卷積層涉及的參數:
- 3.3 池化層(Pooling Layer)
- 3.4 常用激活函數
- 3.4.1 激活函數的作用
- 3.4.2 ReLU 激活函數
- 3.4.3 Sigmoid 激活函數
- 3.4.4 Tanh 激活函數
- 3.5 全連接層(Fully Connected Layer)
- 3.6 卷積神經網絡的過程
- 4. 經典CNN架構演進
- 5. 總結
引言
卷積神經網絡(Convolutional Neural Networks, CNN)是一類包含卷積計算且具有深度結構的前饋神經網絡 (Feedforward Neural Networks),是深度學習(deep learning)的代表算法之一。本文旨在介紹CNN的基本概念和結構,以及CNN網絡架構設計的基本思路。
1.卷積神經網絡(CNN)的誕生背景
在傳統神經網絡處理圖像時,面臨幾個嚴峻挑戰:
- 參數爆炸:一張普通1000×1000像素的彩色圖像,全連接層會產生30億個參數
- 平移不變性:傳統網絡難以識別位置變化的同一物體
- 局部相關性:忽略了圖像中相鄰像素間的緊密關系
受生物視覺皮層啟發,Yann LeCun等人在1989年提出了CNN的雛形,并在1998年開發出著名的LeNet-5用于手寫數字識別。但直到2012年AlexNet在ImageNet競賽中一戰成名,CNN才真正迎來爆發式發展。
2.卷積神經網絡(CNN)介紹
2.1 什么是卷積神經網絡?
卷積神經網絡是多層感知機 (MLP)的變種,由生物學家休博爾和維瑟爾 在早期關于貓視覺皮層的研究發展而來,視覺皮層的細胞存在一個復雜的構造,這些細胞對視覺輸入空間的子區域非常敏感,稱之為感受野 。
CNN由紐約大學的Yann Lecun(楊立昆)于1998年提出(LeNet-5),其本質是一個多層感知機,成功的原因在于其所采用的局部連接和權值共享的方式:一方面減少了權值的數量使得網絡易于優化;另一方面降低了模型的復雜度、減小了過擬合 的風險。 當網絡的輸入為圖像時,這些優點將表現地更加明顯。
2006年,Hinton提出了深度學習,其主要的觀點是:多隱層的人工神經網絡 具有優異的特征學習能力,學習到的數據更能反映數據的本質特征有利于可視化或分類。大數據和計算機硬件的發展使得深度學習得以推廣和應用。
2012年AlexNet取得ImageNet比賽的分類任務的冠軍,使得卷積神經網絡真正爆發。如今的卷積神經網絡(CNN)是一種帶有卷積結構的深度神經網絡 ,卷積結構可以減少深層網絡占用的內存量,其三個關鍵的操作——局部感受野 、權值共享、pooling層,有效地減少了網絡的參數個數,緩解了模型的過擬合問題。
2.2 卷積神經網絡(CNN)的基本特征
2.2.1 局部感知(Local Connectivity)
圖1(a)表示神經網絡中神經元之間的全連接結構,即前后兩層神經元都是彼此相互連接的,這樣可以保證后面一層的每個神經元都能獲取前面一層神經元的所有信息。圖1(b)表示神經元之間進行局部連接,即后面一層的神經元只與前面一層的部分神經元進行連接,這樣后面一層的神經元只能包含前面一層神經元的部分信息。表面上看局部連接似乎損失了部分信息,但實際上后層神經元并沒有損失信息。通過后面一層神經元感知局部信息不僅可以減少網絡需要學習的大量參數,同時可以減少網絡的冗余信息。在圖像領域,如果網絡輸入的是一張圖片,每個神經元在卷積層都進行局部感知圖像信息,經過幾層卷積和池化后再通過卷積可以將這些局部的信息進行綜合起來得到圖像的全局信息。通過局部感知不僅減少了神經網絡的復雜性和參數量,同時減少了對訓練時設備算力的高要求。
下面分析網絡采用局部的神經元連接方式相比于全連接方式,計算量減少了多少。
假設圖像大小為 500 × 500 ,共有 1 0 5 10^5 105 個神經元。
在圖中(a)的全連接中,每個神經元需要與圖像進行全連接,則網絡需要訓練的參數有:
- 前一層的圖像大小為 500 × 500 =2.5× 1 0 5 10^5 105,然后神經元個數為 1 0 5 10^5 105個,那么全連接需要計算的參數個數為:2.5× 1 0 5 10^5 105 × 1 0 5 10^5 105 = 2.5 × 1 0 10 10^{10} 1010
如果網絡神經元采用圖中(b)的局部連接方式,假設神經元的感受野為 10 × 10,則網絡需要訓練的參數有:
- 感受野為 10 × 10 ,神經元個數為 1 0 5 10^5 105個,那么需要訓練的參數個數為 10 × 10 × 1 0 5 10^5 105 = 1 0 7 10^7 107
由于神經元個數相同,偏置值的數量也是相同的,故在計算中忽略了偏置值的統計,該操作不影響兩者計算量的比較。通過比較兩種連接方式計算的結果可知,采用局部連接方式的參數量是采用全連接方式的 1 2500 \frac{1}{2500} 25001? 。由此可見,神經元采用局部連接可以減少大量網絡需要學習的參數,降低模型的復雜度。
2.2.2 權值共享(Weight Sharing)
權值共享是卷積神經網絡的另一個特性。在網絡對輸入圖片進行卷積時,對于同一特征的提取,卷積核的參數是共享的,即卷積核中的參數是相同的。在全圖對某一個特征,如邊緣、紋理等進行提取時,所有卷積核參數相同。這種特性大大減少了卷積神經網絡中需要學習的參數,下圖是神經網絡權值共享示意圖。
圖中,第 n + 1 層神經元只與第 n層的部分神經元進行連接,該圖中第 n + 1層只與第 n層中的 3 個神經元連接,每一個神經元與上一層的神經元進行連接時,權值是相同的。w1,w2,w3 是不同神經元共享的權值。
權值共享就是說,給一張輸入圖片,用一個卷積核去掃這張圖,卷積核里面的數就叫權重,這張圖每個位置是被同樣的卷積核掃的,所以權重是一樣的,也就是共享。
這里面,最左邊的可以理解為是輸入圖片的一部分,而中間的是卷積核,右邊的是得到FeatureMap。這里的動圖演示的是通道數為1的情況(顯示情況下,Channel = 1 一般為灰度圖)。如果是彩色圖像(RGB),那么左邊的通道數為3(即有RGB各3張圖),中間卷積核的通道數也應該是3(對應輸入圖片的RGB 3 通道)。
我們需要注意一下:右邊輸出的FeatureMap的通道數并不是3,而是1。
- 這是因為,即便輸入特征圖和卷積核都是3通道的,但輸出特征并不是三通道的,而是把這三個通道對應位置上的值進行了相加,最終形成了一個 1通道的輸出特征圖。
而且我們還要注意一個問題,那就是卷積核上的參數是不變的。這就是我們所說的權值共享技巧。如果我們不進行權值共享,那么結果會這樣:
3. 卷積神經網絡(CNN)結構
3.1 整體架構
上面是一個簡單的 CNN 結構圖, 第一層輸入圖片, 進行卷積(Convolution)操作, 得到第二層特征圖(Feature Map). 對第二層的特征圖進行池化(Pooling)操作, 得到第三層特征圖,重復上述操作得到第五層特征圖, 最后將這特征圖、按行展開連接成向量, 傳入全連接(Fully Connected)層, 全連接層就是一個 BP 神經網絡. 圖中的每個特征圖都可以看成是排列成矩陣形式的神經元, 與 BP神經網絡中的神經元大同小異。
3.2 卷積層(Convolutional Layer)
卷積操作是CNN的靈魂,通過滑動窗口(濾波器/kernel)在圖像上提取局部特征,所以,一幅圖像的一個完整的卷積運算過程為:卷積核以一定的間隔滑動,并對所覆蓋的區域進行卷積運算得到值 z,直至遍歷完整幅圖像。如下圖所示:
我們都知道,彩色圖片都是三個通道,也就是說一個彩色圖片會有三個矩陣。加入現在輸入一張彩色圖片的尺寸為7×7×3,最后一維3表示圖像顏色通道,需要注意的是輸入的最后一維要和Filter的最后一維保持一致。Filter為3×3×3,那么這里的卷積核大小為3×3,對應輸入矩陣中每3×3的大小進行一個區域選擇。
計算方式為: 每一個對應位置相乘,最終結果相加,最后不要忘記加上偏置項
如下圖所示:
而卷積操作并不是說卷積一次就完事了,而是可以進行多次卷積,得到若干張特征圖,最后進行堆疊。
3.2.1 卷積層涉及的參數:
(1)滑動窗口步長(Stride)
從圖中可以看出,不同的步長得到的特征圖大小也不同。當步長較小時,相當于慢慢的提取特征,細粒度的提取特征,特征提取的較為豐富;當步長較大時,相當于大刀闊斧的提取特征,特征數目較少。
(2)濾波器尺寸(通常3×3或5×5)
其實和滑動窗口的尺寸一樣,當卷積核尺寸較小時,相當于慢慢的提取特征,細粒度的提取特征,特征提取的較為豐富;當卷積核尺寸較大時,相當于大刀闊斧的提取特征,特征數目較少。
在一般情況下, 滑動窗口選擇1,卷積核尺寸為3×3.
(3)填充(Padding)
在滑動窗口移動過程中,我們會發現,有些位置的值被多次計算,那么這些值會對最終的結果影響較大,這樣會造成不公平的效果。
解決方法:zero-padding 經過觀察發現,越靠近邊緣位置的值計算重復越少,越靠近中心位置的值計算次數越多,因此可以在輸入特征矩陣外再添加一圈0,使得原本邊界的特征被利用的次數增多,在一定程度上彌補了邊界信息缺失,邊界特征提取不充分的問題。
那么為啥添加的是0 ,而不是其他值呢? 如果添加其他值則會再計算過程中對最終的結果產生影響。
(4)卷積核個數
卷積核個數取決于最終在計算過程中得到多少個特征圖,10個特征圖也就對應10個卷積核。
3.3 池化層(Pooling Layer)
隨著模型網絡不斷加深,卷積核越來越多,要訓練的參數還是很多,而且直接拿卷積核提取的特征直接訓練也容易出現過擬合的現象。CNN使用的另一個有效的工具被稱為“池化(Pooling)”出現并解決了上面這些問題,為了有效地減少計算量,池化就是將輸入圖像進行縮小,減少像素信息,只保留重要信息;為了有效地解決過擬合問題,池化可以減少數據,但特征的統計屬性仍能夠描述圖像,而由于降低了數據維度,可以有效地避免過擬合。
給出池化的定義,對不同位置區域提取出有代表性的特征(進行聚合統計,例如最大值、平均值等),這種聚合的操作就叫做 池化,池化的過程通常也被稱為 特征映射 的過程(特征降維)。聽起來很高深,其實簡單地說就是下采樣。
池化的過程如下圖所示:
池化主要有兩種,除了 最大值池化(Max Pooling) 之外,還有 平均值池化(Average pooling),CNN中隨機池化使用的較少。
最大池化是對局部的值取最大;平均池化是對局部的值取平均;隨機池化是根據概率對局部的值進行采樣,采樣結果便是池化結果。概念非常容易理解,其示意圖如下所示:
三種池化的意義:
- 最大池化可以獲取局部信息,可以更好保留紋理上的特征。如果不用觀察物體在圖片中的具體位置,只關心其是否出現,則使用最大池化效果比較好。
- 平均池化往往能保留整體數據的特征,能凸出背景的信息。
- 隨機池化中元素值大的被選中的概率也大,但不是像最大池化總是取最大值。隨機池化一方面最大化地保證了Max值的取值,一方面又確保了不會完全是max值起作用,造成過度失真。除此之外,其可以在一定程度上避免過擬合。
3.4 常用激活函數
3.4.1 激活函數的作用
非線性建模:激活函數的主要作用是提供網絡的非線性建模能力。在卷積層中,卷積操作是線性的,即對每個像素點賦予一個權值進行加權求和。然而,對于實際樣本來說,不一定是線性可分的。為了解決這個問題,需要引入非線性因素,使網絡能夠學習更復雜的函數關系。(如果只有線性變換,那無論多少層神經元,都能簡化層一層神經元,那神經網絡只是簡單多元線性回歸而已,不能擬合更加復雜的函數。舉個例子,只有線性操作,那么神經網絡永遠無法擬合圓等復雜的曲線圖形,永遠只能表示超平面,無法表示曲面等。)
構建稀疏矩陣:激活函數還可以構建稀疏矩陣,即稀疏性。這個特性可以去除數據中的冗余,最大可能地保留數據的特征。大多數為0的稀疏矩陣可以更有效地表示數據,從而提高模型的泛化能力。
激活函數的非線性是神經網絡發揮作用最重要的因素之一,而對于實際部署,激活函數的實現也是很重要的一個方面,實現的不好對加速效果影響很大,這里主要講幾個部署當中常見的激活函數。
3.4.2 ReLU 激活函數
公式:
ReLU比較好部署,小于0的部分為0,大于0的部分為原始值,只需要判斷一下符號位就行。
3.4.3 Sigmoid 激活函數
公式:
Sigmoid 函數的輸出映射在(0,1)之間,單調連續,輸出范圍有限,優化穩定,可以用作輸出層。它在物理意義上最為接近生物神經元。
3.4.4 Tanh 激活函數
公式:
比Sigmoid函數收斂速度更快,相比Sigmoid函數,其輸出以0為中心。
3.5 全連接層(Fully Connected Layer)
將特征向量轉化為分類概率,分類概率是指將輸入圖片判定的概率。全連接層通常作為CNN的最后一層,對圖像的特征進行分類并得出最終的輸出結果。
全連接層的工作方式是將圖像的特征向量作為輸入,通過一組權值,計算得到一個分類結果。全連接層中的每一個神經元代表一個特定的類別,最后的輸出即為所屬類別的概率。
在經過多層的卷積層和池化層操作后,一般會有1個或2個全連接層,給出最后的分類結果。全連接層在整個卷積神經網絡中起到“分類器”的作用,它將學到的特征表示映射到類標簽空間。在實際中,全連接層可由卷積操作實現:對前層是全連接的全連接層可以轉化為卷積核為1×1的卷積;而前層是卷積層的全連接層可以轉化為卷積核為h×w的全局卷積,h和w分別為前層卷積輸出結果的高和寬。
3.6 卷積神經網絡的過程
首先需要一張圖片進行輸入,在輸入之后需要對其進行卷積操作,用于特征提取,在特征提取過后,需要用激活函數對所得到的特征圖進行激活。在激活之后,需要利用池化去進行降低尺寸,在降低尺寸之后,又要重新進行卷積激活,然后再進行池化,就這樣不停循環下去,直到這個神經網絡的規模能夠滿足我們全連接層計算,那我們就進入全連接層,然后在全連接層中進行詳細的計算以及進行分類,這就是卷積神經網絡CNN的一個整體的過程。
通過觀察圖,我們發現了幾個特點:
- 首先每一個卷積過后都連接一個Relu激活函數;
- 每兩次卷積后進行一次池化操作;
- 所有的卷積和池化操作完成后進行全連接FC,
- 全連接層得到最終的分類結果。
4. 經典CNN架構演進
模型 | 年份 | 創新點 | Top-5錯誤率 |
---|---|---|---|
LeNet-5 | 1998 | 首個成功CNN | - |
AlexNet | 2012 | ReLU/Dropout | 15.3% |
VGG | 2014 | 小卷積堆疊 | 7.3% |
GoogLeNet | 2014 | Inception模塊 | 6.7% |
ResNet | 2015 | 殘差連接 | 3.57% |
5. 總結
以上就是本篇博客的全部內容了,真的耗費了我不少時間來總結,希望可以和大家一起學習、進步。大家如果發現博客中有表述不正確的的地方還望能及時指正,謝謝大家!
人生海海,山山而川。希望大家能一直保持初心,堅定目標,并為之努力奮斗,終有一天,我們都能成為心中所想成為的人!
本篇博客就到這里啦,大家下篇博客見!