昨天立下flag,要開始學習深度學習,深度學習中十分重要的就是卷積神經網絡,顧名思義,卷積神經網絡中一定會用到卷積。喵哥在博友的一篇博文中看到卷積運算用於圖像邊緣檢測的應用實例,博友十分細心的在截圖上做了卷積的運算過程,手動點贊。喵哥最近在看傅里葉變換(連續),對卷積還算記得起一點,但是對圖像這種矩陣的卷積運算,的確是沒有太多影響,本科學的圖像處理的課程真是全部還給老師了。本着勤奮好學的理念,在網上搜了幾篇關於矩陣卷積運算的介紹,收穫頗豐。但是在看教程時也發現一些小錯誤和容易引起誤會的地方,所以寫下這篇博文作爲一個日後複習的好去處。
設有矩陣A,B,兩者之間的卷積結果可以用公式:
表示。以上公式表示的是從0開始計數,這不同於MATLAB的從1開始計數,所以公式與MATLAB提供的卷積公式稍有形式上的差異。同一維的數據卷積一樣——把卷積模板翻轉180°,然後從上至下,從左到右滑動模板,然後計算模板與原始圖像交集元素的乘積和,得到的即是卷積後的數值。
假設B是模板,A是原始圖像,那麼用一組矩形相交關係來表示A,B移動的狀態。
這些相交方式的一些集合就構成了各種卷積定義的運算模式。在MATLAB中有三種二維的矩陣卷積定義:valid、same和full。MATLAB對他們的解釋爲:
'valid'
Returns only those parts of the convolution that are computed without the zero-padded edges. Using this option, size(C) = max([ma-max(0,mb-1),na-max(0,nb-1)],0).
'same'
Returns the central part of the convolution of the same size as A.
'full'
Returns the full two-dimensional convolution (default).
假設,。
在計算卷積A*B時,需要先把B做翻轉,得到
,然後把這個翻轉的矩陣在大矩陣A中移動。
valid型卷積
valid類型的卷積只考慮B包含於A的情況(即情況5),在矩陣A外圍完全不需要補0。若B移動的步長是1,最終的卷積結果的矩陣大小爲nc(A) - nc(B) + 1,nc(A),nc(B)分別爲A,B矩陣的邊長。
1*9 | 2*8 | 3*7 | 4 | 5 | 6 |
2*6 | 3*5 | 4*4 | 5 | 6 | 7 |
3*3 | 4*2 | 5*1 | 6 | 7 | 8 |
4 | 5 | 6 | 7 | 8 | 9 |
5 | 6 | 7 | 8 | 9 | 10 |
6 | 7 | 8 | 9 | 10 | 11 |
第一個重疊區域的乘積計算,得到的值是111,依次計算得到的卷積矩陣爲
same型卷積
這個類型的卷積在valid的基礎上,還要包含小矩陣交於大矩陣的右邊緣、下邊緣以及右下角重疊的情況(7,9,10)。給A矩陣的右邊緣和下邊緣補0,這樣計算出卷積的矩陣與矩陣A的大小一致。
full型卷積
這是包含所有重疊情況的卷積類型,即除了第一種分離狀態的所有情況,需要在A矩陣四周補0。這樣得出的卷積矩陣比A矩陣長2個元素。