1. 程式人生 > >CNN與常用框架

CNN與常用框架

1. 神經網路
1.1 神經網路——是什麼?
  神經網路沒有一個嚴格的正式定義。它的基本特點,是試圖模仿大腦的神經元之間傳遞,處理資訊的模式。還是有些抽象,那麼看看下面這張圖。 
   
  輸入層和輸出層之間有多個隱層hidden layer,輸入層、輸出層和隱層都有若干個節點。每一個節點是一個神經元,每個神經元,通過激勵函式,計算處理來自其它相鄰神經元的加權輸入值;神經元之間的資訊傳遞的強度,用所謂加權值來定義,演算法會不斷自我學習,調整這個加權值。 
  在邏輯迴歸中,我們知道迴歸函式中得到線性擬合z=θ0+θ1x1+θ2x2z=θ0+θ1x1+θ2x2,輸入到sigmoid函式中a=g(z)=11+e−za=g(z)=11+e−z,這個過程可以看做一個沒有隱層的神經元,g(z)就是激勵函式: 
   
  如果在中間加上少量隱層,就是淺層神經網路,增多中間層,就是深層神經網路(DNN)。

1.2 神經網路——為什麼?
  神經網路為什麼比其他的分類器有更好的效果呢?傳統的邏輯斯特迴歸或者linear SVM來做簡單的的分類,對於非線性可分的情況,可以設定核函式去把平面資料分隔開,但是樣本很不規則的時候卻難以分割。那麼神經網路是怎麼做的呢?舉一個吳恩達老師課件裡的例子: 
   
  當x1、x2相同時y=1,不同時y=0,對y的取值進行切分,很難用一條直線切分。如果有一個分類器,用兩條線性分類的組合(邏輯與)判定正負樣本,就可以完成。如圖,給定一組權重可得到一條直線,由兩組權重構造兩條直線,再有這兩條直線進行線性加權,得到切分函式。 
   
  除了“邏輯與”,神經元還可以完成“邏輯或”,這兩個操作是神經網路的高明所在。例如對下圖四種顏色分類,採用“摳圖”的方式得到綠色:先對上面綠色的模組的7條變作線性切分,得到0、1的分類,再對這7條線性分類做與操作,得到上面的這個綠色。再和其他的綠色模組取或操作,得到全部的綠色區域。 
   
  我們已經瞭解了神經網路的結構,是全連線的,那麼卷積神經網路又是什麼呢? 

2. 卷積神經網路的層級結構
  卷積神經網路依舊是層級結構,但是層的功能和形式做了變化,主要的層次有資料輸入層、卷積計算層、激勵層、池化層和全連線層,這些層次穿插著組合在一起。 
  

2.1 資料輸入層——Input layer
  有3種常見的影象資料處理方式: 
  1. 去均值:把輸入資料各個維度都中心化到0。 
  2. 歸一化:幅度歸一化到同樣的範圍。 
  3. PCA/白化:用PCA降維,白化是對資料每個特徵軸上的幅度歸一化。 
  CNN裡一般只做去訓練集的均值。

2.2 卷積計算層——CONV layer
  卷積計算層是卷積神經網路的核心,這個操作在物理上是可解釋的。我們知道神經網路是全連線的,卷積網路不是,是區域性關聯的。過程是:每個神經元看做一個濾波器filter,filter對區域性資料計算。取一個數據視窗,這個資料視窗不斷地滑動,直到覆蓋所有樣本 。需要知道這幾個引數: 
  a. 深度depth:神經元個數,決定輸出的depth厚度。 
  b. 步長stride:決定滑動多少步可以到邊緣 
  c. 填充值zero-padding:在外圍邊緣補充若干圈0,方便從初始位置以步長為單位可以剛好滑倒末尾位置,通俗地講就是為了總長能被步長整除。 
   
  舉例分析:下面這張圖中,有兩個神經元,即depth=2;取3*3的視窗,每次移動兩個步長,stride=2;zero-padding=1。分別以兩個濾子為軸滑動陣列,得到兩組結果。 
   
  具體是怎麼計算的呢?對應位置上是數字先乘後相加,中間濾波器filter與資料視窗做內積。以第一個結果-3為例:第0組0∗0+0∗0+0∗(−1)+0∗1+1∗0+2∗0+0∗0+1∗0+0∗1=00∗0+0∗0+0∗(−1)+0∗1+1∗0+2∗0+0∗0+1∗0+0∗1=0,第1組=-4,第2組=0,偏差bias=1,所以 0+(-4)+0+1=-3。整個計算過程的動態圖如下,做的很直觀明瞭! 
  
  之所以卷積神經網路的引數不會很大,有一個很重要的性質就是引數共享機制:同一個神經元,無論輸入資料如何滑動變化,連線資料窗的權重是固定的。這樣一來,有多少個神經元,就制定多少組引數,過程中不會再改變。 
  卷積神經網路在影象上的應用很廣泛,下面這張圖表示使用不同的濾子處理影象的差別。 
  

2.3 激勵層——ReLU
  激勵層有一個激勵函式,把卷積層輸出結果做非線性對映。非線性的對映有:Sigmoid、Tanh、ReLU、Leaky ReLU、ELU、Maxout等,大多數用的是ReLU。ReLU收斂快(比sigmoid函式至少提高6倍),求梯度簡單,但是較脆弱,它的影象如下: 
   
  改進的有: 
  a. Leaky ReLU:不會“飽和” /掛掉,計算也很快。 
  b. 指數線性單元ELU:所有ReLU有的優點都有,不會掛,輸出均值趨於0,因為指數存在,計算量略大。 
  c. Maxout:計算是線性的,不會飽和不會掛,多了好些引數;max(ωT1x+b1,ωT2x+b2)max(ω1Tx+b1,ω2Tx+b2) 
  選擇激勵函式的一些實際經驗:不要用sigmoid,太難以訓練;首先試RELU,因為快,但要小心點,列印中間資訊判斷狀態;如果RELU失效,請用Leaky ReLU或者Maxout;某些情況下tanh倒是有不錯的結果,但是很少。

2.4 池化層——Pooling layer
  池化層夾在連續的卷積層中間,用於壓縮資料和引數的量、減小過擬合。如下圖,在不影響影象內容的前提下,把224x224的圖片壓縮成 112x112,基於的理論是平移不變性。 
   
  池化層有 Max pooling 和 average pooling兩種方式,工業界多用Max pooling。Max pooling每次把視窗中最大的值抽出來,如下圖: 
  

2.5 全連線層——FC layer
  全連線層中,兩層之間所有神經元都有權重連線,通常全連線層在卷積神經網路尾部,因為尾部的資訊量沒有開始那麼大。 
  一般卷積神經網路的結構層次如下: 
  

2.6 卷積神經網路的優缺點
  優點: 
  a. 共享卷積核,對高維資料處理無壓力 
  b. 無需手動選取特徵,訓練好權重,即得特徵 
  c. 分類效果好 
  缺點: 
  a. 需要調參,需要大樣本量,訓練最好要用GPU 
  b. 物理含義不明確

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

4. CNN常用框架
  1. Caffe:源於Berkeley的主流CV工具包,支援C++,python,matlab,Model Zoo中有大量預訓練好的模型供使用。 
  prototxt是用命令列做訓練時要用的,定義了cnn的層級結構。 
  2. Torch:Facebook用的卷積神經網路工具包,通過時域卷積的本地介面,使用非常直觀,torch定義新網路層比較簡單,可以做影象或者RNN。 
  3. TensorFlow:Google的深度學習框架,視覺化很方便,資料和模型並行化好,速度快。開源後資源會更豐富。 
   
  CNN的應用:影象識別與檢索、人臉識別、性別/年齡/情緒識別、物體檢測、場景判定與危險監控等。

More
深度學習—CNN與常用框架 視訊及PPT下載
CNN筆記:通俗理解卷積神經網路
--------------------- 
作者:心瀟瑤 
來源:CSDN 
原文:https://blog.csdn.net/joycewyj/article/details/51792477?utm_source=copy 
版權宣告:本文為博主原創文章,轉載請附上博文連結!