卷積神經網絡CNN與深度學習常用框架的介紹與使用


一、神經網絡為什么比傳統的分類器好

1.傳統的分類器有 LR(邏輯斯特回歸) 或者 linear SVM ,多用來做線性分割,假如所有的樣本可以看做一個個點,如下圖,有藍色的點和綠色的點,傳統的分類器就是要找到一條直線把這兩類樣本點分開。

對於非線性可分的樣本,可以加一些kernel核函數或者特征的映射使其成為一個曲線或者一個曲面將樣本分開。但為什么效果不好,主要原因是你很難保證樣本點的分布會如圖所示那么規則,我們無法控制其分布,當綠色的點中混雜幾個藍色的點,就很難分開了,及時用曲線可以分開,這個曲線也會變得非常的扭曲,不僅難以學到,還會出現過擬合的問題。而且作為分開着兩類樣本的特征的抽取也是一個問題。這也是現在不用的原因。

 2.那神經網絡是怎么做到的呢?

神經網絡其實就是使用AND和OR操作把樣本點中得那一塊摳出來。正如下圖,最上面的綠色區域的每一個變都可以看成一個線性分類器,把樣本分成正例和負例,那這些分類器做AND操作,得出的結果就是一個綠色的區域,然后把多個綠色的區域再用OR操作。而一個神經元就可以實現AND操作或者OR操作,我們只需要提供樣本,神經網絡就可以自己學到。這也就是它的優點所在。總結起來就是:對線性分類器的『與』和『或』的組合,完美對平面樣本點分布進行分類

二、什么是卷積神經網絡

卷積神經網絡依舊是層級網絡, 但層的功能和形式做了變化。層級結構可參照下圖

 

 1.層級結構

其層級結構包括:數據輸入層/  Input layer,卷積計算層 / CONV layer, ReLU 激勵層 / ReLU layer,池化層 / Pooling layer,全連接層 / FC layer

(1)數據輸入層/  Input layer

有3種常見的圖像數據處理方式

 去均值:把輸入數據各個維度都中心化到0,也就是算出所有樣本的平均值,再讓所有樣本減去這個均值

歸一化:幅度歸一化到同樣的范圍,比如把樣本數據壓縮到0-1

 PCA/白化:用PCA降維,白化是對數據每個特征軸上的幅度歸一化

CNN在圖像上的處理往往只有去均值。

 (2)卷積計算層/  CONV layer

它不再是全連接了,而是局部關聯。每個神經元看做一個filter。通過對窗口(receptive field)做滑動操作,filter對局部數據計算

 

這里還有3個概念:

深度/depth,在這幅圖中指的3,通常為圖片的rgb3個顏色通道。

 步長/stride:即窗口每次滑動多遠

填充值/zero-padding:為了使滑動窗口正好滑動到邊界,需要在周圍填充0,padding等於幾,就填充幾圈

下面給一個卷積的具體例子:

 

 這個例子的depth為2,因為只有兩個filter,每個顏色通道的上都有一個3*3的滑動窗口,這個窗口里的值與filter里的w對應相乘,每個通道上都會得到一個值,把這3個值加起來就得出了Output Volume層值,Filter w0對輸入輸入卷積后得到output volume層的第一個矩陣,filter w2得到第二個。

另外,卷積層有一個特別重要的特點就是參數共享機制,即每個神經元連接數據窗的權重是固定的,可以這樣理解參數共享機制:

固定每個神經元連接權重,可以看做模板,每個神經元只關注一個特性。

它帶來的好處就是需要估算的權重個數減少,例如AlexNet網絡從1億個需要調節的參數減少到3.5w個。

(3)激勵層 (ReLU)

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

 

 

 常見的激勵函數有:Sigmoid,Tanh(雙曲正切),ReLU,Leaky ReLU,ELU,Maxout

 Sigmoid:最開始使用的,現在已經基本不用了,因為當x比較大時,它的輸出值都比較接近於1,它的梯度是接近於0,而我們是要要利用梯度取做優化的,這將導致無法完成權重的優化

 

ReLU:比價常用的激勵函數,它有收斂快,求梯度簡單,較脆弱這些特點,較脆弱的原因是,當x的值小於0后,它任然會出現梯度為0 的結果。

 Leaky ReLU  

            

不會“飽和”/掛掉,計算也很快

 

 

指數線性單元ELU:所有ReLU有的優點都有,不會掛,輸出均值趨於0,因為指數存在,計算量略大

 

Maxout:計算是線性的,不會飽和不會掛,多了好些參數,兩條直線拼接

 

實際經驗:

1)不要用sigmoid

2)首先試RELU,因為快,但要小心點

3)如果2失效,請用Leaky ReLU或者Maxout

4)某些情況下tanh倒是有不錯的結果,但是很少

(4)池化層 / Pooling layer

它的位置一般是夾在連續的卷積層中間,作用是壓縮數據和參數的量,減小過擬合

(5)全連接層 / FC layer

兩層之間所有神經元都有權重連接,通常全連接層在卷積神經網絡尾部。業界人解釋放一個FC layer的主要目的是最大可能的利用現在經過窗口滑動和池化后保留下的少量的信息還原原來的輸入信息

 (6)CNN的一般結構可歸結為:

1)INPUT  2) [[CONV -> RELU]*N -> POOL?]*M    3) [FC -> RELU]*K 或FC

2.典型的CNN

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

 3.fine-tuning

 (1)何謂 fine-tuning:使用已用於其他目標,預訓練好模型的權重或者部分權重,作為初始值開始訓練

(2)為什么要fine-tuning:首先自己從頭訓練卷積神經網絡容易出現問題,其次fine-tuning能很快收斂到一個較理想的狀態

(3)怎么做:一般復用相同層的權重,新定義層取隨機權重初始值,但要注意調大新定義層的的學習率,調小復用層學習率

三、CNN的常用框架

 1.Caffe:源於Berkeley的主流CV工具包,支持C++,python,matlab,Model Zoo中有大量預訓練好的模型供使用

2.TensorFlow:Google的深度學習框架,TensorBoard可視化很方便,數據和模型並行化好,速度快

 3.Torch:Facebook用的卷積神經網絡工具包,通過時域卷積的本地接口,使用非常直觀,定義新網絡層簡單.

四、典型應用

 1.圖像識別與檢索

2.人臉識別

3.性別/年齡/情緒識別

4.物體檢測

五、CNN訓練注意事項

1.用Mini-batch SGD對神經網絡做訓練的過程如下:

不斷循環 :

①  采樣一個 batch 數據( ( 比如 32 張 )

②前向計算得到損失 loss

③  反向傳播計算梯度( 一個 batch)

④  用這部分梯度迭代更新權重參數

2.去均值

去均值一般有兩種方式:第一種是在每個像素點都算出3個顏色通道上的平均值,然后對應減去,如AlexNet。 第二種是在整個樣本上就只得到一組數,不分像素點了,如VGGNet。

3.權重初始化

1)用均值為0的高斯函數,隨機取一些點去初始化W。這種初始化方法對於層次不深的神經網絡 OK,深層網絡容易帶來整個網絡( 激活傳遞)的不對稱性

2)當激勵函數是sigmoid函數時,輸入層神經元個數為input,輸出層為output,則輸出層的W可為input和output之間的一個數/input的平方根,公式如下

            

3)當激勵函數變成當今最為流行ReLu函數時,以上方式又失效了,除以(input/2)的平方根是可以的

 關於Batch Normalization:通常在全連接層后 , 激勵層前做如下操作

它的作用是自動的約束輸出不會發散,導致導致整個網絡的訓練死掉,具體的官方的好處有如下四點:

1)梯度傳遞(計算 )更為順暢 

2)學習率設高一點也沒關系

3)對於初始值的依賴減少了!!  

4)其實這里也可以看做一種正則化 , 減少了對dropout的需求。

4.Dropout

 這是一種防止過擬合的一種正則化方式,以前的正則化方式是在loss中加上所有的W,但在神經網絡中不可行,因為w的數量太大了,不僅會使loss值很大,也會浪費很多時間在計算w的和上。簡單的理解dropout就是別一次開啟所有學習單元

 

一個最簡單的實現方式可參照如下代碼所示:

dropout一般在訓練階段使用,在測試或者預測時並不會去dropout,工業上的做法是在輸入的X上乘以P得到X的期望,或者輸入不做變化而是對所有的有dropout層都做X/p

dropout能防止過擬合的的理解方式:

理解一:別讓你的神經網絡記住那么多東西

理解二:每次都關掉一部分感知器 , 得到一個新模型 , 最后做融合

六.CAFFE的介紹與使用

1.Caffe主要的類/模塊

                                    

2.Caffe使用方法

講道理:使用caffe根本不用寫程序,只用命令行就可以了,步驟如下;

① Resize 圖片 , 轉換存儲格式

② 定義網絡結構(編輯 prototxt)

③ 定義 solver (編輯另一個 prototxt

④ 訓練(可以基於已有的權重賦值 , 跑一個腳本 )

第1步:轉化格式

第2步:定義層次結構

 

第3步:定義solver

 

第4步:訓練

 

關於fine-tuning

 如果層次不變 , 只需修改輸入輸出

 

 

 如果層次改變 , 添加/ / 刪減層次

      ——》         ——》——》

 

 

 fine-tuning技巧/注意點

1)優先學習權放在新加層:每一層都有控制學習率的參數: blobs_lr,一般會把前面層學習率調低,最后新加層調高,你甚至可以freeze前面的層次不動,一般fine-tuning的前期loss下降非常快,中間有個瓶頸期,要有耐心

2)在solver處調整學習率:調低solver處的學習率(1/10, 1/100),記住存儲一下中間結果,以免出現意外

 


免責聲明!

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



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