卷積神經網路(Convolutional neural network, CNN): 1×1卷積計算在做什麼
2018/08/28修正convolution的流程圖。
卷積神經網路(Convolutional neural network, CNN)其他相關連結我也一起列上來
NN-2–1 卷積神經網路(Convolutional neural network, CNN) — 卷積運算、池化運算
NN-2–2 卷積神經網路(Convolutional neural network, CNN) — CNN運算流程
NN-2–3 卷積神經網路(Convolutional neural network, CNN):卷積計算的倒傳遞推導與稀疏矩陣觀點來看卷積計算
NN-2–4 卷積神經網路(Convolutional neural network, CNN):卷積計算中的步伐(stride)和填充(padding)
NN-2–5 卷積神經網路(Convolutional neural network, CNN): 1×1卷積計算在做什麼
一般API在跑張量(tensor),通常是一個批次量的資料在執行
假設有100筆資料,每個資料都是10*10的彩色圖片(所以每個資料都是3張圖片,分別為R、G、B三張),此時的輸入資料的大小就是100 ×10 ×10 ×3,解讀方式batch ×height × width × channel,這個解讀很重要,因為除了影像的長跟寬之外,又多了兩個分別是batch和channel名詞。
Channel這個名詞非常重要,你也可以解讀為維度(dimension),但又不完全一樣,因為這個東西在卷積計算後的數量是跟你kernel map設定數量有關係,所以很重要,因為等等會扯到1×1的捲積。
廢話不多說我們先看一張圖,下圖為一般的卷積計算,這張圖是讓讀者在複習一下捲積怎麼做channel之間的融合。
本例子假設輸入一張影像(R, G, B)所以有3個channel的4×4影像輸入,在1st卷積層(Conv. 1)設定2個kernel map (3×3×3(上一層的channel數)),所以1st卷積層(Conv. 1)輸出的影像就會有2張,在2nd卷積層(Conv. 2)設定3個kernel map (3×3×2(上一層的channel數)),所以2nd卷積層(Conv. 2)輸出的影像就會有3張。
所以可以知道卷積後的channel數是依據你設定的kernel map數量決定的。
這篇主要是講1×1的捲積在做什麼
如果單讀只看1×1捲積,就只是把輸入的圖裡面的值做放大或是縮小,感覺沒什麼屁用,的確沒什麼用,但1×1捲積真的用途重點不是在作捲積這件事情。
1×1捲積最大的好處是在作降維或是提高維度用
這邊的維度就是前面提到的channel,(1x1捲積是在Network in network中提出的,我們不去提它在這篇文章在做什麼)。
一般看到介紹1×1捲積都用類似這種圖,其實對不太懂的人很不友善,就看到一推立方體但是看不太懂。
1×1卷積實際作法(我自認為比較好理解)如下圖:
所以1×1卷積其實就是作channel之間的合成
然後根據你設定的1×1 kernel map數量(也就是輸出的channel數量),然後輸出一個大小一樣但channel數不同的輸出。
從上例子得知
第一個1×1捲積是提升維度數/提升channel數 (channel從3→6)
原始圖片(4×4×3) → Conv 1 (6個1×1 ×3kernel ) → Conv1輸出圖片(4×4×6) :
第二個1×1捲積是降低維度數/降低channel數 (channel從6→2)
Conv1輸出圖片(4×4×6) → Conv 2 (2個1×1×6 kernel ) → Conv2輸出圖片(4×4×2)
這邊例子你可能沒有什麼感覺,但實際應用可能channel數會到128,此時如果不希望模型繼續大下去就可以用32個1×1捲積做降到32個channel的動作,之後可以在接著用3×3捲積進行特徵萃取的學習。