深度學習三:卷積神經網絡

卷積神經網絡

卷積神經網絡(Convolutional Neural Network,CNN)又叫卷積網絡(Convolutional Network),是一種專門用來處理具備相似網格結構的數據的神經網絡。卷積神經網絡一詞中的卷積是一種特殊的線性運算。卷積網絡是指那些至少在網絡的一層中使用卷積運算來代替通常的矩陣乘法的神經網絡。面試

卷積神經網絡的出現,極大的緩解了全鏈接神經網絡中存在的一個典型的問題:數據的波形被忽視了!衆所周知,全鏈接神經網絡在進行數據輸入的時候,須要將一個二維或者三維的數據展平爲一維的數據。而咱們知道在計算機中圖形是一個三維的數據,由於須要存儲一些相似 RGB 各個通道之間關聯性的空間信息,因此三維形狀中可能隱藏有值得提取的本質模式。而全鏈接展平會致使形狀的忽視。所以須要利用卷積神經網絡來保持形狀的不變。數組

典型應用場景:圖像識別、語音識別等。網絡

典型結構以下圖所示:app

神經網絡中的各層

  • 輸入層(Input Layer):主要是對原始的圖像數據進行預處理
  • 卷積層(Convolution Layers):從前一層提取移位不變特徵。即當輸入數據是圖像的時候,卷積層會以3維數據的形式接收輸入數據,並一樣以3維數據的形式輸出至下一層。所以,在CNN中,能夠(有可能)正確理解圖像等具備形狀的數據。注:卷積層的輸入和輸出數據一般又被稱爲特徵圖(Feature Map)。卷積層的輸入數據稱爲輸入特徵圖(Input Feature Map),輸出數據稱爲輸出特徵圖(Output Feature Map)。
  • 池化層(Pooling Layers):將前一層的多個單元的激活組合爲一個單元。池化是縮小高、長方向上的空間的運算,一般減少一半。
  • 全鏈接層(Fully Connected Layers):收集空間擴散信息
  • 輸出層(Output Layer):選擇類

卷積操做

卷積運算至關於圖像處理中的「濾波器運算」。卷積運算會對輸入數據應用濾波器(Filter)函數

假設,一個初始的圖像大小爲 \(J*K\), 同時有 \(L\) 個管道,以下圖所示:學習

咱們應用一個 \(M*N\) 大小的濾波器。圖中綠色的格子就是一個 3*3 的濾波器。卷積運算的整個操做爲:將各個位置上濾波器的元素和輸入的對應元素相乘,而後再求和(整個操做也被稱爲乘積累加運算),而後,將這個結果保存到輸出的對應位置。spa

將計算過程公式化,公式以下:3d

\[Z_{j,k} = b + \sum_{m=0}^{M-1}\sum_{n=0}^{N-1}K_{m,n}V_{j+m,k+n} \]

其中 \(K_{m,n}\) 表示濾波器的 \(m,n\) 位置的數據,\(V_{j+m,k+n}\) 表示圖像的 \(j+m,k+n\) 位置的數據,\(b\) 是偏置項。orm

將計算過程圖像化,以下圖所示:blog

其中,濾波器的參數就是權重(Weights),同時還有有個偏置項(Bias),這個偏置項會被加到濾波器最後的輸出上。

權重共享

咱們能夠根據上圖看到,對一層中的每個 \(M×N\) 塊輸入應用相同的權值,計算卷積層中的下一個隱藏單元,這就是個權重共享(Weight Sharing)的概念。

填充

填充(Padding):在進行卷積操做以前,有時候要向周圍填入固定的數據,好比用數值 0 進行填充,也叫零填充(Zero Padding)

應用填充以後,卷積層的輸出大小將會和卷積以前的層同樣,如圖所示,其中粉色的 6 * 7 的格子是原始的圖像尺寸,咱們在周圍加上一圈數值爲 0 的格子,用白色表示:

以步幅 1 進行卷積,以下圖所示:

最終咱們獲得了一個大小爲 6 * 7 的藍色的卷積層,和原始圖像的尺寸相同,以下圖所示:

這主要也是爲了不卷積過程當中過一個典型的問題:若是每次驚醒卷積運算都會縮小空間,那麼在某個時刻輸出大小就有可能變成 1,致使沒法再應用卷積運算。爲了不這個狀況的出現,就須要使用填充。

步幅

步幅(Stribe):應用濾波器間隔的位置稱爲步幅。在上面的例子中,採用的步幅爲 1。

咱們能夠將步幅改成 2,那麼卷積過程就會變成下圖所示的:

能夠看到應用濾波器的窗口的間隔變成了 2 個元素,以下圖所示:

最終,新的一層的尺寸變爲一個 3 * 4 的層。用公式表示爲(設步長爲\(s\)):

\[(1+\frac{(J-M)}{s}), (1+\frac{(K-N)}{s}) \]

3 維數據的卷積運算

在一開始,雖然咱們假設了一個初始的圖像大小爲 \(J*K\), 同時有 \(L\) 個管道。可是咱們討論的卷積操做一直只在單層上進行的,下面咱們就討論一下在 3 維狀況下的卷積運算。

當在通道方向上有多個特徵圖的時候,會按照通道進行輸入數據濾波器的卷積運算,並將結果相加,從而獲得輸出。計算步驟以下圖所示:

至此,咱們的公式能夠總結爲:

\[Z^i_{j,k} = b^i + \sum_l\sum_{m=0}^{M-1}\sum_{n=0}^{N-1}K^i_{m,n}V^l_{j+m,k+n} \]

其中 \(K^i_{m,n}\) 表示第 \(i\) 個濾波器的 \(m,n\) 位置的數據,\(V^l_{j+m,k+n}\) 表示圖像第 \(l\) 層通道的 \(j+m,k+n\) 位置的數據,\(b^i\) 是第 \(i\) 個偏置項。根據以前的權重共享的概念,咱們能夠知道,每一層通道是共用一個濾波器的相同權重的,一樣也共用相同的偏置。

池化

池化(Pooling)是縮小高、長方向上的空間的運算。

最典型的池化過程叫作最大池化(Max Pooling),以下圖所示,這是一個單層的池化:

圖中所示的步驟是,咱們劃定一個 \(2 * 2\) 的窗口,找出這個窗口中最大的那個值,做爲下一層的數據,這個窗口以步幅 2 進行移動。通常來講,池化的窗口大小會和步幅設定成相同的值。

除了 Max Pooling 以外,還有 Average Pooling/Mean Pooling,即平均池化,是計算目標區域的平均值。在圖像識別領域中,主要使用 Max Pooling。

重疊池化

重疊池化(Overlapping Pooling)是 AlexNet 中的一個概念。Overlapping Pooling 的概念和 No-Overlapping Pooling的概念相對。

  • Overlapping Pooling:當步幅大於窗口寬度,會使池化窗口產生重疊區域。能夠提高預測精度、緩解過擬合。
  • No-Overlapping Pooling:步幅和窗口寬度相同,池化窗口沒有重疊區域。如上圖的展現。又叫通常池化,General Pooling

池化層的特徵

  • 沒有要學習的參數:池化層和卷積層不一樣,沒有要學習的參數。池化層只是從目標區域中取最大值或平均值。
  • 通道數不發生變化:通過池化運算,輸入數據和輸出數據的通道數不會發生變化。即計算是按照通道獨立進行的。
  • 對微小的位置變化具備魯棒性(健壯):輸入數據發生微小誤差時,池化仍會返回相同的結果。

典型的CNN

LeNet

LeNet 是在 1998 年提出的進行手寫數字識別的網絡。具備連續的卷積層和池化層(準確的講是隻抽取元素的子採樣層),最後經全鏈接層輸出結果。基本結構以下:

  • C1:第一個卷積層的 5×5 的窗口從原始的 32×32 的圖像中提取出 28×28 的特徵數組。
  • S2:而後再進行子抽樣,將其大小減半爲14×14。
  • C3:第二個卷積層使用另外一個 5×5 的窗口提取一個 10×10 的特徵數組。
  • S4:第二個子採樣層將其簡化爲 5×5。
  • C五、F6:這些激活而後經過兩個全鏈接層進入對應數字 ‘0’ 到 ‘9’ 的10個輸出單元。

和如今的 CNN 相比,LeNet 有幾個不一樣點

  • 激活函數:LeNet中使用 Sigmoid 函數,而如今的 CNN 中主要使用 ReLU 函數。
  • 池化/子採樣:LeNet 中使用子採樣縮小中間數據的大小,而如今的 CNN 中 Max Pooling 是主流。

AlexNet

AlexNet 是一個引起深度學習熱潮的導火索。基本結構以下:

AlexNet 疊有多個卷積層和池化層,最後經由全鏈接層輸出:

  • 5 個卷積層和 3 個全鏈接層
  • 利用重疊步幅的最大池化層
  • 1000 個類的 Softmax
  • 兩個只在特定層進行交互的 GPU。上圖中就是利用了兩個 GPU,在第二個 Max Pooling 層進行交互,一直到最後進行輸出兩個 GPU 一直是在並行運算。

AlexNet 雖然在結構上和 LeNet 沒有很大的不一樣,可是也有一些細節上的差別

  • AlexNet 的激活函數使用的是 ReLU
  • 使用進行局部正規化的 LRN(Local Response Normalization)層
  • 使用 Dropout

面試常見問題

  • 神經網絡中的權重共享是什麼?

  • \(1 * 1\) 卷積的做用

  • 卷積層和池化層有什麼區別

  • LeNet-5 結構

  • AlexNet 結構

相關文章
相關標籤/搜索