1. 程式人生 > >卷積神經網路 CNN

卷積神經網路 CNN

從神經網路到卷積神經網路(CNN) 我們知道神經網路的結構是這樣的:

那捲積神經網路跟它是什麼關係呢? 其實卷積神經網路依舊是層級網路,只是層的功能和形式做了變化,可以說是傳統神經網路的一個改進。比如下圖中就多了許多傳統神經網路沒有的層次。

 

卷積神經網路的層級結構       • 資料輸入層/ Input layer   • 卷積計算層/ CONV layer   • ReLU激勵層 / ReLU layer   • 池化層 / Pooling layer   • 全連線層 / FC layer

1.資料輸入層 該層要做的處理主要是對原始影象資料進行預處理,其中包括:   • 去均值:把輸入資料各個維度都中心化為0,如下圖所示,其目的就是把樣本的中心拉回到座標系原點上。   • 歸一化:幅度歸一化到同樣的範圍,如下所示,即減少各維度資料取值範圍的差異而帶來的干擾,比如,我們有兩個維度的特徵A和B,A範圍是0到10,而B範圍是0到10000,如果直接使用這兩個特徵是有問題的,好的做法就是歸一化,即A和B的資料都變為0到1的範圍。   • PCA/白化:用PCA降維;白化是對資料各個特徵軸上的幅度歸一化

去均值與歸一化效果圖:

去相關與白化效果圖:

2.卷積計算層 這一層就是卷積神經網路最重要的一個層次,也是“卷積神經網路”的名字來源。 在這個卷積層,有兩個關鍵操作:   • 區域性關聯。每個神經元看做一個濾波器(filter)   • 視窗(receptive field)滑動, filter對區域性資料計算

先介紹卷積層遇到的幾個名詞:   • 深度/depth(解釋見下圖)   • 步長/stride (視窗一次滑動的長度)   • 填充值/zero-padding

填充值是什麼呢?以下圖為例子,比如有這麼一個5*5的圖片(一個格子一個畫素),我們滑動視窗取2*2,步長取2,那麼我們發現還剩下1個畫素沒法滑完,那怎麼辦呢?

那我們在原先的矩陣加了一層填充值,使得變成6*6的矩陣,那麼視窗就可以剛好把所有畫素遍歷完。這就是填充值的作用。  

卷積的計算(注意,下面藍色矩陣周圍有一圈灰色的框,那些就是上面所說到的填充值)

這裡的藍色矩陣就是輸入的影象,粉色矩陣就是卷積層的神經元,這裡表示了有兩個神經元(w0,w1)。綠色矩陣就是經過卷積運算後的輸出矩陣,這裡的步長設定為2。

 

藍色的矩陣(輸入影象)對粉色的矩陣(filter)進行矩陣內積計算並將三個內積運算的結果與偏置值b相加(比如上面圖的計算:2+(-2+1-2)+(1-2-2) + 1= 2 - 3 - 3 + 1 = -3),計算後的值就是綠框矩陣的一個元素。

下面的動態圖形象地展示了卷積層的計算過程:

 

引數共享機制   • 在卷積層中每個神經元連線資料窗的權重是固定的,每個神經元只關注一個特性。神經元就是影象處理中的濾波器,比如邊緣檢測專用的Sobel濾波器,即卷積層的每個濾波器都會有自己所關注一個影象特徵,比如垂直邊緣,水平邊緣,顏色,紋理等等,這些所有神經元加起來就好比就是整張影象的特徵提取器集合。   • 需要估算的權重個數減少: AlexNet 1億 => 3.5w   • 一組固定的權重和不同視窗內資料做內積: 卷積

 

3.激勵層 把卷積層輸出結果做非線性對映。 CNN採用的激勵函式一般為ReLU(The Rectified Linear Unit/修正線性單元),它的特點是收斂快,求梯度簡單,但較脆弱,影象如下。

激勵層的實踐經驗:   ①不要用sigmoid!不要用sigmoid!不要用sigmoid!   ② 首先試RELU,因為快,但要小心點   ③ 如果2失效,請用Leaky ReLU或者Maxout   ④ 某些情況下tanh倒是有不錯的結果,但是很少

4.池化層 池化層夾在連續的卷積層中間, 用於壓縮資料和引數的量,減小過擬合。 簡而言之,如果輸入是影象的話,那麼池化層的最主要作用就是壓縮影象。

這裡再展開敘述池化層的具體作用。

1. 特徵不變性,也就是我們在影象處理中經常提到的特徵的尺度不變性,池化操作就是影象的resize,平時一張狗的影象被縮小了一倍我們還能認出這是一張狗的照片,這說明這張影象中仍保留著狗最重要的特徵,我們一看就能判斷影象中畫的是一隻狗,影象壓縮時去掉的資訊只是一些無關緊要的資訊,而留下的資訊則是具有尺度不變性的特徵,是最能表達影象的特徵。

2. 特徵降維,我們知道一幅影象含有的資訊是很大的,特徵也很多,但是有些資訊對於我們做影象任務時沒有太多用途或者有重複,我們可以把這類冗餘資訊去除,把最重要的特徵抽取出來,這也是池化操作的一大作用。

3. 在一定程度上防止過擬合,更方便優化。

池化層用的方法有Max pooling 和 average pooling,而實際用的較多的是Max pooling。

這裡就說一下Max pooling,其實思想非常簡單。 對於每個2*2的視窗選出最大的數作為輸出矩陣的相應元素的值,比如輸入矩陣第一個2*2視窗中最大的數是6,那麼輸出矩陣的第一個元素就是6,如此類推。

5.全連線層 兩層之間所有神經元都有權重連線,通常全連線層在卷積神經網路尾部。也就是跟傳統的神經網路神經元的連線方式是一樣的:

一般CNN結構依次為   1. INPUT   2. [[CONV -> RELU]*N -> POOL?]*M   3. [FC -> RELU]*K   4. FC

卷積神經網路之訓練演算法   1. 同一般機器學習演算法,先定義Loss function,衡量和實際結果之間差距。   2. 找到最小化損失函式的W和b, CNN中用的演算法是SGD(隨機梯度下降)。

卷積神經網路之優缺點 優點   • 共享卷積核,對高維資料處理無壓力   • 無需手動選取特徵,訓練好權重,即得特徵分類效果好 缺點   • 需要調參,需要大樣本量,訓練最好要GPU   • 物理含義不明確(也就說,我們並不知道沒個卷積層到底提取到的是什麼特徵,而且神經網路本身就是一種難以解釋的“黑箱模型”)

卷積神經網路之典型CNN   • LeNet,這是最早用於數字識別的CNN   • AlexNet, 2012 ILSVRC比賽遠超第2名的CNN,比   • LeNet更深,用多層小卷積層疊加替換單大卷積層。   • ZF Net, 2013 ILSVRC比賽冠軍   • GoogLeNet, 2014 ILSVRC比賽冠軍   • VGGNet, 2014 ILSVRC比賽中的模型,影象識別略差於GoogLeNet,但是在很多影象轉化學習問題(比如object detection)上效果奇好

卷積神經網路之 fine-tuning 何謂fine-tuning? fine-tuning就是使用已用於其他目標、預訓練好模型的權重或者部分權重,作為初始值開始訓練。

那為什麼我們不用隨機選取選幾個數作為權重初始值?原因很簡單,第一,自己從頭訓練卷積神經網路容易出現問題;第二,fine-tuning能很快收斂到一個較理想的狀態,省時又省心。

那fine-tuning的具體做法是?   • 複用相同層的權重,新定義層取隨機權重初始值   • 調大新定義層的的學習率,調小複用層學習率

卷積神經網路的常用框架

Caffe   • 源於Berkeley的主流CV工具包,支援C++,python,matlab   • Model Zoo中有大量預訓練好的模型供使用Torch   • Facebook用的卷積神經網路工具包   • 通過時域卷積的本地介面,使用非常直觀   • 定義新網路層簡單TensorFlow   • Google的深度學習框架   • TensorBoard視覺化很方便   • 資料和模型並行化好,速度快

總結 卷積網路在本質上是一種輸入到輸出的對映,它能夠學習大量的輸入與輸出之間的對映關係,而不需要任何輸入和輸出之間的精確的數學表示式,只要用已知的模式對卷積網路加以訓練,網路就具有輸入輸出對之間的對映能力。

CNN一個非常重要的特點就是頭重腳輕(越往輸入權值越小,越往輸出權值越多),呈現出一個倒三角的形態,這就很好地避免了BP神經網路中反向傳播的時候梯度損失得太快。

卷積神經網路CNN主要用來識別位移、縮放及其他形式扭曲不變性的二維圖形。由於CNN的特徵檢測層通過訓練資料進行學習,所以在使用CNN時,避免了顯式的特徵抽取,而隱式地從訓練資料中進行學習;再者由於同一特徵對映面上的神經元權值相同,所以網路可以並行學習,這也是卷積網路相對於神經元彼此相連網路的一大優勢。卷積神經網路以其區域性權值共享的特殊結構在語音識別和影象處理方面有著獨特的優越性,其佈局更接近於實際的生物神經網路,權值共享降低了網路的複雜性,特別是多維輸入向量的影象可以直接輸入網路這一特點避免了特徵提取和分類過程中資料重建的複雜度。

以下是我自己在學習CNN的時候遇到的一些困惑,以及查閱一些資料後得到的一些答案。

第一個問題:為什麼不用BP神經網路去做呢? 1.全連線,權值太多,需要很多樣本去訓練,計算困難   • 應對之道:減少權值的嘗試,區域性連線,權值共享

  卷積神經網路有兩種神器可以降低引數數目。   第一種神器叫做區域性感知野,一般認為人對外界的認知是從區域性到全域性的,而影象的空間聯絡也是區域性的畫素聯絡較為緊密,而距離較遠的畫素相關性則較弱。因而,每個神經元其實沒有必要對全域性影象進行感知,只需要對區域性進行感知,然後在更高層將區域性的資訊綜合起來就得到了全域性的資訊。   第二級神器,即權值共享。

 

2.邊緣過渡不平滑   • 應對之道:取樣視窗彼此重疊

 

第二個問題:LeNet裡的隱層的神經元個數怎麼確定呢? 它和原影象,也就是輸入的大小(神經元個數)、濾波器的大小和濾波器在影象中的滑動步長都有關!

LeNet-5共有7層,不包含輸入,每層都包含可訓練引數(連線權重)。輸入影象為32*32大小。

例如,我的影象是1000x1000畫素,而濾波器大小是10x10,假設濾波器沒有重疊,也就是步長為10,這樣隱層的神經元個數就是(1000x1000 )/ (10x10)=100x100個神經元了。

那重疊了怎麼算?比如上面圖的C2中28*28是如何得來的?這裡的步長就是1,視窗大小是5*5,所以視窗滑動肯定發生了重疊。下圖解釋了28的由來。

 

第三個問題:S2層是一個下采樣層是幹嘛用的?為什麼是下采樣? 也就是上面所說的池化層,只是叫法不同而已。這層利用影象區域性相關性的原理,對影象進行子抽樣,可以減少資料處理量同時保留有用資訊,相當於影象壓縮。