簡單來講,卷積核的大小通常小於輸入圖像的大小(若是等於則是全鏈接),所以卷積提取出的特徵會更多地關注局部 —— 這很符合平常咱們接觸到的圖像處理。而每一個神經元其實沒有必要對全局圖像進行感知,只須要對局部進行感知,而後在更高層將局部的信息綜合起來就獲得了全局的信息。網絡
參數共享最大的做用莫過於很大限度地減小運算量了。ide
通常咱們都不會只用一個卷積覈對輸入圖像進行過濾,由於一個核的參數是固定的,其提取的特徵也會單一化。這就有點像是咱們平時如何客觀看待事物,必需要從多個角度分析事物,這樣才能儘量地避免對該事物產生偏見。咱們也須要多個卷積覈對輸入圖像進行卷積。spa
舉例1:3d
好比輸入是一個32x32x3的圖像,3表示RGB三通道,每一個filter/kernel是5x5x3,一個卷積核產生一個feature map,下圖中,有6個5x5x3的卷積核,故輸出6個feature map(activation map),大小即爲28x28x6。code
下圖中,第二層到第三層,其中每一個卷積核大小爲5x5x6,這裏的6就是28x28x6中的6,二者須要相同,即每一個卷積核的「層數」須要與輸入的「層數」一致。有幾個卷積核,就輸出幾個feature map,下圖中,與第二層做卷積的卷積核有10個,故輸出的第三層有10個通道。blog
舉例2:io
NxN大小的輸入(暫時不考慮通道數),與FxF大小的卷積核(暫時不考慮個數)作卷積,那麼輸出大小爲多大?計算公式爲:(N - F) / stride + 1,其中stride爲作卷積是相鄰卷積核的距離。圖像處理
舉例3:class
當輸入爲7x7大小,卷積核爲3x3,stride=1,在7x7周圍補上一圈0(pad=1個像素),那麼輸出大小爲多大?pdf
是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 的意義,主要有兩點:
參考:
斯坦福大學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
另外一方面,奇數過濾器有中心像素,便於肯定過濾器的位置。
「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爲向上取整。
待完善