1. 程式人生 > >卷積神經網路必須知道的幾個概念

卷積神經網路必須知道的幾個概念

1. 卷積(convolution):用它來進行特徵提取

Convolution schematic.gif

用一個 3x3 的濾波器去掃描一個 5x5 的畫素矩陣,用濾波器中每一個元素與畫素矩陣中感受野內的元素進行乘積運算,可得到了一個 3x3 的輸出畫素矩陣,這個輸出的 3x3 畫素矩陣能夠較大程度的提取原始畫素矩陣的影象特徵,這也是卷積神經網路之所以有效的原因。

以輸出畫素矩陣中第一個元素 4 為例,演示一下計算過程:1x1 + 1x0 + 1x1 + 0x0 +1x1 + 1x0 + 0x1 +0x0 + 1x1 = 4

輸入影象是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),與輸入影象一樣;

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

2. ReLU層

ReLu層就是使用ReLU函式對conv層的資料進行一次activation處理的層。小於0的輸入被置為0,大於0的輸入正常輸出。

啟用函式還有這些:

3. 池化(Pooling):使特徵圖變小+提取主要特徵

池化作用於影象中不重合的區域(這與卷積操作不同),過程如下圖。

比如上方左側矩陣A是20*20的矩陣要進行大小為10*10的池化,那麼左側圖中的紅色就是10*10的大小,對應到右側的矩陣,右側每個元素的值,是左側紅色矩陣每個元素的值的和再除以紅色矩陣的元素個數,也就是平均值形式的池化。 

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

池化操作一般有兩種,一種是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。

4. 全連線層(用FC來表示):完成分類任務

連線所有的特徵,將輸出值送給分類器(如softmax分類器)。將上層抽取出來的特徵向量在裡面做一個權重計算,輸出各個類別的概率。

 全連線層需要把輸入拉成一個列項向量,如下圖所示

比如輸入的feature map是2X2,那麼就需要把這個feature map 拉成4X1的列向量,如果feature map 的channels是3,也就是輸入是3X2X2,也就是相當於有了12個畫素點,這時就需要把feature map 拉成12X1的列向量,再乘一個權重,這個權重要把12個畫素點都包含進去,所以這個權重的矩陣形式應該是1X12,所以經過一個全連線層後的輸出就是1X12X12X1=1X1,這時候需要看需要多少個1X1的神經元了,如果是3個的話,那麼輸出就是3X(1X12X12X1)=3X(1X1).這個3在權重矩陣中代表3行,即每一行與輸入相乘,得到一個輸出: 5. 總的一個結構大致如下:

CNN是很多層layer的組合。每一層都通過一個不同的函式將一種activation轉化為另一種。通常使用三種layer:convolutional layer, pooling layer,和fully-connected layer。將這些layer堆積起來成為ConvNet architecture.