一、選用卷積的原因
-
局部感知
簡單來說,卷積核的大小一般小於輸入圖像的大小(如果等於則是全連接),因此卷積提取出的特征會更多地關注局部 —— 這很符合日常我們接觸到的圖像處理。而每個神經元其實沒有必要對全局圖像進行感知,只需要對局部進行感知,然后在更高層將局部的信息綜合起來就得到了全局的信息。
-
參數共享
參數共享最大的作用莫過於很大限度地減少運算量了。
-
多核
一般我們都不會只用一個卷積核對輸入圖像進行過濾,因為一個核的參數是固定的,其提取的特征也會單一化。這就有點像是我們平時如何客觀看待事物,必須要從多個角度分析事物,這樣才能盡可能地避免對該事物產生偏見。我們也需要多個卷積核對輸入圖像進行卷積。
二、卷積神經網絡中的參數計算
舉例1:
比如輸入是一個32x32x3的圖像,3表示RGB三通道,每個filter/kernel是5x5x3,一個卷積核產生一個feature map,下圖中,有6個5x5x3的卷積核,故輸出6個feature map(activation map),大小即為28x28x6。
下圖中,第二層到第三層,其中每個卷積核大小為5x5x6,這里的6就是28x28x6中的6,兩者需要相同,即每個卷積核的“層數”需要與輸入的“層數”一致。有幾個卷積核,就輸出幾個feature map,下圖中,與第二層作卷積的卷積核有10個,故輸出的第三層有10個通道。
舉例2:
NxN大小的輸入(暫時不考慮通道數),與FxF大小的卷積核(暫時不考慮個數)做卷積,那么輸出大小為多大?計算公式為:(N - F) / stride + 1,其中stride為做卷積是相鄰卷積核的距離。
舉例3:
當輸入為7x7大小,卷積核為3x3,stride=1,在7x7周圍補上一圈0(pad=1個像素),那么輸出大小為多大?
是7x7。
舉例3:
輸入為32x32x3,卷積核大小為5x5,總共有10個卷積核,做卷積的時候stride=1,pad=2,那么這一層總共含有多少參數?
每個卷積核含有的參數個數為:5*5*3 + 1 = 76,其中1是偏置bias,由於有10個卷積核,故總參數為76*10=760。
總結:
其中,卷積核的數量K一般是2的整數次冪,這是因為計算方便(計算機計算2^n比較快)
關於池化層的參數計算:
Pooling 的意義,主要有兩點:
- 其中一個顯而易見,就是減少參數。通過對 Feature Map 降維,有效減少后續層需要的參數。
- 另一個則是 Translation Invariance。它表示對於 Input,當其中像素在鄰域發生微小位移時,Pooling Layer 的輸出是不變的。這就使網絡的魯棒性增強了,有一定抗擾動的作用。
參考:
斯坦福大學CS231N課程PPT
http://cs231n.stanford.edu/slides/2016/winter1516_lecture7.pdf
三、邊界填充問題
卷積操作有兩個問題:
1. 圖像越來越小;
2. 圖像邊界信息丟失,即有些圖像角落和邊界的信息發揮作用較少。因此需要padding。
卷積核大小通常為奇數
一方面是為了方便same卷積padding對稱填充,左右兩邊對稱補零;
n+2p-f+1=n
p=(f-1)/2
另一方面,奇數過濾器有中心像素,便於確定過濾器的位置。
兩種padding方式:"same"/"valid"
“VALID”只會丟棄最右邊無法掃描到的列(或者最底部無法掃描到的列)。
“SAME”試圖在左右添加padding,但如果列添加的數量是奇數,則將額外的添加到右側(即保持雙數時,左右padding相通,偶數時,右側/底部 比 左側/頂部 多1),在垂直方向同理)。
Tensorflow中的定義
The TensorFlow Convolution example gives an overview about the difference between SAME and VALID : For the SAME padding, the output height and width are computed as: out_height = ceil(float(in_height) / float(strides[1])) out_width = ceil(float(in_width) / float(strides[2])) And For the VALID padding, the output height and width are computed as: out_height = ceil(float(in_height - filter_height + 1) / float(strides1)) out_width = ceil(float(in_width - filter_width + 1) / float(strides[2]))
ceil為向上取整。
待完善