1. 程式人生 > >【深度學習】卷積神經網路CNN基本知識點

【深度學習】卷積神經網路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(這個深度不是整個網路的深度)。

Left: A regular 3-layer Neural Network. Right: A ConvNet arranges its neurons in three dimensions (width, height, depth)

ConvNet層與層之間的數值傳遞是通過 filters (濾波器,或者叫 kernel

卷積核)進行的,filters有3個引數(height,width,depth):

  • 高度 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 每兩個卷積層對應一個池化層,對於大而深的網路,這是一個好主意, 因為在池化操作降取樣之前,多個卷積層能探索到更加複雜的特徵。

下面是一些經典模型結構,後面的數字代表年份和月份: