卷積神經網絡的簡單理解


前面的神經網絡我們使用的都是全連接網絡,不管是感知機還是函數逼近,都使用的仿射(Affine)變換,今天介紹卷積神經網絡(Convolutional Neural Network,CNN)。CNN被用於圖像識別、語音識別等各種場合,在圖像識別的比賽中,基於深度學習的方法幾乎都以CNN爲基礎。

網上談卷積神經網絡的文章不計其數,本篇的目的是幫助你快速理解其作用和關鍵點。

1、爲什麼需要卷積

我認爲有以下幾個作用:
1、通過共享權重,降低學習的參數 舉個例子,在MNIST手寫數字識別中,一張圖片是由像素點構成,每個像素點有一個通道,代表RGB顏色,那麼,如果一個圖像的尺寸是(28,28,1),即代表這個圖像的是一個長寬均爲28,channel爲1的圖像(channel也叫depth,此處1代表灰色圖像)。如果使用全連接的網絡結構,即,網絡中的神經與與相鄰層上的每個神經元均連接,那就意味着我們的網絡有28 * 28 =784個神經元,hidden層採用了15個神經元,那麼簡單計算一下,我們需要的參數個數(w和b)就有:7841510+15+10=117625784*15*10+15+10=117625個(解釋:2828=78428*28=784, 15個隱藏層和10個輸出層偏置),這個參數太多了,隨便進行一次反向傳播計算量都是巨大的,從計算資源和調參的角度都不建議用傳統的神經網絡。這還只是一個 Hello World 級的實例。
在這裏插入圖片描述

2、特徵提取 通過卷積核或叫做濾波器的不同設置可提取圖像不同特徵值。比如下圖裏的邊界檢查中,可以使用水平和垂直方向的濾波器,檢測水平方向和垂直方向的邊界特徵。CNN中,有時將卷積層的輸入輸出數據稱爲特徵圖(feature map)。其中,卷積層的輸入數據稱爲輸入特徵圖(input feature map),輸出數據稱爲輸出特徵圖(output feature map)

在這裏插入圖片描述3、保形輸出 之前介紹的全連接的神經網絡中使用了全連接層(Affine層)。在全連接層中,相鄰層的神經元全部連接在一起,輸出的數量可以任意決定。全連接層存在什麼問題呢?那就是數據的形狀被“忽視”了。比如,輸入數據是圖像時,圖像通常是高、長、通道方向上的3 維形狀。但是,向全連接層輸入時,需要將3 維數據拉平爲1 維數據。實際上,前面提到的使用了MNIST數據集的例子中,輸入圖像就是1 通道、高28 像素、長28 像素的(1, 28, 28)形狀,但卻被排成1列,以784 個數據的形式輸入到最開始的Affine層。圖像是3 維形狀,這個形狀中應該含有重要的空間信息。比如,空間上鄰近的像素爲相似的值、RBG的各個通道之間分別有密切的關聯性、相距較遠的像素之間沒有什麼關聯等,3 維形狀中可能隱藏有值得提取的本質模式。但是,因爲全連接層會忽視形狀,將全部的輸入數據作爲相同的神經元(同一維度的神經元)處理,所以無法利用與形狀相關的信息。而卷積層可以保持形狀不變。當輸入數據是圖像時,卷積層會以3 維數據的形式接收輸入數據,並同樣以3 維數據的形式輸出至下一層

2、整體結構

首先,來看一下CNN的網絡結構,瞭解CNN的大致框架。
CNN和之前介紹的神經網絡一樣,可以像樂高積木一樣通過組裝層來構建。不過,CNN中新出現了卷積層(Convolution 層)和池化層(Pooling 層)。
之前介紹的神經網絡中,相鄰層的所有神經元之間都有連接,這稱爲全連接(fully-connected)。我們用Affine層實現了全連接層。如果使用這個Affine層,一個5 層的全連接的神經網絡就可以通過圖1-1 所示的網絡結構來實現。
如圖1-1 所示,全連接的神經網絡中,Affine層後面跟着激活函數ReLU層(或者Sigmoid 層)。這裏堆疊了4 層“Affine-ReLU”組合,然後第5 層是Affine層,最後由Softmax層輸出最終結果(概率)。

在這裏插入圖片描述
圖1-1
那麼,CNN會是什麼樣的結構呢?圖1-2 是CNN的一個例子。

在這裏插入圖片描述
圖1-2
可以看出,在組建網絡結構的方法上,沒啥差別。在CNN中新增了Convolution 層和Pooling 層。CNN 的層的連接順序是“Convolution-ReLU-(Pooling)”。這可以理解爲之前的“Affine-ReLU”連接被替換成了“Convolution-ReLU-(Pooling)”連接。還需要注意的是,在圖1-2 的CNN中,靠近輸出的層中使用了之前的“Affine-ReLU”組合。此外,最後的輸出層中使用了之前的“Affine =-Softmax”組合。這些都是一般的CNN中比較常見的結構.

3、卷積層

CNN中出現了一些特有的術語,比如填充、步幅等。此外,各層中傳遞的數據是有形狀的數據(比如,3 維數據),這與之前的全連接網絡不同,因此剛開始學習CNN時可能會感到難以理解。本節我們將花點時間,認真學習一下CNN中使用的卷積層的結構.

3.1 卷積運算

卷積層進行的處理就是卷積運算。卷積運算相當於圖像處理中的“濾波器運算”。在介紹卷積運算時,我們來看一個具體的例子(圖1-3)。
在這裏插入圖片描述
圖1-3

如圖1-3 所示,卷積運算對輸入數據應用濾波器。在這個例子中,輸入數據是有高長方向的形狀的數據,濾波器也一樣,有高長方向上的維度。假設用(height, width)表示數據和濾波器的形狀,則在本例中,輸入大小是(4, 4),濾波器大小是(3, 3),輸出大小是(2, 2)。另外,有的文獻中也會用“核”這個詞來表示這裏所說的“濾波器”。
現在來解釋一下圖1-3 的卷積運算的例子中都進行了什麼樣的計算。圖1-4中展示了卷積運算的計算順序。

對於輸入數據,卷積運算以一定間隔滑動濾波器的窗口並應用。這裏所說的窗口是指圖1-4 中灰色的3 × 3 的部分。如圖1-4 所示,將各個位置上濾波器的元素和輸入的對應元素相乘,然後再求和(有時將這個計算稱爲乘積累加運算)。然後,將這個結果保存到輸出的對應位置。將這個過程在所有位置都進行一遍,就可以得到卷積運算的輸出。

在這裏插入圖片描述
圖1-4

注意濾波器操作不是點積,二是如下操作,示例:

>>> import numpy as np
>>> a = np.array([[1,2,3],[0,1,2],[3,0,1]])
>>> a
array([[1, 2, 3],
       [0, 1, 2],
       [3, 0, 1]])
>>> b = np.array([[2,0,1],[0,1,2],[1,0,2]])
>>> b
array([[2, 0, 1],
       [0, 1, 2],
       [1, 0, 2]])
>>> c = a * b # 不是np.dot(a,b)
>>> c
array([[2, 0, 3],
       [0, 1, 4],
       [3, 0, 2]])
>>> print(c.sum())
15

在全連接的神經網絡中,除了權重參數,還存在偏置。CNN中,濾波器的參數就對應之前的權重。並且,CNN中也存在偏置。圖1-3 的卷積運算的例子一直展示到了應用濾波器的階段。包含偏置的卷積運算的處理流如圖1-5 所示。如圖1-5 所示,嚮應用了濾波器的數據加上了偏置。偏置通常只有1 個(1 × 1)(本例中,相對於應用了濾波器的4 個數據,偏置只有1 個),這個值會被加到應用了濾波器的所有元素上。

在這裏插入圖片描述
圖1-5

3.2 Padding填充

在進行卷積層的處理之前,有時要向輸入數據的周圍填入固定的數據(比如0 等),這稱爲填充(padding),是卷積運算中經常會用到的處理。比如,在圖1-6 的例子中,對大小爲(4, 4) 的輸入數據應用了幅度爲1的填充。“幅度爲1的填充”是指用幅度爲1 像素的0填充周圍。

在這裏插入圖片描述
圖1-6  卷積運算的填充處理:向輸入數據的周圍填入0(圖中用虛線表示填充,並省略了填充的內容“0”)

如圖1-6 所示,通過填充,大小爲(4, 4) 的輸入數據變成了(6, 6) 的形狀。然後,應用大小爲(3, 3) 的濾波器,生成了大小爲(4, 4) 的輸出數據。這個例子中將填充設成了1,不過填充的值也可以設置成2、3 等任意的整數。在圖7-5的例子中,如果將填充設爲2,則輸入數據的大小變爲(8, 8);如果將填充設爲3,則大小變爲(10, 10)。

使用填充主要是爲了調整輸出的大小。比如,對大小爲(4, 4) 的輸入數據應用(3, 3) 的濾波器時,輸出大小變爲(2, 2),相當於輸出大小比輸入大小縮小了2 個元素。這在反覆進行多次卷積運算的深度網絡中會成爲問題。爲什麼呢?因爲如果每次進行卷積運算都會縮小空間,那麼在某個時刻輸出大小就有可能變爲1,導致無法再應用卷積運算。爲了避免出現這樣的情況,就要使用填充。在剛纔的例子中,將填充的幅度設爲1,那麼相對於輸入大小(4, 4),輸出大小也保持爲原來的(4, 4)。因此,卷積運算就可以在保持空間大小不變的情況下將數據傳給下一層。

3.3 步幅

應用濾波器的位置間隔稱爲步幅(stride)。之前的例子中步幅都是1,如果將步幅設爲2,則如圖1-7 所示,應用濾波器的窗口的間隔變爲2個元素。

在這裏插入圖片描述
圖1-7 步幅爲2 的卷積運算的例子

在圖1-7 的例子中,對輸入大小爲(7, 7) 的數據,以步幅2 應用了濾波器。通過將步幅設爲2,輸出大小變爲(3, 3)。像這樣,步幅可以指定應用濾波器的間隔。綜上,增大步幅後,輸出大小會變小。而增大填充後,輸出大小會變大。
如果將這樣的關係寫成算式,會如何呢?接下來,我們看一下對於填充和步幅,如何計算輸出大小。

這裏,假設輸入大小爲(H,W),濾波器大小爲(FH, FW),輸出大小爲(OH,OW),填充爲P,步幅爲S。此時,輸出大小可通過式(1.1) 進行計算。

OH=H+2PFHS+1OH=\frac {H+2P-FH}{S}+1
OW=W+2PFWS+1OW=\frac {W+2P-FW}{S}+1

3.4 3維數據的卷積運算

之前的卷積運算的例子都是以有高、長方向的2維形狀爲對象的。但是,圖像是3維數據,除了高、長方向之外,還需要處理通道方向。這裏,我們按照與之前相同的順序,看一下對加上了通道方向的3維數據進行卷積運算的例子。

在這裏插入圖片描述
圖1-8 對3維數據進行卷積運算的例子

圖1-8 是卷積運算的例子,圖1-9 是計算順序。這裏以3 通道的數據爲例,展示了卷積運算的結果。和2 維數據時(圖7-3 的例子)相比,可以發現縱深方向(通道方向)上特徵圖增加了。通道方向上有多個特徵圖時,會按通道進行輸入數據和濾波器的卷積運算,並將結果相加,從而得到輸出。

需要注意的是,在3 維數據的卷積運算中,輸入數據和濾波器的通道數要設爲相同的值。在這個例子中,輸入數據和濾波器的通道數一致,均爲3。濾波器大小可以設定爲任意值(不過,每個通道的濾波器大小要全部相同)。
這個例子中濾波器大小爲(3, 3),但也可以設定爲(2, 2)、(1, 1)、(5, 5) 等任意值。
再強調一下,通道數只能設定爲和輸入數據的通道數相同的值。

3.5 結合方塊思考

將數據和濾波器結合長方體的方塊來考慮,3 維數據的卷積運算會很容易理解。方塊是如圖1-10 所示的3 維長方體。把3 維數據表示爲多維數組時,書寫順序爲(channel, height, width)。比如,通道數爲C、高度爲H、長度爲W的數據的形狀可以寫成(C,H,W)。濾波器也一樣,要按(channel,height, width)的順序書寫。比如,通道數爲C、濾波器高度爲FH(Filter Height)、長度爲FW(Filter Width)時,可以寫成(C, FH, FW)。
在這裏插入圖片描述
圖1-10 結合方塊思考卷積運算。請注意方塊的形狀

在這個例子中,數據輸出是1 張特徵圖。所謂1 張特徵圖,換句話說,就是通道數爲1 的特徵圖。那麼,如果要在通道方向上也擁有多個卷積運算的輸出,該怎麼做呢?爲此,就需要用到多個濾波器(權重)。用圖表示的話,如圖1-11 所示。
在這裏插入圖片描述
圖1-11 基於多個濾波器的卷積運算的例子

圖1-11 中,通過應用FN個濾波器,輸出特徵圖也生成了FN個。如果將這FN個特徵圖彙集在一起,就得到了形狀爲(FN, OH,OW) 的方塊。將這個方塊傳給下一層,就是CNN的處理流。如圖1-11 所示,關於卷積運算的濾波器,也必須考慮濾波器的數量。因此,作爲4 維數據,濾波器的權重數據要按(output_channel, input_channel, height, width) 的順序書寫。比如,通道數爲3、大小爲5 × 5 的濾波器有20 個時,可以寫成(20, 3, 5, 5)。卷積運算中(和全連接層一樣)存在偏置。在圖1-11 的例子中,如果進一步追加偏置的加法運算處理,則結果如下面的圖1-12 所示。圖1-12 中,每個通道只有一個偏置。這裏,偏置的形狀是(FN, 1, 1),濾波器的輸出結果的形狀是(FN, OH,OW)。這兩個方塊相加時,要對濾波器的輸出結果(FN, OH,OW) 按通道加上相同的偏置值。另外,不同形狀的
方塊相加時,可以基於NumPy的廣播功能輕鬆實現。

在這裏插入圖片描述
圖1-12 卷積運算的處理流(追加了偏置項)

3.6 批處理

神經網絡的處理中進行了將輸入數據打包的批處理。之前的全連接神經網絡的實現也對應了批處理,通過批處理,能夠實現處理的高效化和學習時對mini-batch 的對應。我們希望卷積運算也同樣對應批處理。爲此,需要將在各層間傳遞的數據保存爲4 維數據。具體地講,就是按(batch_num, channel, height, width)的順序保存數據。比如,將圖1-12 中的處理改成對N個數據進行批處理時,數據的形狀如圖1-13 所示。圖1-13 的批處理版的數據流中,在各個數據的開頭添加了批用的維度。像這樣,數據作爲4 維的形狀在各層間傳遞。這裏需要注意的是,網絡間傳遞的是4 維數據,對這N個數據進行了卷積運算。也就是說,批處理將N次的處理彙總成了1 次進行。

在這裏插入圖片描述
圖1-13 卷積運算的處理流(批處理)

4、池化層

池化是縮小高、長方向上的空間的運算。比如,如圖1-14 所示,進行將2 × 2 的區域集約成1 個元素的處理,縮小空間大小。
在這裏插入圖片描述
圖1-14 Max池化的處理順序

圖1-14 的例子是按步幅2 進行2 × 2 的Max池化時的處理順序。“Max池化”是獲取最大值的運算,“2 × 2”表示目標區域的大小。如圖所示,從2 × 2 的區域中取出最大的元素。此外,這個例子中將步幅設爲了2,所以2 × 2 的窗口的移動間隔爲2 個元素。另外,一般來說,池化的窗口大小會和步幅設定成相同的值。比如,3 × 3 的窗口的步幅會設爲3,4 × 4 的窗口的步幅會設爲4 等。

除了Max 池化之外,還有Average 池化等。相對於Max 池化是從目標區域中取出最大值,Average 池化則是計算目標區域的平均值。在圖像識別領域,主要使用Max 池化。因此,本書中說到“池化層”時,指的是Max 池化。

池化層的特徵

沒有要學習的參數 池化層和卷積層不同,沒有要學習的參數。池化只是從目標區域中取最大值(或者平均值),所以不存在要學習的參數。
通道數不發生變化 經過池化運算,輸入數據和輸出數據的通道數不會發生變化。

參考資料

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