01 卷積
卷積是指在滑動中提取特征的程序,可以形象地理解為用放大鏡把每步都放大并且拍下來,再把拍下來的圖片拼接成一個新的大圖片的程序,
2D卷積是一個相當簡單的操作:
我們先從一個小小的權重矩陣,也就是 卷積核(kernel) 開始,讓它逐步在二維輸入資料上“掃描”,卷積核“滑動”的同時,計算權重矩陣和掃描所得的資料矩陣的乘積,然后把結果匯總成一個輸出像素,
也就是說,【卷積操作后得到的矩陣中的每個元素】都是由兩個矩陣乘積得來的
——這兩個矩陣分別是【原矩陣在滑動過中分割出來的“大小等同于卷積核”的矩陣】和【卷積核(卷積核一般是一個3×3或者5×5的矩陣)】

卷積核會在其經過的所有位置上都重復以上操作,直到把輸入特征矩陣轉換為另一個二維的特征矩陣,
簡而言之,輸出的特征基本上就是原輸入特征的加權和(權重是卷積核自帶的值),而從像素位置上看,它們所處的地方大致相同,
那么為什么輸出特征的會落入這個“大致區域”呢?這取決于卷積核的大小,卷積核的大小直接決定了在生成輸出特征時,它合并了多少輸入特征,也就是說:卷積核越小,輸入輸出的位置越接近;卷積核越大,距離就越遠,
卷積的計算程序可以參考下面這張圖:

02 填充Padding
邊緣上的像素永遠不會位于卷積核中心,而卷積核也沒法擴展到邊緣區域以外,所以輸入影像的邊緣被“修剪”掉了,
這是不理想的,通常我們都希望輸入和輸出的大小應該保持一致,
Padding就是針對這個問題提出的一個解決方案:它會用額外的“假”像素填充邊緣(值一般為0),這樣,當卷積核掃描輸入資料時,它能延伸到邊緣以外的偽像素,從而使輸出和輸入大小相同,
如下圖為一個卷積核為3×3、有padding、Stride為1時的卷積程序:

03 步幅Stride
如果說Padding的作用是使輸出與輸入同高寬,那么在卷積層中,有時我們會需要一個尺寸小于輸入的輸出,那這該怎么辦呢?這其實是卷積神經網路中的一種常見應用,當通道數量增加時,我們需要降低特征空間維度,實作這一目標有兩種方法,一是使用池化層,二是使用Stride(步幅)
如下圖為一個卷積核為3×3、有padding、Stride為2時的卷積程序:

Stride為2的卷積計算程序可以參考下面這張圖:

滑動卷積核時,我們會先從輸入的左上角開始,每次往左滑動一列或者往下滑動一行逐一計算輸出,我們將每次滑動的行數和列數稱為Stride,
Stride的作用是成倍縮小尺寸,而這個引數的值就是縮小的具體倍數,比如步幅為2,輸出就是輸入的1/2;步幅為3,輸出就是輸入的1/3,以此類推,
在一些目前比較先進的網路架構中,如ResNet,它們都選擇使用較少的池化層,在有縮小輸出需要時選擇步幅卷積,
04 卷積核的選擇
卷積是為了提取特征,選擇不同的卷積核將會提取到不同的特征,
舉幾個例子(參考鏈接):
| 卷積核名稱 | 卷積核形式 | 效果 |
|---|---|---|
| 原圖 | – | ![]() |
| – | 0,1,2 2,2,0 0,1,2 | ![]() |
| 垂直邊緣檢測 | 1,0,-1 1,0,-1 1,0,-1 | ![]() |
| 水平邊緣檢測 | 1,1,1 0,0,0 -1,-1,-1 | ![]() |
05 多通道卷積
上述例子都只包含一個輸入通道,實際上,大多數輸入影像都有3個RGB通道,而通道數的增加意味著網路深度的增加,
這里就要涉及到“卷積核”和“filter”這兩個術語的區別,在只有一個通道的情況下,“卷積核”就相當于“filter”,這兩個概念是可以互換的;但在一般情況下,它們是兩個完全不同的概念,每個“filter”實際上恰好是“卷積核”的一個集合,在當前層,每個通道都對應一個卷積核,且這個卷積核是獨一無二的,

參考
-
絕妙可視化:什么是深度學習的卷積?https://zhuanlan.zhihu.com/p/42090228
-
手寫代碼實作卷積操作(Python):https://blog.csdn.net/qq_41398808/article/details/97925070
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298870.html
標籤:AI




