卷積神經網絡CNN的意義


一、選用卷積的原因

  • 局部感知

簡單來說,卷積核的大小一般小於輸入圖像的大小(如果等於則是全連接),因此卷積提取出的特征會更多地關注局部 —— 這很符合日常我們接觸到的圖像處理。而每個神經元其實沒有必要對全局圖像進行感知,只需要對局部進行感知,然后在更高層將局部的信息綜合起來就得到了全局的信息

  • 參數共享

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

  • 多核

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

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

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

  1. 其中一個顯而易見,就是減少參數。通過對 Feature Map 降維,有效減少后續層需要的參數。
  2. 另一個則是 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為向上取整。

 


 待完善

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM