[CNN] What is Convolutional Neural Network


Ref: 從LeNet-5看卷積神經網絡CNNs

關於這篇論文的一些博文的QAC:

 

1. 基本原理

MLP(Multilayer Perceptron,多層感知器)是一種前向神經網絡(如下圖所示),相鄰兩層網絡之間全連接。 

sigmoid通常使用tanh函數和logistic函數。

1998年Yann LeCun在論文“Gradient-Based Learning Applied to Document Recognition”中提出了LeNet-5,並在字母識別中取得了很好的效果。LeNet-5的結構如下圖所示:

 

LeNet5

 

  • input:輸入圖片,32*32像素;
  • C1:5*5卷積核,生成6個feature maps,共需要(6*5*5 + 6)=156個參數;
  • S2:2*2個像素相加,然后乘以一個參數,加上一個偏置,共計2*6=12個參數;
  • C3:5*5卷積核,生成16個feature maps,每個feature map由S2中若干個feature maps卷積得到,如圖Table1所示;
  • S4:和S2相同的操作,共計16*2 = 32個參數;
  • C5:與S4全連接,共計(5*5*16*120+120)=48120個參數;
  • F6:與C5全連接,共計(120*84+84) = 10164 個參數;
  • output: 與F6全連接。

 

Table1

 

下面開始對各層進行具體分析。

卷積:

        C1/C3/C5這三層都用了卷積操作,學過數字圖像處理的同學一定對這種圖像上的卷積很熟悉,本質上是用一塊權重模板在圖像上的各個區域做加權求和,如下圖所示:

 

卷積

 

圖中黃色的3*3 卷積核從圖像的左上角開始向右或向下移動,對移動過程中覆蓋的區域求加權和。最后得到(5-3+1)*(5-3+1)大小的卷積結果,稱為一個feature map。

        C1: LeNet-5的C1層用6個 5*5卷積核對輸入的32*32圖像進行卷積,每個卷積核對應生成一個(32-5+1)*(32-5+1)的feature map,共計6個feature map。

        C3: C3的過程稍為復雜,C3總共生成了16個feature map,每個feature map按照Table1選擇輸入。例如C3編號為0的feature map是由S2中編號為0、1、2的feature map 生成的。先由3個卷積核分別在S2的0、1、2 feature map上生成3個臨時feature map,然后把這三個臨時feature map相加得到C3的feature map 0。這樣構造C3 有兩個好處:一是相比於全連接,可以減少參數的數量;二是每個feature map的輸入都不相同,可以達到互補的效果。

        C5: C5層用全連接的方式,每個feature map都是由S4中所有的feature map卷積結果求和得到的。由於S4的feature map大小是5*5,卷積核大小也是5*5,所以卷積后得到的是一個1*1的矩陣。

        另外,C1/C3/C5每個feature map計算結果都會在計算結尾加上一個偏置。

 

池化pooling:

池化的作用主要有兩個:一是減少參數數量;二是在使模型具有較好的平移不變性。

和卷積很類似,不同之處在於卷積核覆蓋的區域是重疊的,而池化的各個區域是沒有重疊的。所以當S2/S4用2*2的池化模板后,feature map的寬和高都減小為原來的一半。

再借用一下UFLDL Tutorial關於池化的示意圖:

 

.. 池化

 

輸出層:

output層/F6層都是與前一層全連接,C5-F6-output整體結構可以看成一個多層感知器。

所以LeNet-5其實是由三種不同的結構組成的:卷積、池化、多層感知器。而使用這三種結構也就可以構成大部分卷積神經網絡了。

 

卷積:

        目前幾乎所有公開發表的卷積模型都使用全連接結構,即某一層(第m層)的feature map是由上一層(第m-1層)的所有feature map卷積后求和得到的。但是在實際使用中需要注意模型的參數個數,參數個數的增加對計算量的影響很大。

池化:

        目前常用的是平均池化或者最大池化,即把上一層feature map的各個池化區域內的單元值求平均值或最大值。

輸出層:

        可以把最后一層的結果輸出到某個分類器(如Logistic Regression等)進行分類。

 

參考資料:

[1]Yann LeCun, Gradient-Based Learning Applied to Document Recognition, 1998

[2]Theano Deeplearning Tutorial

[3]Stanford UFLDL Tutorial: http://deeplearning.stanford.edu/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B

 

 

2. 邊邊角角問題

(1) 卷積核是學習得來,還是預定義好的?

整個網絡的訓練,主要就是為了學那個卷積核啊。

 

(2) 有哪些參數?

如果是卷積層輸出4個feature map,那么它就有4個卷積核。
自定義的其實有卷積核的 kernel_size,也就是kernel_width和kernel_height,
然后 num_output就是輸出的feature map個數。
還有一個數字其實也跟卷積核有關,這個卷積層的輸入的channel數量.

總的來說,決定卷積層里面卷積核的參數數量的數字總共有4個: num_output, num_channel, kernel_height, kernel_width。


(3) channel是什么?
對一張RGB圖像經過一個卷積核得到的是一張feature map。

原理是這樣的,通常所說的2D卷積其實是3D的(卷積核的維度應該是kernel_height * kernel_height * input_channel),只不過第三個維度恰好等於輸入通道的個數,所以卷了以后在第三個維度上就沒了,變成了扁平的二維feature map,所以叫2D卷積。

另一種理解方式是,一個卷積核的形狀是 kernel_height * kernel_height,並且有input_channel層,把它和輸入圖像做卷積的過程是這樣的:
用卷積核的第一層 和 輸入圖像的第一個通道 做一次2D卷積,
用卷積核的第二層 和 輸入圖像的第二個通道 做一次2D卷積,
……,
用卷積核的最后一層和輸入圖像的最后一個通道做一次2D卷積,
於是得到了input_channel 個 feature map,最后把這input_channel 個 feature map 對應位置加起來,最后得到一張feature map,這就是卷積的結果。

 


 卷積層的參數共享

 

 

卷積核的參數就是神經網絡的輸入層。

Next: [CNN] Understanding Convolution

 


 

 

補充:第九章 - 卷積網絡

卷積運算通過三個重要的思想來幫助改進機器學習系統:

稀疏交互(sparse interactions)、 參數共享(parameter sharing)、 等變表示(equivariant representations)。

 

最大池化:引入了不變性。

無限強的先驗:方差越大,信息越大;在決定參數最終取值時起着更加積極的作用。

也就是限制比較多,例如權重共享這樣的例子,相鄰關系一定強等等。

 

卷積邊緣填充方式

零填充(有效卷積):m-k+1

必要零填充(相同卷積)

全填充:m+k-1

 


免責聲明!

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



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