卷積神經網絡CNN的意義

1、選用卷積的緣由

  • 局部感知

簡單來講,卷積核的大小通常小於輸入圖像的大小(若是等於則是全鏈接),所以卷積提取出的特徵會更多地關注局部 —— 這很符合平常咱們接觸到的圖像處理。而每一個神經元其實沒有必要對全局圖像進行感知,只須要對局部進行感知,而後在更高層將局部的信息綜合起來就獲得了全局的信息網絡

  • 參數共享

參數共享最大的做用莫過於很大限度地減小運算量了。ide

  • 多核

通常咱們都不會只用一個卷積覈對輸入圖像進行過濾,由於一個核的參數是固定的,其提取的特徵也會單一化。這就有點像是咱們平時如何客觀看待事物,必需要從多個角度分析事物,這樣才能儘量地避免對該事物產生偏見。咱們也須要多個卷積覈對輸入圖像進行卷積。spa

2、卷積神經網絡中的參數計算

舉例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 的意義,主要有兩點:

  1. 其中一個顯而易見,就是減小參數。經過對 Feature Map 降維,有效減小後續層須要的參數。
  2. 另外一個則是 Translation Invariance。它表示對於 Input,當其中像素在鄰域發生微小位移時,Pooling Layer 的輸出是不變的。這就使網絡的魯棒性加強了,有必定抗擾動的做用。

參考:

斯坦福大學CS231N課程PPT

http://cs231n.stanford.edu/slides/2016/winter1516_lecture7.pdf

3、邊界填充問題

卷積操做有兩個問題: 
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爲向上取整。

 


 待完善

相關文章
相關標籤/搜索