原文地址:http://www.lxweimin.com/p/1c9daf19b0d9
更多機器學習、深度學習筆記(含python、TensorFlow代碼實現):http://blog.csdn.net/qq_31456593/article/details/69340697
一、前言
卷積神經網絡的產生是為了解決深層神經網絡參數多訓練難的問題,并獲得更好的分類效果。我們知道在深度學習出現之前,傳統神經網絡當層數變多時,反向傳播將會變得困難,且對于一些高維的輸入往往需要大量的參數,因此復雜神經網絡的訓練成了急需解決的問題。同時,由于全連接網絡提取的前一層的全部信息,整體特征擬合能力較低,且易于過擬合于局部樣本。
卷積神經網絡的實現來源于對于視覺神經系統的研究。科學家發現,人對事物的觀察是通過對不同特征捕獲的綜合,視覺神經系統中有專門負責不同特征感知的視覺元。從對視覺神經系統的研究出發,神經網絡的研究者提出用一個神經元每次觀察輸入的部分特征(比如圖片的一小塊),然后通過逐步移動的方法觀察整個輸入的方法,然后用多個這種神經元提取輸入的輸入的不同特征,最后在通過一個全連接網絡對這些特征進行整合,最終達成分類效果。下圖形象的描述了這種特征的提取。
通過多個特征神經元代替一個全連接層,我們發現參數的數量大大減小,且由于圖像存在大量相同的基本特征信息,卷積神經網絡在計算機視覺領域取得了非常好的效果。
二、簡介
卷積神經網絡就是由卷積層、池化層、全連接層構成的具有局部感知和權值共享能力的深層神經網絡。
卷積神經網絡最主要的特點就是局部感知和權值共享。局部感知使其每次只需感知較小的區域,降低了參數數量,也提供了特征擬合能力(特征簡單了,擬合更容易)。而全值共享,使一些基本特征可得到重復利用,使參數可以共享,提高了神經網絡的訓練效果。
卷積層: 做特征的提取,輸出對應得feature map
池化層: 就是對數據進行下采樣,減少數據處理量同時保留有用信息
全連接層: 就是對提取特征進行組織綜合,輸出識別物體的分類情況
關于網絡的形象理解可見下圖。
三、重要概念
接下來我們來看一些重要概念。
卷積
卷積的本質就是加權疊加。卷積核與一個連接觀察窗口的全連接神經元類似,因此我們用它來代替我們上文提到的特征觀察神經元,并最后通過窗口滑動觀察整個輸入,輸出一個 feature map
一維卷積
圖中的M向量為卷積核,N向量為輸入,P向量為輸出。其中P[2] = N[0] * M[0] + ... + N[4] * M[4]。
因為圖像是二維的,所以我們用到的一般是下面的二維卷積
二維卷積
卷積層中卷積核的使用,一般如上圖所示。卷積層是卷積核在上一級輸入層上通過逐一滑動窗口計算而得,卷積核中的每一個參數都相當于傳統神經網絡中的權值參數,與對應的局部像素相連接,將卷積核的各個參數與對應的局部像素值相乘之和,(通常還要再加上一個偏置參數),得到卷積層上的結果(即feature map)。
多通道多個卷積核的卷積計算
下面是3通道(RGB),2個卷積核的計算過程。
- 左邊是輸入(773中,7*7代表圖像的像素/長寬,3代表R、G、B 三個顏色通道)
- 中間部分是兩個不同的濾波器Filterw0、Filter w1
- 最右邊則是兩個不同的輸出(即2個feature map,該隱藏層深度為2,提取2類特征)
隨著左邊數據窗口的平移滑動,卷積核Filter w0 / Filter w1對不同的局部數據進行卷積計算。其中每個卷積核有3個3*3的矩陣分別與與三個通道的觀察窗口做卷積最后求和作為輸出。
卷積核的權重矩陣就是訓練時要學習的,它就是要提取的特征,神經網絡再根據卷積提取的特征去觀察輸入(比如圖片)
Relu激活函數
最近幾年卷積神經網絡中,激活函數往往不選擇sigmoid或tanh函數,而是選擇relu函數。Relu函數的定義是:$f(x)= max(0,x)$
Relu函數圖像如下圖所示:
Relu函數作為激活函數,有下面幾大優勢:
- 速度快 和sigmoid函數需要計算指數和倒數相比,relu函數其實就是一個max(0,x),計算代價小很多。
- 減輕梯度消失問題 回顧計算梯度的公式$\nabla=\sigma'\delta x$。其中,$\sigma'$是sigmoid函數的導數。在使用反向傳播算法進行梯度計算時,每經過一層sigmoid神經元,梯度就要乘上一個$\sigma'$。從下圖可以看出,$\sigma'$函數最大值是1/4。因此,乘一個會導致梯度越來越小,這對于深層網絡的訓練是個很大的問題。而relu函數的導數是1,不會導致梯度變小。當然,激活函數僅僅是導致梯度減小的一個因素,但無論如何在這方面relu的表現強于sigmoid。使用relu激活函數可以讓你訓練更深的網絡。
- 稀疏性 通過對大腦的研究發現,大腦在工作的時候只有大約5%的神經元是激活的,而采用sigmoid激活函數的人工神經網絡,其激活率大約是50%。有論文聲稱人工神經網絡在15%-30%的激活率時是比較理想的。因為relu函數在輸入小于0時是完全不激活的,因此可以獲得一個更低的激活率
四、網絡結構
- 最左邊是數據輸入層
對數據做一些處理,比如去均值(把輸入數據各個維度都中心化為0,避免數據過多偏差,影響訓練效果)、歸一化(把所有的數據都歸一到同樣的范圍)、PCA/白化等等。CNN只對訓練集做“去均值”這一步。 - 中間是
CONV:卷積層,線性乘積 求和。
RELU:激勵層,使用relu做卷積層的激活函數。
POOL:池化層,簡言之,即取區域平均或最大。 - 最右邊是
FC:全連接層
之所以出現這么多不同的描述卷積神經網絡的圖是為了循序漸進地幫助大家理解其網絡結構。
卷積層
卷積核雖然模擬的是一個特征觀察神經元,但它并不屬于卷積層,它相當于一個特征過濾器(或說是一個權重矩陣)。它將符合自己要求的特征輸出到feature map上。
至于卷積層為什么可以提取特征并取得很好的效果,可以看下面表示特征的卷積核與輸入圖片進行運算后提取的feature map
可以看出不同卷積核將提取圖片中不同的特征,一般第一層提取的都是邊、角、色彩強度等低維的特征。正如下圖
然后多個卷積層對特征進行提取和重組后,就能得到比較復雜的特征
relu層
我們這里暫且把激勵函數relu也當作一層,卷積后加上relu激勵函數有
池化層
池化層里我們用的maxpooling,將主要特征保留,舍去多余無用特征,這樣就可以實現信息壓縮,比如下圖所示
經過多輪的卷積和池化,將得到最終的特征表示
全連接層
最后用全連接層對特征進行擬合
并輸出不同分類的概率
這就是卷積神經網絡獲取特征并實現圖像分類的整個過程,通過這個過程,大家應該也對卷積神經網絡的結構有了比較深刻全面的了解。
五、應用
幾個典型的神經網絡應用如下
- LeNet,這是最早用起來的卷積神經網絡,Yann LeCun在論文LeNet提到。
- AlexNet,2012 ILSVRC比賽遠超第2名的卷積神經網絡,和LeNet的結構比較像,只是更深,同時用多層小卷積層疊加提到大卷積層。
- ZF Net,2013 ILSVRC比賽冠軍,可以參考論文ZF Net
- GoogLeNet,2014 ILSVRC比賽冠軍,Google發表的論文Going Deeper with
Convolutions有具體介紹。 - VGGNet,也是2014 ILSVRC比賽中的模型,有意思的是,即使這個模型當時在分類問題上的效果,略差于google的GoogLeNet,但是在很多圖像轉化學習問題(比如object detection)上效果奇好,它也證明卷積神經網的『深度』對于最后的效果有至關重要的作用。預訓練好的模型在pretrained
model site可以下載。
參考材料
卷積神經網絡:http://blog.csdn.net/stdcoutzyx/article/details/41596663
cs231n 卷積神經網絡:http://cs231n.github.io/convolutional-networks/
cnn筆記通俗理解卷積神經網絡:http://blog.csdn.net/v_july_v/article/details/51812459
卷積神經網絡工作原理直觀的解釋?:https://www.zhihu.com/question/39022858
CNN入門詳解及TensorFlow源碼實現--深度學習筆記:http://blog.csdn.net/qq_31456593/article/details/71108257
[透析] 神經網絡如何工作(視頻):https://www.youtube.com/embed/FmpDIaiMIeA
卷積神經網絡:https://www.zybuluo.com/hanbingtao/note/485480