從神經網絡到卷積神經網絡(CNN)
咱們知道神經網絡的結構是這樣的:
python
那捲積神經網絡跟它是什麼關係呢?
其實卷積神經網絡依舊是層級網絡,只是層的功能和形式作了變化,能夠說是傳統神經網絡的一個改進。好比下圖中就多了許多傳統神經網絡沒有的層次。算法
卷積神經網絡的層級結構
• 數據輸入層/ 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降維;白化是對數據各個特徵軸上的幅度歸一化框架
去均值與歸一化效果圖:
機器學習
去相關與白化效果圖:
ide
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層是一個下采樣層是幹嗎用的?爲何是下采樣?也就是上面所說的池化層,只是叫法不一樣而已。這層利用圖像局部相關性的原理,對圖像進行子抽樣,能夠減小數據處理量同時保留有用信息,至關於圖像壓縮。