1. 程式人生 > >卷積和池化

卷積和池化

卷積神經網路(CNN)由輸入層、卷積層、啟用函式、池化層、全連線層組成,即INPUT-CONV-RELU-POOL-FC

(1)卷積層:用它來進行特徵提取,如下:

輸入影象是32*32*3,3是它的深度(即R、G、B),卷積層是一個5*5*3的filter(感受野),這裡注意:感受野的深度必須和輸入影象的深度相同。通過一個filter與輸入影象的卷積可以得到一個28*28*1的特徵圖,上圖是用了兩個filter得到了兩個特徵圖;

我們通常會使用多層卷積層來得到更深層次的特徵圖。如下:

 

關於卷積的過程圖解如下:

 

輸入影象和filter的對應位置元素相乘再求和,最後再加上b,得到特徵圖。如圖中所示,filter w0的第一層深度和輸入影象的藍色方框中對應元素相乘再求和得到0,其他兩個深度得到2,0,則有0+2+0+1=3即圖中右邊特徵圖的第一個元素3.,卷積過後輸入影象的藍色方框再滑動,stride=2,如下:

 

如上圖,完成卷積,得到一個3*3*1的特徵圖;在這裡還要注意一點,即zero pad項,即為影象加上一個邊界,邊界元素均為0.(對原輸入無影響)一般有

F=3 => zero pad with 1

F=5 => zero pad with 2

F=7=> zero pad with 3,邊界寬度是一個經驗值,加上zero pad這一項是為了使輸入影象和卷積後的特徵圖具有相同的維度,如:

輸入為5*5*3,filter為3*3*3,在zero pad 為1,則加上zero pad後的輸入影象為7*7*3,則卷積後的特徵圖大小為5*5*1((7-3)/1+1),與輸入影象一樣;

而關於特徵圖的大小計算方法具體如下:

 

如沒有這個原則,則特徵圖由10個32*32*1的特徵圖組成,即每個特徵圖上有1024個神經元,每個神經元對應輸入影象上一塊5*5*3的區域,即一個神經元和輸入影象的這塊區域有75個連線,即75個權值引數,則共有75*1024*10=768000個權值引數,這是非常複雜的,因此卷積神經網路引入“權值”共享原則,即一個特徵圖上每個神經元對應的75個權值引數被每個神經元共享,這樣則只需75*10=750個權值引數,而每個特徵圖的閾值也共享,即需要10個閾值,則總共需要750+10=760個引數。

補充:

(1)對於多通道影象做1*1卷積,其實就是將輸入影象的每個通道乘以係數後加在一起,即相當於將原圖中本來各個獨立的通道“聯通”在了一起;

 (2)權值共享時,只是在每一個filter上的每一個channel中是共享的;

池化層:對輸入的特徵圖進行壓縮,一方面使特徵圖變小,簡化網路計算複雜度;一方面進行特徵壓縮,提取主要特徵,如下:

池化操作一般有兩種,一種是Avy Pooling,一種是max Pooling,如下:

 

同樣地採用一個2*2的filter,max pooling是在每一個區域中尋找最大值,這裡的stride=2,最終在原特徵圖中提取主要特徵得到右圖。

(Avy pooling現在不怎麼用了(其實就是平均池化層),方法是對每一個2*2的區域元素求和,再除以4,得到主要特徵),而一般的filter取2*2,最大取3*3,stride取2,壓縮為原來的1/4.

注意:這裡的pooling操作是特徵圖縮小,有可能影響網路的準確度,因此可以通過增加特徵圖的深度來彌補(這裡的深度變為原來的2倍)。

全連線層:連線所有的特徵,將輸出值送給分類器(如softmax分類器)。

總的一個結構大致如下

另外:CNN網路中前幾層的卷積層引數量佔比小,計算量佔比大;而後面的全連線層正好相反,大部分CNN網路都具有這個特點。因此我們在進行計算加速優化時,重點放在卷積層;進行引數優化、權值裁剪時,重點放在全連線層。