吳恩達深度學習(四)卷積神經網絡——1.CNN基礎

1. 計算機視覺

(Computer Vision)

一般的CV問題包括以下三類:

  1. 圖像分類(Image Classification)
  2. 目標識別(Object detection)
  3. 神經風格轉換(Neural Style Transfer)

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


2. 卷積操作:以邊緣檢測舉例

(Edge Detection)

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

在這裏插入圖片描述
圖片的邊緣檢測可以通過與相應濾波器進行卷積來實現。以垂直邊緣檢測爲例,原始圖片尺寸爲6×6,濾波器filter尺寸爲3×3,卷積後的圖片尺寸爲4×4,得到結果如下:

在這裏插入圖片描述其中 * 表示卷積操作,上圖只顯示了卷積後的第一個值和最後一個值,其餘值可自行計算。

以垂直邊緣檢測(vertical edges detection)爲例,利用卷積可以檢測到圖像的垂直邊緣:
在這裏插入圖片描述


3. 邊緣檢測補充

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

在這裏插入圖片描述
下圖展示一個水平邊緣檢測的例子:

在這裏插入圖片描述

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

在這裏插入圖片描述
除了上面提到的這種簡單的Vertical、Horizontal濾波器之外,還有其它常用的filters,例如Sobel filter和Scharr filter。這兩種濾波器的特點是增加圖片中心區域的權重。(下圖展示的是垂直邊緣檢測算子,水平邊緣檢測算子只需將上圖順時針翻轉90度即可。)

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

4. Padding

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

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

爲了解決圖片縮小的問題,可以 使用padding方法,即把原始圖片尺寸進行擴展,擴展區域補零,用 pp 來表示每個方向擴展的寬度。
在這裏插入圖片描述
經過padding之後:

原始圖像padding後尺寸 filter尺寸 卷積後的圖像尺寸
(n+2p)×(n+2p)(n+2p) × (n+2p) f×ff × f (n+2pf+1)×(n+2pf+1)(n+2p-f+1) × (n+2p-f+1)

若要保證卷積前後圖像尺寸不變,則p應滿足:
n=(n+2pf+1) p=f12n=(n+2p-f+1),即\ p=\frac{f-1}{2}
稍作總結:

  • 無padding操作,p=0p=0,我們稱之爲 Valid convolutions (不填充)
  • 有padding操作,p=f12p=\frac{f-1}{2} ,我們稱之爲 Same convolutions (填充,輸入輸出大小相等)

5. 卷積步長

(Strided convolutions)

Stride表示filter在原圖片中水平方向和垂直方向每次的步進長度。之前我們默認stride=1。若stride=2,則表示filter每次步進長度爲2,即隔一點移動一次。
在這裏插入圖片描述
我們用 ss 表示stride長度,pp 表示padding長度,如果原始圖片尺寸爲 n×nn × n,filter尺寸爲 f×ff× f,則卷積後的圖片尺寸爲:
n+2pfs+1×n+2pfs+1\left\lfloor\frac{n+2 p-f}{s}+1\right\rfloor ×\left\lfloor\frac{n+2 p-f}{s}+1\right\rfloor在上圖的例子中,n=7, p=0, f=3, s=2, 7+032+1=3n=7, \ p=0,\ f=3,\ s=2,\ \frac{7+0-3}{2}+1=3, 即 3×33\times3 的輸出。

注:商不是整數的情況下,向下取整,上式中的 ...\lfloor...\rfloor 表示向下取整。


值得一提的是,相關係數cross-correlations)與 卷積convolutions)之間是有區別的。

  • 數學意義上的卷積運算會先將filter繞其中心旋轉180度,然後再將旋轉後的filter在原始圖片上進行滑動計算。filter旋轉如下所示:
    在這裏插入圖片描述
  • 相關係數的計算過程則不會對filter進行旋轉,而是直接在原始圖片上進行滑動計算。

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

卷積運算服從結合律:(AB)C=A(BC)(A * B) * C=A *(B * C)


6. 三維卷積

(Convolutions over volumes)

對於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全部設置爲水平邊緣檢測。

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

在這裏插入圖片描述
三維卷積下的尺寸計算爲:

原始圖像尺寸 filter尺寸 卷積後的圖像尺寸
n×n×ncn ×n×n_c f×f×ncf × f×n_c (nf+1)×(nf+1)×nc(n-f+1) × (n-f+1)×n_c^{'}

其中,ncn_c 爲圖片通道數目,ncn_c^{'} 爲濾波器組個數。

因此:

  • 濾波器層數 == 原始圖像層數 =nc=n_c
  • 卷積後的圖像層數 == 濾波器組個數 =nc=n_c^{'}

7. 單層卷積網絡

(One layer of a convolutional network)

卷積神經網絡的單層結構如下所示:
卷積神經網絡的單層結構如下所示:
相比之前單獨的卷積過程,CNN的單層結構多了激活函數ReLU和偏移量b。整個過程與標準的神經網絡單層結構非常類似:Z[l]=W[l]A[l1]+bA[l]=g[l](Z[l])\begin{aligned} &Z^{[l]}=W^{[l]} A^{[l-1]}+b\\ &A^{[l]}=g^{[l]}\left(Z^{[l]}\right) \end{aligned} 卷積運算對應着上式中的乘積運算,濾波器組數值對應着權重 W[l]W^{[l]} ,所選的激活函數爲ReLU。

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

總結一下CNN單層結構的所有標記符號,設層數爲 ll,給定一下符號標記:

padding 步長
stride
濾波器大小
filter size
濾波器組個數
number of filters
p[l]p^{[l]} s[l]s^{[l]} f[l]f^{[l]} nc[l]n_c^{[l]}

可以得到(H,W,cH,W,c 分別表示height、weight和channel):

輸入維度 nH[l1]×nW[l1]×nc[l1]n_{H}^{[l-1]} \times n_{W}^{[l-1]} \times n_{c}^{[l-1]}
每個濾波器組維度 f[l]×f[l]×nc[l1]f^{[l]}×f^{[l]}×n_{c}^{[l-1]}
權重維度 f[l]×f[l]×nc[l1]×nc[l]f^{[l]}×f^{[l]}×n_{c}^{[l-1]}×n_{c}^{[l]}
偏置維度 1×1×1×nc[l]1×1×1×n_{c}^{[l]}
輸出維度 nH[l]×nW[l]×nc[l]n_{H}^{[l]} \times n_{W}^{[l]} \times n_{c}^{[l]}

注:關於維度的關係理不清的話可以回顧第 #6節末的總結

根據第#5節的內容,可以得到輸出維度滿足:
nH[l]=nH[l1]+2p[l]f[l]s[l]+1nW[l]=nW[l1]+2p[l]f[l]s[l]+1\begin{array}{l} n_{H}^{[l]}=\left\lfloor\displaystyle\frac{n_{H}^{[l-1]}+2 p^{[l]}-f^{[l]}}{s^{[l]}}+1\right\rfloor \\ \\ n_{W}^{[l]}=\left\lfloor\displaystyle\frac{n_{W}^{[l-1]}+2 p^{[l]}-f^{[l]}}{s ^{[l]}}+1\right\rfloor \end{array} 如果有m個樣本,進行向量化運算,相應的輸出維度爲:m×nH[l]×nW[l]×nc[l]m\times n_{H}^{[l]} \times n_{W}^{[l]} \times n_{c}^{[l]}


8. 簡單卷積網絡示例

(A simple convolution network example)

下面介紹一個簡單的CNN網絡模型(計算過程見上節公式):
在這裏插入圖片描述
該CNN模型各層結構如上圖所示。需要注意的是,a[3]a^{[3]} 的維度是7 x 7 x 40,將 a[3]a^{[3]} 排列成1列,維度爲1960 x 1,然後連接最後一級輸出層。輸出層可以是一個神經元,即二元分類(logistic);也可以是多個神經元,即多元分類(softmax)。最後得到預測輸出 y^\hat{y}

隨着CNN層數增加,nH[l]n_H^{[l]}nW[l]n_W^{[l]} 一般逐漸減小,而 nc[l]n_c^{[l]} 一般逐漸增大。

一個典型的卷積神經網絡通常有三層:

  • 卷積層:Convolution layers(CONV
  • 池化層:Pooling layers(POOL
  • 全連接層:Fully connected layers(FC

雖然僅用卷積層也有可能構建出很好的神經網絡,但大部分神經網絡架構師依然會添加池化層和全連接層。池化層和全連接層比卷積層更容易設計。


9. 池化層

(Pooling layers)

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

Pooling layers 的做法比 Convolution layers 簡單許多,沒有卷積運算,僅僅是在濾波器算子滑動區域內取最大值,即max pooling,這是最常用的做法。(我的理解是類似於降採樣)

注意,超參數p(padding)很少在pooling layers中使用。

在這裏插入圖片描述
Max pooling的好處是隻保留區域內的最大值(特徵),忽略其它值,降低noise影響,提高模型健壯性。而且,max pooling需要的超參數僅爲濾波器尺寸 ff 和濾波器步長 ss,沒有其他參數需要模型訓練得到,計算量很小。

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

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

在這裏插入圖片描述
實際應用中,max pooling比average pooling更爲常用。


10. 卷積神經網絡示例

(Convolutional neural network example)

下面介紹一個簡單的數字識別的CNN例子:
在這裏插入圖片描述
圖中,CONV層後面緊接一個POOL層,CONV1 和 POOL1 構成Layer1,CONV2 和 POOL2 構成 Layer2(一般在統計網絡層數時,只計算具有權重的層,因爲池化層沒有權重和參數,只有一些超參數。因此我們把CONV1和POOL1共同作爲一個卷積,並標記爲Layer1)。

特別注意的是FC3和FC4爲全連接層FC,它跟標準的神經網絡結構一致。最後的輸出層(softmax)由10個神經元構成。

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

在這裏插入圖片描述
有幾點要注意,第一,池化層和最大池化層沒有參數;第二,卷積層的參數相對較少,前面課上我們提到過,其實許多參數都存在於神經網絡的全連接層。

觀察可發現,隨着神經網絡的加深,激活值尺寸會逐漸變小,如果激活值尺寸下降太快,也會影響神經網絡性能。示例中,激活值尺寸在第一層爲6000,然後減少到1600,慢慢減少到84,最後輸出softmax結果。我們發現,許多卷積網絡都具有這些屬性,模式上也相似。


11. 爲什麼使用卷積?

(Why convolutions?)

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

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

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


參考:
紅色石頭:吳恩達《卷積神經網絡》課程筆記
第四門課 卷積神經網絡(Convolutional Neural Networks)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章