Coursera吳恩達《卷積神經網路》課程筆記(1)-- 卷積神經網路基礎

我的CSDN博客地址:紅色石頭的專欄

我的知乎主頁:紅色石頭

我的知乎專欄:紅色石頭的機器學習之路

歡迎大家關注我!共同學習,共同進步!

《Convolutional Neural Networks》是Andrw Ng深度學習專項課程中的第四門課。這門課主要介紹卷積神經網路(CNN)的基本概念、模型和具體應用。該門課共有4周課時,所以我將分成4次筆記來總結,這是第一節筆記。

1. Computer Vision

機器視覺(Computer Vision)是深度學習應用的主要方向之一。一般的CV問題包括以下三類:

  • Image Classification
  • Object detection
  • Neural Style Transfer

下圖展示了一個神經風格轉換(Neural Style Transfer)的例子:

使用傳統神經網路處理機器視覺的一個主要問題是輸入層維度很大。例如一張64x64x3的圖片,神經網路輸入層的維度為12288。如果圖片尺寸較大,例如一張1000x1000x3的圖片,神經網路輸入層的維度將達到3百萬,使得網路權重W非常龐大。這樣會造成兩個後果,一是神經網路結構複雜,數據量相對不夠,容易出現過擬合;二是所需內存、計算量較大。解決這一問題的方法就是使用卷積神經網路(CNN)。

2. Edge Detection Example

對於CV問題,我們在之前的筆記中介紹過,神經網路由淺層到深層,分別可以檢測出圖片的邊緣特徵 、局部特徵(例如眼睛、鼻子等)、整體面部輪廓。

這一小節我們將介紹如何檢測圖片的邊緣。

最常檢測的圖片邊緣有兩類:一是垂直邊緣(vertical edges),二是水平邊緣(horizontal edges)。

圖片的邊緣檢測可以通過與相應濾波器進行卷積來實現。以垂直邊緣檢測為例,原始圖片尺寸為6x6,濾波器filter尺寸為3x3,卷積後的圖片尺寸為4x4,得到結果如下:

上圖只顯示了卷積後的第一個值和最後一個值。

順便提一下, * 表示卷積操作。python中,卷積用conv_forward()表示;tensorflow中,卷積用tf.nn.conv2d()表示;keras中,卷積用Conv2D()表示。

Vertical edge detection能夠檢測圖片的垂直方向邊緣。下圖對應一個垂直邊緣檢測的例子:

3. More Edge Detection

圖片邊緣有兩種漸變方式,一種是由明變暗,另一種是由暗變明。以垂直邊緣檢測為例,下圖展示了兩種方式的區別。實際應用中,這兩種漸變方式並不影響邊緣檢測結果,可以對輸出圖片取絕對值操作,得到同樣的結果。

垂直邊緣檢測和水平邊緣檢測的濾波器運算元如下所示:

下圖展示一個水平邊緣檢測的例子:

除了上面提到的這種簡單的Vertical、Horizontal濾波器之外,還有其它常用的filters,例如Sobel filter和Scharr filter。這兩種濾波器的特點是增加圖片中心區域的權重。

上圖展示的是垂直邊緣檢測運算元,水平邊緣檢測運算元只需將上圖順時針翻轉90度即可。

在深度學習中,如果我們想檢測圖片的各種邊緣特徵,而不僅限於垂直邊緣和水平邊緣,那麼filter的數值一般需要通過模型訓練得到,類似於標準神經網路中的權重W一樣由梯度下降演算法反覆迭代求得。CNN的主要目的就是計算出這些filter的數值。確定得到了這些filter後,CNN淺層網路也就實現了對圖片所有邊緣特徵的檢測。

4. Padding

按照我們上面講的圖片卷積,如果原始圖片尺寸為n x n,filter尺寸為f x f,則卷積後的圖片尺寸為(n-f+1) x (n-f+1),注意f一般為奇數。這樣會帶來兩個問題:

  • 卷積運算後,輸出圖片尺寸縮小
  • 原始圖片邊緣信息對輸出貢獻得少,輸出圖片丟失邊緣信息

為了解決圖片縮小的問題,可以使用padding方法,即把原始圖片尺寸進行擴展,擴展區域補零,用p來表示每個方向擴展的寬度。

經過padding之後,原始圖片尺寸為(n+2p) x (n+2p),filter尺寸為f x f,則卷積後的圖片尺寸為(n+2p-f+1) x (n+2p-f+1)。若要保證卷積前後圖片尺寸不變,則p應滿足:

p=frac{f-1}{2}

沒有padding操作, p=0 ,我們稱之為「Valid convolutions」;有padding操作, p=frac{f-1}{2} ,我們稱之為「Same convolutions」。

5. Strided Convolutions

Stride表示filter在原圖片中水平方向和垂直方向每次的步進長度。之前我們默認stride=1。若stride=2,則表示filter每次步進長度為2,即隔一點移動一次。

我們用s表示stride長度,p表示padding長度,如果原始圖片尺寸為n x n,filter尺寸為f x f,則卷積後的圖片尺寸為:

lfloorfrac{n+2p-f}{s}+1
floor X lfloorfrac{n+2p-f}{s}+1
floor

上式中, lfloorcdots
floor 表示向下取整。

值得一提的是,相關係數(cross-correlations)與卷積(convolutions)之間是有區別的。實際上,真正的卷積運算會先將filter繞其中心旋轉180度,然後再將旋轉後的filter在原始圖片上進行滑動計算。filter旋轉如下所示:

比較而言,相關係數的計算過程則不會對filter進行旋轉,而是直接在原始圖片上進行滑動計算。

其實,目前為止我們介紹的CNN卷積實際上計算的是相關係數,而不是數學意義上的卷積。但是,為了簡化計算,我們一般把CNN中的這種「相關係數」就稱作卷積運算。之所以可以這麼等效,是因為濾波器運算元一般是水平或垂直對稱的,180度旋轉影響不大;而且最終濾波器運算元需要通過CNN網路梯度下降演算法計算得到,旋轉部分可以看作是包含在CNN模型演算法中。總的來說,忽略旋轉運算可以大大提高CNN網路運算速度,而且不影響模型性能。

卷積運算服從分配律:

(A*B)*C=A*(B*C)

6. Convolutions Over Volume

對於3通道的RGB圖片,其對應的濾波器運算元同樣也是3通道的。例如一個圖片是6 x 6 x 3,分別表示圖片的高度(height)、寬度(weight)和通道(#channel)。

3通道圖片的卷積運算與單通道圖片的卷積運算基本一致。過程是將每個單通道(R,G,B)與對應的filter進行卷積運算求和,然後再將3通道的和相加,得到輸出圖片的一個像素值。

不同通道的濾波運算元可以不相同。例如R通道filter實現垂直邊緣檢測,G和B通道不進行邊緣檢測,全部置零,或者將R,G,B三通道filter全部設置為水平邊緣檢測。

為了進行多個卷積運算,實現更多邊緣檢測,可以增加更多的濾波器組。例如設置第一個濾波器組實現垂直邊緣檢測,第二個濾波器組實現水平邊緣檢測。這樣,不同濾波器組卷積得到不同的輸出,個數由濾波器組決定。

若輸入圖片的尺寸為n x n x n_c ,filter尺寸為f x f x n_c ,則卷積後的圖片尺寸為(n-f+1) x (n-f+1) x n_c 。其中, n_c 為圖片通道數目, n_c 為濾波器組個數。

7. One Layer of a Convolutional Network

卷積神經網路的單層結構如下所示:

相比之前的卷積過程,CNN的單層結構多了激活函數ReLU和偏移量b。整個過程與標準的神經網路單層結構非常類似:

Z^{[l]}=W^{[l]}A^{[l-1]}+b

A^{[l]}=g^{[l]}(Z^{[l]})

卷積運算對應著上式中的乘積運算,濾波器組數值對應著權重 W^{[l]} ,所選的激活函數為ReLU。

我們來計算一下上圖中參數的數目:每個濾波器組有3x3x3=27個參數,還有1個偏移量b,則每個濾波器組有27+1=28個參數,兩個濾波器組總共包含28x2=56個參數。我們發現,選定濾波器組後,參數數目與輸入圖片尺寸無關。所以,就不存在由於圖片尺寸過大,造成參數過多的情況。例如一張1000x1000x3的圖片,標準神經網路輸入層的維度將達到3百萬,而在CNN中,參數數目只由濾波器組決定,數目相對來說要少得多,這是CNN的優勢之一。

最後,我們總結一下CNN單層結構的所有標記符號,設層數為 l

  • f^{[l]} = filter size
  • p^{[l]} = padding
  • s^{[l]} = stride
  • n_c^{[l]} = number of filters

輸入維度為: n_H^{[l-1]} x n_W^{[l-1]} x n_c^{[l-1]}

每個濾波器組維度為: f^{[l]} x f^{[l]} x n_c^{[l-1]}

權重維度為: f^{[l]} x f^{[l]} x n_c^{[l-1]} x n_c^{[l]}

偏置維度為:1 x 1 x 1 x n_c^{[l]}

輸出維度為: n_H^{[l]} x n_W^{[l]} x n_c^{[l]}

其中,

n_H^{[l]}=lfloor frac{n_H^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}}+1 
floor

n_W^{[l]}=lfloor frac{n_W^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}}+1 
floor

如果有m個樣本,進行向量化運算,相應的輸出維度為:m x n_H^{[l]} x n_W^{[l]} x n_c^{[l]}

8. Simple Convolutional Network Example

下面介紹一個簡單的CNN網路模型:

該CNN模型各層結構如上圖所示。需要注意的是, a^{[3]} 的維度是7 x 7 x 40,將 a^{[3]} 排列成1列,維度為1960 x 1,然後連接最後一級輸出層。輸出層可以是一個神經元,即二元分類(logistic);也可以是多個神經元,即多元分類(softmax)。最後得到預測輸出 hat y

值得一提的是,隨著CNN層數增加, n_H^{[l]}n_W^{[l]} 一般逐漸減小,而 n_c^{[l]} 一般逐漸增大。

CNN有三種類型的layer:

  • Convolution層(CONV)
  • Pooling層(POOL)
  • Fully connected層(FC)

CONV最為常見也最重要,關於POOL和FC我們之後再介紹。

9. Pooling Layers

Pooling layers是CNN中用來減小尺寸,提高運算速度的,同樣能減小noise影響,讓各特徵更具有健壯性。

Pooling layers的做法比convolution layers簡單許多,沒有卷積運算,僅僅是在濾波器運算元滑動區域內取最大值,即max pooling,這是最常用的做法。注意,超參數p很少在pooling layers中使用。

Max pooling的好處是只保留區域內的最大值(特徵),忽略其它值,降低noise影響,提高模型健壯性。而且,max pooling需要的超參數僅為濾波器尺寸f和濾波器步進長度s,沒有其他參數需要模型訓練得到,計算量很小。

如果是多個通道,那麼就每個通道單獨進行max pooling操作。

除了max pooling之外,還有一種做法:average pooling。顧名思義,average pooling就是在濾波器運算元滑動區域計算平均值。

實際應用中,max pooling比average pooling更為常用。

10. CNN Example

下面介紹一個簡單的數字識別的CNN例子:

圖中,CON層後面緊接一個POOL層,CONV1和POOL1構成第一層,CONV2和POOL2構成第二層。特別注意的是FC3和FC4為全連接層FC,它跟標準的神經網路結構一致。最後的輸出層(softmax)由10個神經元構成。

整個網路各層的尺寸和參數如下表格所示:

11. Why Convolutions

相比標準神經網路,CNN的優勢之一就是參數數目要少得多。參數數目少的原因有兩個:

  • 參數共享:一個特徵檢測器(例如垂直邊緣檢測)對圖片某塊區域有用,同時也可能作用在圖片其它區域。
  • 連接的稀疏性:因為濾波器運算元尺寸限制,每一層的每個輸出只與輸入部分區域內有關。

除此之外,由於CNN參數數目較小,所需的訓練樣本就相對較少,從而一定程度上不容易發生過擬合現象。而且,CNN比較擅長捕捉區域位置偏移。也就是說CNN進行物體檢測時,不太受物體所處圖片位置的影響,增加檢測的準確性和系統的健壯性。


推薦閱讀:

「深度學習+自然語言處理(NLP)」專欄索引
看我AK甩槍,舊文重讀《Playing FPS Games with Deep Reinforcement Learning》
【恢復更新】寫給大家看的機器學習書(第八篇)——線性回歸(下)
cs.CL weekly 2016.09.26-2016.09.30
從高斯分布、機器人誤差、EM演算法到小球檢測

TAG:机器学习 | 深度学习DeepLearning | 卷积神经网络CNN |