【深度學習】卷積神經網路CNN基本知識點
卷積神經網路與前面學的常規神經網路很相似,也有輸入、權重、偏差、損失函式、啟用函式、全連線層等概念,之前的一些小的技巧也仍然適用。
與常規神經網路的對比
卷積神經網路(Convolutional Neural Networks,CNNs / ConvNets)明確的假設輸入inputs為影象,這使得ConvNets需要前向傳播更加高效的執行,同時要大幅度的減小網路中的引數數量。
常規神經網路:接收一個輸入(inputs,單一的向量),通過若干隱藏層(hidden layers)向前傳播,每個隱藏層由一系列的神經元(neurons)組成,層與層之間所有神經元全連線(fully connected),最後一個全連線層(fully-connected layer)稱為“輸出層”(output layer),在分類任務中被設定為輸出每一類的得分(即概率)。
舉個例子:
在 CIFAR-10 中,影象尺寸為32x32x3(32寬,32高,3個顏色通道RGB)。常規神經網路隱藏層的第一層中,就算只有一個全連線神經元,就有 32x32x3=3072 個權重(weights),而我們通常希望有多個神經元,而且實際輸入的影象遠不止這個尺寸。
因此,全連線將會非常浪費,而且巨大的引數空間將會快速的導致過擬合。
ConvNet 概念
卷積神經網路,一層將會有3個維度:寬 width,高 height, 深 depth(這個深度不是整個網路的深度)。
ConvNet層與層之間的數值傳遞是通過 filters
(濾波器,或者叫 kernel
- 高度 height 和寬度 width :一般會選3或5,input維度大時會選大一點;
- 深度 depth 與 input 的維度相同。
- 步長 strides,指 filters 每一步滑動的間隔。
CNN 的第一步是把圖片分成小塊。我們通過選取一個給定寬度和高度的濾波器來實現這一步。濾波器會照在圖片的小塊 patch (影象區塊)上。這些 patch 的大小與濾波器一樣大。
上面這副動圖表現了 filter 在滑過整個圖片時輸出值的計算方法,可以看到,每個patch中的權重是不變的,只有在增加深度 height 時,權重和偏置項的數量才會增加,這就是引數共享
引數共享讓權重和偏置項在 filter 滑動過程中保持不變,當我們試圖識別一個貓的圖片的時候,無論是左上角,右下角, CNNs 能夠無差別的識別。
同時,引數共享避免了過多的引數,有利於規模化。
ConvNet 引數計算
- 輸入資料 input
- W1 x H1 x D1
- filters 數目:K (為了計算方便快速,一般選擇2的指數)
- filters 尺寸:F (一般選擇奇數,eg. 3x3,5x5)
- 步長 strides:S
- 零填充 zero-padding:P
TensorFlow裡面的padding分為“valid”和“same”。
- “same”計算方法:W2 = ceil(W1 / S)
- “valid”計算方法:W2 = ceil((W1 - F + 1) / S)
輸出資料 output
- W2 x H2 x D2
- W2 = (W1 - F + 2P) / S + 1
- H2 = (H1 - F + 2P) / S + 1
- D2 = K
權重 weights
- 每個 filter 的權重個數: F x F x D
- 總的權重為:F x F x D x K
偏差 bias
- K
因為引數共享,卷積層引數的個數為 (F x F x D + 1) x K
。
優化方法
- 池化 pooling
- 1 x 1 卷積
- inception 架構
池化
降低影象取樣率的有效方法。能降低空間維度,減少資料量,避免過擬合。
一般分為最大池化(max-pooling)和平均池化(mean-pooling).
- max-pooling:不增加引數的數量,通常能提高準確率,但是需要更多的計算量,更多的超引數(pooling size, pooling stride)
- mean-pooling:類似於提供了下層特徵圖的低分辨檢視。
1 x 1 filter
使模型變得更深的低耗高效的方法,並未改變神經網路的結構,但是計算很簡單。
傳統卷積執行在小的影象上,僅僅是線性分類器,加1個 1 x 1 卷積就是執行在一個影象上的神經網路代替了線性分類器。
inception模組
將多個不同尺寸的 filters 自由組合,每一個深度上面用不同的filter,輸出連成一串。
模型中引數的總數可能非常少,但是效能比簡單的卷積好。
模型結構
INPUT -> [[CONV -> RELU] * N -> POOL?] * M -> [FC -> RELU] * K -> FC
- * 代表重複多少次
POOL?
代表可選- 通常0 <= N <= 3, M >= 0, 0 <= K < 3
- INPUT -> FC, 線性分類器,這裡 N = M = K = 0.
- INPUT -> CONV -> RELU -> FC
- INPUT -> [CONV -> RELU -> POOL]*2 -> FC -> RELU -> FC. 每一個卷積層對應一個池化層
- INPUT -> [CONV -> RELU -> CONV -> RELU -> POOL]*3 -> [FC -> RELU]*2 -> FC 每兩個卷積層對應一個池化層,對於大而深的網路,這是一個好主意, 因為在池化操作降取樣之前,多個卷積層能探索到更加複雜的特徵。
下面是一些經典模型結構,後面的數字代表年份和月份: