原文地址:http://www.itdecent.cn/p/1c9daf19b0d9
更多機(jī)器學(xué)習(xí)、深度學(xué)習(xí)筆記(含python、TensorFlow代碼實現(xiàn)):http://blog.csdn.net/qq_31456593/article/details/69340697
一、前言
卷積神經(jīng)網(wǎng)絡(luò)的產(chǎn)生是為了解決深層神經(jīng)網(wǎng)絡(luò)參數(shù)多訓(xùn)練難的問題,并獲得更好的分類效果。我們知道在深度學(xué)習(xí)出現(xiàn)之前,傳統(tǒng)神經(jīng)網(wǎng)絡(luò)當(dāng)層數(shù)變多時,反向傳播將會變得困難,且對于一些高維的輸入往往需要大量的參數(shù),因此復(fù)雜神經(jīng)網(wǎng)絡(luò)的訓(xùn)練成了急需解決的問題。同時,由于全連接網(wǎng)絡(luò)提取的前一層的全部信息,整體特征擬合能力較低,且易于過擬合于局部樣本。
卷積神經(jīng)網(wǎng)絡(luò)的實現(xiàn)來源于對于視覺神經(jīng)系統(tǒng)的研究。科學(xué)家發(fā)現(xiàn),人對事物的觀察是通過對不同特征捕獲的綜合,視覺神經(jīng)系統(tǒng)中有專門負(fù)責(zé)不同特征感知的視覺元。從對視覺神經(jīng)系統(tǒng)的研究出發(fā),神經(jīng)網(wǎng)絡(luò)的研究者提出用一個神經(jīng)元每次觀察輸入的部分特征(比如圖片的一小塊),然后通過逐步移動的方法觀察整個輸入的方法,然后用多個這種神經(jīng)元提取輸入的輸入的不同特征,最后在通過一個全連接網(wǎng)絡(luò)對這些特征進(jìn)行整合,最終達(dá)成分類效果。下圖形象的描述了這種特征的提取。

通過多個特征神經(jīng)元代替一個全連接層,我們發(fā)現(xiàn)參數(shù)的數(shù)量大大減小,且由于圖像存在大量相同的基本特征信息,卷積神經(jīng)網(wǎng)絡(luò)在計算機(jī)視覺領(lǐng)域取得了非常好的效果。
二、簡介
卷積神經(jīng)網(wǎng)絡(luò)就是由卷積層、池化層、全連接層構(gòu)成的具有局部感知和權(quán)值共享能力的深層神經(jīng)網(wǎng)絡(luò)。
卷積神經(jīng)網(wǎng)絡(luò)最主要的特點就是局部感知和權(quán)值共享。局部感知使其每次只需感知較小的區(qū)域,降低了參數(shù)數(shù)量,也提供了特征擬合能力(特征簡單了,擬合更容易)。而全值共享,使一些基本特征可得到重復(fù)利用,使參數(shù)可以共享,提高了神經(jīng)網(wǎng)絡(luò)的訓(xùn)練效果。
卷積層: 做特征的提取,輸出對應(yīng)得feature map
池化層: 就是對數(shù)據(jù)進(jìn)行下采樣,減少數(shù)據(jù)處理量同時保留有用信息
全連接層: 就是對提取特征進(jìn)行組織綜合,輸出識別物體的分類情況
關(guān)于網(wǎng)絡(luò)的形象理解可見下圖。

三、重要概念
接下來我們來看一些重要概念。
卷積
卷積的本質(zhì)就是加權(quán)疊加。卷積核與一個連接觀察窗口的全連接神經(jīng)元類似,因此我們用它來代替我們上文提到的特征觀察神經(jīng)元,并最后通過窗口滑動觀察整個輸入,輸出一個 feature map
一維卷積

圖中的M向量為卷積核,N向量為輸入,P向量為輸出。其中P[2] = N[0] * M[0] + ... + N[4] * M[4]。
因為圖像是二維的,所以我們用到的一般是下面的二維卷積
二維卷積
卷積層中卷積核的使用,一般如上圖所示。卷積層是卷積核在上一級輸入層上通過逐一滑動窗口計算而得,卷積核中的每一個參數(shù)都相當(dāng)于傳統(tǒng)神經(jīng)網(wǎng)絡(luò)中的權(quán)值參數(shù),與對應(yīng)的局部像素相連接,將卷積核的各個參數(shù)與對應(yīng)的局部像素值相乘之和,(通常還要再加上一個偏置參數(shù)),得到卷積層上的結(jié)果(即feature map)。
多通道多個卷積核的卷積計算
下面是3通道(RGB),2個卷積核的計算過程。
- 左邊是輸入(773中,7*7代表圖像的像素/長寬,3代表R、G、B 三個顏色通道)
- 中間部分是兩個不同的濾波器Filterw0、Filter w1
- 最右邊則是兩個不同的輸出(即2個feature map,該隱藏層深度為2,提取2類特征)
隨著左邊數(shù)據(jù)窗口的平移滑動,卷積核Filter w0 / Filter w1對不同的局部數(shù)據(jù)進(jìn)行卷積計算。其中每個卷積核有3個3*3的矩陣分別與與三個通道的觀察窗口做卷積最后求和作為輸出。
卷積核的權(quán)重矩陣就是訓(xùn)練時要學(xué)習(xí)的,它就是要提取的特征,神經(jīng)網(wǎng)絡(luò)再根據(jù)卷積提取的特征去觀察輸入(比如圖片)
Relu激活函數(shù)
最近幾年卷積神經(jīng)網(wǎng)絡(luò)中,激活函數(shù)往往不選擇sigmoid或tanh函數(shù),而是選擇relu函數(shù)。Relu函數(shù)的定義是:$f(x)= max(0,x)$
Relu函數(shù)圖像如下圖所示:

Relu函數(shù)作為激活函數(shù),有下面幾大優(yōu)勢:
- 速度快 和sigmoid函數(shù)需要計算指數(shù)和倒數(shù)相比,relu函數(shù)其實就是一個max(0,x),計算代價小很多。
- 減輕梯度消失問題 回顧計算梯度的公式$\nabla=\sigma'\delta x$。其中,$\sigma'$是sigmoid函數(shù)的導(dǎo)數(shù)。在使用反向傳播算法進(jìn)行梯度計算時,每經(jīng)過一層sigmoid神經(jīng)元,梯度就要乘上一個$\sigma'$。從下圖可以看出,$\sigma'$函數(shù)最大值是1/4。因此,乘一個會導(dǎo)致梯度越來越小,這對于深層網(wǎng)絡(luò)的訓(xùn)練是個很大的問題。而relu函數(shù)的導(dǎo)數(shù)是1,不會導(dǎo)致梯度變小。當(dāng)然,激活函數(shù)僅僅是導(dǎo)致梯度減小的一個因素,但無論如何在這方面relu的表現(xiàn)強(qiáng)于sigmoid。使用relu激活函數(shù)可以讓你訓(xùn)練更深的網(wǎng)絡(luò)。
- 稀疏性 通過對大腦的研究發(fā)現(xiàn),大腦在工作的時候只有大約5%的神經(jīng)元是激活的,而采用sigmoid激活函數(shù)的人工神經(jīng)網(wǎng)絡(luò),其激活率大約是50%。有論文聲稱人工神經(jīng)網(wǎng)絡(luò)在15%-30%的激活率時是比較理想的。因為relu函數(shù)在輸入小于0時是完全不激活的,因此可以獲得一個更低的激活率
四、網(wǎng)絡(luò)結(jié)構(gòu)
- 最左邊是數(shù)據(jù)輸入層
對數(shù)據(jù)做一些處理,比如去均值(把輸入數(shù)據(jù)各個維度都中心化為0,避免數(shù)據(jù)過多偏差,影響訓(xùn)練效果)、歸一化(把所有的數(shù)據(jù)都?xì)w一到同樣的范圍)、PCA/白化等等。CNN只對訓(xùn)練集做“去均值”這一步。 - 中間是
CONV:卷積層,線性乘積 求和。
RELU:激勵層,使用relu做卷積層的激活函數(shù)。
POOL:池化層,簡言之,即取區(qū)域平均或最大。 - 最右邊是
FC:全連接層
之所以出現(xiàn)這么多不同的描述卷積神經(jīng)網(wǎng)絡(luò)的圖是為了循序漸進(jìn)地幫助大家理解其網(wǎng)絡(luò)結(jié)構(gòu)。
卷積層
卷積核雖然模擬的是一個特征觀察神經(jīng)元,但它并不屬于卷積層,它相當(dāng)于一個特征過濾器(或說是一個權(quán)重矩陣)。它將符合自己要求的特征輸出到feature map上。
至于卷積層為什么可以提取特征并取得很好的效果,可以看下面表示特征的卷積核與輸入圖片進(jìn)行運算后提取的feature map

可以看出不同卷積核將提取圖片中不同的特征,一般第一層提取的都是邊、角、色彩強(qiáng)度等低維的特征。正如下圖

然后多個卷積層對特征進(jìn)行提取和重組后,就能得到比較復(fù)雜的特征

relu層
我們這里暫且把激勵函數(shù)relu也當(dāng)作一層,卷積后加上relu激勵函數(shù)有

池化層
池化層里我們用的maxpooling,將主要特征保留,舍去多余無用特征,這樣就可以實現(xiàn)信息壓縮,比如下圖所示

經(jīng)過多輪的卷積和池化,將得到最終的特征表示

全連接層
最后用全連接層對特征進(jìn)行擬合

并輸出不同分類的概率

這就是卷積神經(jīng)網(wǎng)絡(luò)獲取特征并實現(xiàn)圖像分類的整個過程,通過這個過程,大家應(yīng)該也對卷積神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)有了比較深刻全面的了解。
五、應(yīng)用
幾個典型的神經(jīng)網(wǎng)絡(luò)應(yīng)用如下
- LeNet,這是最早用起來的卷積神經(jīng)網(wǎng)絡(luò),Yann LeCun在論文LeNet提到。
- AlexNet,2012 ILSVRC比賽遠(yuǎn)超第2名的卷積神經(jīng)網(wǎng)絡(luò),和LeNet的結(jié)構(gòu)比較像,只是更深,同時用多層小卷積層疊加提到大卷積層。
- ZF Net,2013 ILSVRC比賽冠軍,可以參考論文ZF Net
- GoogLeNet,2014 ILSVRC比賽冠軍,Google發(fā)表的論文Going Deeper with
Convolutions有具體介紹。 - VGGNet,也是2014 ILSVRC比賽中的模型,有意思的是,即使這個模型當(dāng)時在分類問題上的效果,略差于google的GoogLeNet,但是在很多圖像轉(zhuǎn)化學(xué)習(xí)問題(比如object detection)上效果奇好,它也證明卷積神經(jīng)網(wǎng)的『深度』對于最后的效果有至關(guān)重要的作用。預(yù)訓(xùn)練好的模型在pretrained
model site可以下載。
參考材料
卷積神經(jīng)網(wǎng)絡(luò):http://blog.csdn.net/stdcoutzyx/article/details/41596663
cs231n 卷積神經(jīng)網(wǎng)絡(luò):http://cs231n.github.io/convolutional-networks/
cnn筆記通俗理解卷積神經(jīng)網(wǎng)絡(luò):http://blog.csdn.net/v_july_v/article/details/51812459
卷積神經(jīng)網(wǎng)絡(luò)工作原理直觀的解釋?:https://www.zhihu.com/question/39022858
CNN入門詳解及TensorFlow源碼實現(xiàn)--深度學(xué)習(xí)筆記:http://blog.csdn.net/qq_31456593/article/details/71108257
[透析] 神經(jīng)網(wǎng)絡(luò)如何工作(視頻):https://www.youtube.com/embed/FmpDIaiMIeA
卷積神經(jīng)網(wǎng)絡(luò):https://www.zybuluo.com/hanbingtao/note/485480