(深度學習)卷積神經網路 Convolution Neural Network, CNN)

Ben Hu
9 min readFeb 1, 2020

--

CNN學習心得

https://en.wikipedia.org/wiki/Convolutional_neural_network

什麼是卷積?

直觀來說,就是這個動畫。

(圖片取自 : [ 機器學習 ML NOTE ] Convolution Neural Network 卷積神經網路)

把一個小matrix(那些乘於多少的小紅字可以組成一個matrix)乘上綠色大matrix後,得到右邊那個粉色的結果(Convolved Feature,又叫feature map),結果也是一個matrix。然後小matrix持續往右移持續這個步驟,右移到底後,往下移,直到整個綠色matrix的數字都有被運算到。

過程其實就是Kernel matrix 與image進行element-wise multiplication

右移多少?這邊是1, 但這個數字可以調整,叫做步數,Stride.

Stride加大,輸出matrix/feature map就會縮小。

另外我們可以在綠色matrix的四周補零,這叫做padding,如果想要控制輸出matrix/feature map的大小,可以控制padding的大小。

一個補零例子

專有名詞

上圖中的imge可以是一開始的輸入層,而所謂的卷積,就用另一個matrix(叫做 Kernel or Filter)遍歷輸入層所得到的另一個matrix(叫做feature map)的操作。

以前使用Photoshop中的濾鏡,就是一種數學上的卷積操作,所以叫做Filter。不同的filter, 其實就是不同的matrix。

比如下圖就是一個圖像調整軟體,選不同的濾鏡,對原圖進行卷積,然後抓到圖片上的不同特徵。

source: http://csharphelper.com/blog/2014/09/use-image-filters-to-perform-edge-detection-smoothing-embossing-and-more-in-c/

因此,不同filter代表一種不同的特徵偵測器,filter對一個image滑動進行卷積的過程,就是在檢驗這個圖上有哪些部分有類似的特徵,如果有的話,那產出的feature map的matrix中的數字,就會有對應較高的數字。

https://www.youtube.com/watch?v=FmpDIaiMIeA

上圖展示左右斜線的特徵,X的特徵的Kernel,對左邊的圖進行卷積,右邊算出Feature map.

三個不同的觀點

下面三個圖,都來自於 CNNs from Different Viewpoints,都是卷積。

第一個圖就是跟我們上面說的類似。

第二個圖,是把這個過程,看成是一個較少連接的neuron network(跟FC比較的話),線的顏色對應到不同希臘字。

第三個圖,是用matrix multiplication去看。這種更可能是實際上的實做。最左邊是很多零的稀疏matrix, 主要是為了運算效率考慮,乘上已經打平的圖片,加上bias。

卷積操作背後的數學

如果第k個filter的結果是如下的11 * 11 的matrix/feature map

李宏毅 Machine Learning (2017) 第十講 : Convolution Neural Network ( CNN )

把這個matrix的數字加總,稱為這個filter的Degree。

那實際上在做backpropagation中找gradient decent時,我們就是找一組參數可以讓這個a上標k, degree最大(讓特徵feature最明顯)

降低權重數量

在CNN以前,我們只有全連接層之類的變種。以下面這個典型的FC,光光兩層,就(200 * 200)的平方就1.6個 billion的參數,但這種維度的輸入,影像輸入很正常,這樣影像識別幾乎無法做。

Marc’Aurelio Ranzato, “Deep Learning Lecture 6”, Microsoft AI Research

因為影像特徵是局部性的,加上卷積,如果Kernel size是 10 * 10, 和10個kernel, 那參數需要學的也只有 (10×10)×10 = 1000而已,因此這種學習成為可行。

Marc’Aurelio Ranzato, “Deep Learning Lecture 6”, Microsoft AI Research

Kernels通常不會只有一個

在CNN中,我們不會只有一種濾鏡filter/kernel去對CNN中的輸入去進行卷積,而是會用很多kernels,類似下圖。

( source: 卷積神經網路(Convolutional neural network, CNN): 1×1卷積計算在做什麼 )

Conv1的輸入是4 * 4 * 3(就是width =4, height =4, 和RGB 3個通道,實際上width和hight不會那麼小)

上圖就用到兩個kernel, 分別是3 * 3 的matrix。

4 * 4 * 3 經過兩個Kernel後,變成兩組 4 * 4 * 3。

然後卷積層的最後一步會加總(取平均,取max等),這是pooling layer(池化層),那就會變成 4 * 4 * 2 , 2 是兩個kernel。

整個過程,可以看成經過兩個濾鏡,輸出兩個feature map。

那Conv2, 就是經過三個Kernel 輸出三個feature map.

一點題外話

其實寫到這邊的感覺,就是學習不同專有名詞。每個專有名詞都有其脈絡下的意義,那就多看點文章,慢慢就可以搞懂。

譬如,輸出會叫做feature map, 是因為學到的是圖像的特徵,也因此有人把filter/kernel叫做feature detector

Filter相對直觀,畢竟這個作法就一直用在影像處理上的濾鏡。而在Kernel也是在影像處理上對於那些小matrix的稱呼,而卷積是數學的說法。

總之,如果回到各自的領域,可能會出現一點歧義,但在CNN的脈絡下,kernel = filter = feature detector = convolution operation。

卷積層作為維度調整

Source: 卷積神經網路(Convolutional neural network, CNN): 1×1卷積計算在做什麼

上圖中,Conv1是6個Kernel, Conv2是2個Kernel, 因為pooling層的關係,輸出的維度也因此調整。因此卷積也有調整維度這個功能。譬如我們可以用 1 個 Kernel 來降維,那為何要降維?降維就降低要學的參數,來提高模型抗過擬和的問題(avoid over-fit)。

下圖是另一種表示法,把Channel給疊起來。顯示一個5維的4*4 matrix,經過一個三個1*1 的Kernel變成三維(三個 4 * 4 matrix/feature map)

經典的CNN模型

基本上,一個CNN模型,會由上面提到的卷積層 和 Pooling層,最後會把維度打平後,進入全連接層FC,最後再透過softmax層輸出對應的類別機率。

其中的卷積block, 就是下圖的的卷積 layer + Max Pooling layer是一個經典的例子。 但其實隨著深度學習的快速發展,也有很多variations囉。

以上,就是一些有關CNN和卷積的理解了。其實還有很多細節可以看的更深,那就請看倌們移駕下面的參考連接囉!

--

--

Ben Hu

What I cannot create, I do not understand — Richard Feynman