CNN(卷積神經網絡)入門


 

參考博文:

深度學習基礎--卷積--1*1的卷積核與全連接的區別:https://blog.csdn.net/wydbyxr/article/details/84061410

如何理解卷積神經網絡中的1*1卷積:https://blog.csdn.net/chaipp0607/article/details/60868689

如何理解卷積神經網絡中的權值共享:https://blog.csdn.net/chaipp0607/article/details/73650759

 

本文概述:

  1. 卷積神經網絡簡介

    1.1 從傳統神經網絡到卷積神經網絡

    1.2 CNN發展歷史

  2. CNN原理

    2.1 數據輸入層(Input layer)(數據預處理)

    2.2 卷積層(卷積+激活) 

      2.1.1 卷積如何計算-卷積核大小(1*1, 3*3, 5*5)

      2.1.2 卷積如何計算-卷積核步長(stride)

      2.1.3 卷積如何計算-卷積核個數

      2.1.4 卷積如何計算-卷積核零填充大小(zero-padding) 

        2.1.5 總結-輸出大小公式(重要)

      2.1.6 激勵層(激活層)

    2.3 池化層(下采樣層)

      2.3.1 池化層計算

    2.4 全連接層

  3. CNN總結

 

 

1、 卷積神經網絡與傳統多層神經網絡對比

  • 傳統意義上的多層神經網絡是只有輸入層、隱藏層、輸出層。其中隱藏層的層數根據需要而定,沒有明確的理論推導來說明到底多少層合適
  • 卷積神經網絡CNN,在原來多層神經網絡的基礎上,加入了更加有效的特征學習部分,具體操作就是在原來的全連接的層前面加入了部分連接的卷積層與池化層。卷積神經網絡出現,使得神經網絡層數得以加深,深度學習才能實現

通常所說的深度學習,一般指的是這些CNN等新的結構以及一些新的方法(比如新的激活函數Relu等),解決了傳統多層神經網絡的一些難以解決的問題

傳統多層神經網絡:

 

卷積神經網絡:

 

 

2、CNN發展歷史

  • 網絡結構加深
  • 加強卷積功能
  • 從分類到檢測
  • 新增功能模塊

2. CNN原理

2.1 數據輸入層(數據預處理)

  有三種常見的數據預處理方法,去均值(demean),歸一化,PCA/白化,對於CNN來說,一般只會做去均值+歸一化,尤其是我們輸入的是圖像數據,我們往往只做去均值,這是為了保持原圖像數據的完整性,避免失真。圖像數據從數學角度來看,就是不同維度的矩陣,經過去均值后,數據的數學特性更好,對稱性更好。在我們用SGD(隨機梯度下降法)進行迭代優化的時候,權重w(偏差b同理)初始化的隨機值對迭代速度和結果沒有影響(如果不demean可能會不收斂或者迭代優化速度慢)。

 

 

   

 

 

2.2 卷積層(卷積+激活)  

概述:卷積神經網絡三個結構

  神經網絡(neural networks)的基本組成包括輸入層、隱藏層、輸出層。而卷積神經網絡的特點在於隱藏層分為卷積層和池化層(pooling layer,又叫下采樣層)以及激活層。每一層的作用

  • 卷積層:通過在原始圖像上平移來提取特征
  • 激活層:增加非線性分割能力
  • 池化層:壓縮數據和參數的量,減小過擬合,降低網絡的復雜度,(最大池化和平均池化)

為了能夠達到分類效果,還會有一個全連接層(FC)也就是最后的輸出層,計算損失進行分類(或回歸)。

   對於卷積層,卷積層(Convolutional layer)卷積神經網絡中每層卷積層由若干卷積單元(卷積核)組成,每個卷積單元的參數都是通過反向傳播算法優化得到的。

卷積運算的目的是提取輸入的不同特征,第一層卷積層可能只能提取一些低級的特征如邊緣、線條和角等層級,更多層的網路能從低級特征中迭代提取更復雜的特征。

   之所以CNN會產生,是因為傳統神經網絡對於輸入的數據X(X視為矩陣)維數太高,如果是一張32x32的灰度圖片,一個神經元的權重w就需要32x32,為了提取足夠豐富的特征,假設需要20個神經元,則權重W(W視為矩陣)的參數個數就是32x32x20=20480個,顯示圖片的維度不可能是32,可能是上千,那么W的個數就很容易到上億,這顯然太大了!所以我們需要一種可以顯著降低計算量的機制,因此CNN孕育而生!

  我們直接來說CNN中最重要的卷積核,什么是卷積核,本質就是一個很小的矩陣,如1*1,3*3,5*5等(這里不討論為啥是這么大,因為我也不知道。。。一般都是大牛經過無數次試驗得來的,我們直接借鑒前輩的勞動成果就好)。卷積核會在原數據(很高維的大矩陣)上移動,其實就是一個個小的矩陣,在比它大很多的矩陣上移動(移動的步長一般是1,即一次移動1步),每次移動,做一次點乘,得到一個數字。該步驟會一直進行直至遍歷完完整的大矩陣(原數據),如下圖。

 

https://blog.csdn.net/chaipp0607/article/details/73650759 (如何理解卷積神經網絡中的權值共享)

這里運用了一種思想,我們稱之局部關聯,或者說是參數共享機制每個神經元看做一個卷積核(又稱之感受野,receptive field),卷積核對局部數據進行計算。其實很簡單的理解,所謂參數共享,就是共享卷積核。不管你原來的數據長啥樣,我就用這一組卷積核,一直移動計算,僅此而已。這么做的好處就是減少了傳統神經網絡無法解決的大計算量或者說參數數量太多的問題,並且同樣可以提取原數據(如圖像數據)的有效特征,並且由於計算量計算參數的減少,特征提取往往做的更好。

卷積操作利用了圖片空間上的局部相關性,這也就是CNN與傳統神經網絡或機器學習的一個最大的不同點,特征的自動提取。 
這也就是為什么卷積層往往會有多個卷積核(甚至幾十個,上百個),因為權值共享后意味着每一個卷積核只能提取到一種特征,為了增加CNN的表達能力,當然需要多個核。

   

   

  

 

2.1.1 卷積如何計算-卷積核大小(1*1, 3*3, 5*5)

卷積核我們可以理解為一個觀察的人,帶着若干權重和一個偏置去觀察,進行特征加權運算。

注:上述要加上偏置

  • 卷積核大小
    • 1*1、3*3、5*5

通常卷積核大小選擇這些大小,是經過研究人員證明比較好的效果。這個人觀察之后會得到一個運算結果。

 

2.1.2 卷積如何計算-卷積核步長(stride)

需要去移動卷積核觀察這張圖片,需要的參數就是步長。

假設移動的步長為一個像素,那么最終這個人觀察的結果以下圖為例:
  • 5x5的圖片,3x3的卷積大小去一個步長運算得到3x3的大小觀察結果

 

如果移動的步長為2那么結果是這樣
  • 5x5的圖片,3x3的卷積大小去兩個步長運算得到2x2的大小觀察結果

 

 

2.1.3 卷積如何計算-卷積核個數

那么如果在某一層結構當中,不止是一個人觀察,多個人(卷積核)一起去觀察。那就得到多張觀察結果。

  • 不同的卷積核帶的權重和偏置都不一樣,即隨機初始化的參數
我們已經得出輸出結果的大小有大小和步長決定的,但是只有這些嗎,還有一個就是零填充。Filter觀察窗口的大小和移動步長會導致超過圖片像素寬度!

 

2.1.4 卷積如何計算-卷積核零填充大小(zero-padding)

  

有兩種方式,SAME和VALID

  • SAME:越過邊緣取樣,取樣的面積和輸入圖像的像素寬度一致。
  • VALID:不越過邊緣取樣,取樣的面積小於輸入人的圖像的像素寬度。

在Tensorflow當中,卷積API設置”SAME”之后,輸出高寬與輸入大小一樣(重要)

 

2.1.5 總結-輸出大小公式(重要)

最終零填充到底填充多少呢?我們並不需要去關注,接下來我們利用已知的這些條件來去求出輸出的大小來看結果

 

計算案例:

1、假設已知的條件:輸入圖像32*32*1, 50個Filter,大小為5*5,移動步長為1,零填充大小為1。請求出輸出大小?

H2 = (H1 - F + 2P)/S + 1 = (32 - 5 + 2 * 1)/1 + 1 = 30

W2 = (H1 - F + 2P)/S + 1 = (32 -5 + 2 * 1)/1 + 1 = 30

D2 = K = 50

所以輸出大小為[30, 30, 50]

2、假設已知的條件:輸入圖像32*32*1, 50個Filter,大小為3*3,移動步長為1,未知零填充。輸出大小32*32?

H2 = (H1 - F + 2P)/S + 1 = (32 - 3 + 2 * P)/1 + 1 = 32

W2 = (H1 - F + 2P)/S + 1 = (32 -3 + 2 * P)/1 + 1 = 32

所以零填充大小為:1*1

 

小結:  

  • 1、已知固定輸出大小,反過來求出零填充,已知零填充,根據步長等信息,求出輸出大小
  • 2、卷積層過濾器(卷積核)大小,三個選擇1x1,3x3,5x5,步長一般都為1,過濾器個數不定,不同結構選擇不同
  • 3、每個過濾器會帶有若干權重和1個偏置

 

2.1.6 激勵層(激活層)

  作用:把卷積層輸出結果做非線性映射

  激活函數

  卷積網絡結構采用激活函數,自從網路得到發展之后。大家發現原有的sigmoid這些激活函數並不能達到好的效果,所以采取新的激活函數。

3.1 Relu

 

 

 

效果是什么樣的呢?

 

 

PS: playground演示不同激活函數作用 http://playground.tensorflow.org/

  • Relu
  • Tanh
  • sigmoid

為什么采取的新的激活函數

  • Relu優點
    • 有效解決梯度消失問題
    • 計算速度非常快,只需要判斷輸入是否大於0。SGD(批梯度下降)的求解速度速度遠快於sigmoid和tanh
  • sigmoid缺點
    • 采用sigmoid等函數,計算量相對大,而采用Relu激活函數,整個過程的計算量節省很多。在深層網絡中,sigmoid函數 反向傳播 時,很容易就會出現梯度消失的情況

 

 

 

2.3 池化層(下采樣層)

Pooling層主要的作用是壓縮數據和參數的量(保持最顯著的特征),通過去掉Feature Map中不重要的樣本,進一步減少參數數量。Pooling的方法很多,通常采用最大池化

  • max_polling:取池化窗口的最大值
  • avg_polling:取池化窗口的平均值

2.3.1 池化層計算

池化層也有窗口的大小以及移動步長,那么之后的輸出大小怎么計算?計算公式同卷積計算公式一樣

計算:224x224x64,窗口為2,步長為2輸出結果?

H2 = (224 - 2 + 2*0)/2 +1 = 112

w2 = (224 - 2 + 2*0)/2 +1 = 112

通常池化層采用 2x2大小、步長為2窗口

 

2.4 全連接層(FC, Full Connection層)

前面的卷積和池化相當於做特征工程,最后的全連接層在整個卷積神經網絡中起到“分類器”的作用(如果FC層作為最后一層,再加上softmax或者wx+b,則可以分別作為分類或回歸的作用,即“分類器”或“回歸器”的作用);如果作為倒數第2,3層的話,FC層的作用是信息融合,增強信息表達。

 

3. CNN總結

  • 優點
    • 共享卷積核,優化計算量
    • 無需手動選取特征,訓練好權重,即得特征
    •  深層次的網絡抽取圖像信息豐富,表達效果好
  • 缺點
    • 需要調參,需要大樣本量, GPU等硬件依賴
    • 物理含義不明確(可解釋性不強)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM