過程其實就是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。
比如下圖就是一個圖像調整軟體,選不同的濾鏡,對原圖進行卷積,然後抓到圖片上的不同特徵。
因此,不同filter代表一種不同的特徵偵測器,filter對一個image滑動進行卷積的過程,就是在檢驗這個圖上有哪些部分有類似的特徵,如果有的話,那產出的feature map的matrix中的數字,就會有對應較高的數字。
上圖展示左右斜線的特徵,X的特徵的Kernel,對左邊的圖進行卷積,右邊算出Feature map.
三個不同的觀點
下面三個圖,都來自於 CNNs from Different Viewpoints,都是卷積。
第一個圖就是跟我們上面說的類似。
第二個圖,是把這個過程,看成是一個較少連接的neuron network(跟FC比較的話),線的顏色對應到不同希臘字。
第三個圖,是用matrix multiplication去看。這種更可能是實際上的實做。最左邊是很多零的稀疏matrix, 主要是為了運算效率考慮,乘上已經打平的圖片,加上bias。
卷積操作背後的數學
如果第k個filter的結果是如下的11 * 11 的matrix/feature map
把這個matrix的數字加總,稱為這個filter的Degree。
那實際上在做backpropagation中找gradient decent時,我們就是找一組參數可以讓這個a上標k, degree最大(讓特徵feature最明顯)
降低權重數量
在CNN以前,我們只有全連接層之類的變種。以下面這個典型的FC,光光兩層,就(200 * 200)的平方就1.6個 billion的參數,但這種維度的輸入,影像輸入很正常,這樣影像識別幾乎無法做。
因為影像特徵是局部性的,加上卷積,如果Kernel size是 10 * 10, 和10個kernel, 那參數需要學的也只有 (10×10)×10 = 1000而已,因此這種學習成為可行。
Kernels通常不會只有一個
在CNN中,我們不會只有一種濾鏡filter/kernel去對CNN中的輸入去進行卷積,而是會用很多kernels,類似下圖。
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。
卷積層作為維度調整
上圖中,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和卷積的理解了。其實還有很多細節可以看的更深,那就請看倌們移駕下面的參考連接囉!