之前在網(wǎng)上搜索了好多好多關(guān)于CNN的文章,由于網(wǎng)絡(luò)上的文章很多斷章取義或者描述不清晰,看了很多youtobe上面的教學(xué)視頻還是沒有弄懂,最后經(jīng)過痛苦漫長的煎熬之后對于神經(jīng)網(wǎng)絡(luò)和卷積有了粗淺的了解。
于是在這里記錄下所學(xué)到的知識,關(guān)于CNN 卷積神經(jīng)網(wǎng)絡(luò),需要總結(jié)深入的知識有很多:
人工神經(jīng)網(wǎng)絡(luò) ANN
卷積神經(jīng)網(wǎng)絡(luò) CNN
卷積神經(jīng)網(wǎng)絡(luò) CNN - BP算法
卷積神經(jīng)網(wǎng)絡(luò) CNN - LetNet分析
卷積神經(jīng)網(wǎng)絡(luò) CNN - caffe應(yīng)用
全卷積神經(jīng)網(wǎng) FCN
如果對于人工神經(jīng)網(wǎng)絡(luò)或者神經(jīng)元模型不是太了解,建議先去了解《人工神經(jīng)網(wǎng)絡(luò)ANN》。
卷積神經(jīng)網(wǎng)絡(luò)
卷積神經(jīng)網(wǎng)絡(luò)說白了就是神經(jīng)網(wǎng)絡(luò)的一種分支,因此看懂神經(jīng)元尤為重要:
?
卷積神經(jīng)網(wǎng)絡(luò)沿用了普通的神經(jīng)元網(wǎng)絡(luò)即多層感知器的結(jié)構(gòu),是一個前饋網(wǎng)絡(luò)。以應(yīng)用于圖像領(lǐng)域的CNN為例,大體結(jié)構(gòu)如圖。
?
根據(jù)上圖 卷積神經(jīng)網(wǎng)絡(luò) ConvNet 可以分為4大層:
1. 圖像輸入Image Input:為了減小后續(xù)BP算法處理的復(fù)雜度,一般建議使用灰度圖像。也可以使用RGB彩色圖像,此時輸入圖像原始圖像的RGB三通道。對于輸入的圖像像素分量為 [0, 255],為了計算方便一般需要?dú)w一化,如果使用sigmoid激活函數(shù),則歸一化到[0, 1],如果使用tanh激活函數(shù),則歸一化到[-1, 1]。
2. 卷積層(Convolution Layer):特征提取層(C層) - 特征映射層(S層)。將上一層的輸出圖像與本層卷積核(權(quán)重參數(shù)w)加權(quán)值,加偏置,通過一個Sigmoid函數(shù)得到各個C層,然后下采樣subsampling得到各個S層。C層和S層的輸出稱為Feature Map(特征圖)。
3. 光柵化(Rasterization):為了與傳統(tǒng)的多層感知器MLP全連接,把上一層的所有Feature Map的每個像素依次展開,排成一列。
4. 多層感知器(MLP):最后一層為分類器,一般使用Softmax,如果是二分類,當(dāng)然也可以使用線性回歸Logistic Regression,SVM,RBM。
詳細(xì)地展開2卷積層:
C層:特征提取層。每個神經(jīng)元的輸入與前一層的局部接受域相連,并提取該局部的特征。一旦該局部特征被提取后,它與其它特征間的位置關(guān)系也隨之確定下來。
S層:特征映射層。網(wǎng)絡(luò)的每個計算層由多個特征映射組成,每個特征映射為一個平面,平面上所有神經(jīng)元的權(quán)值相等。特征映射結(jié)構(gòu)采用影響函數(shù)核小的sigmoid函數(shù)作為卷積網(wǎng)絡(luò)的激活函數(shù),使得特征映射具有位移不變性。特征映射結(jié)構(gòu)采用影響函數(shù)核小的sigmoid函數(shù)作為卷積網(wǎng)絡(luò)的激活函數(shù),使得特征映射具有位移不變性。此外,由于一個映射面上的神經(jīng)元共享權(quán)值,因而減少了網(wǎng)絡(luò)自由參數(shù)的個數(shù)。卷積神經(jīng)網(wǎng)絡(luò)中的每一個卷積層都緊跟著一個用來求局部平均與二次提取的計算層,這種特有的兩次特征提取結(jié)構(gòu)減小了特征分辨率。
此外,由于一個映射面上的神經(jīng)元共享權(quán)值,因而減少了網(wǎng)絡(luò)自由參數(shù)的個數(shù),降低了網(wǎng)絡(luò)參數(shù)選擇的復(fù)雜度。卷積神經(jīng)網(wǎng)絡(luò)中的每一個特征提取層(C層)都緊跟著一個用來求局部平均與二次提取的計算層(S層),這種特有的兩次特征提取結(jié)構(gòu)使網(wǎng)絡(luò)在識別時對輸入樣本有較高的畸變?nèi)萑棠芰Α?/p>
?
1 卷積
卷積層是卷積核在上一級輸入層上通過逐一滑動窗口計算而得,卷積核中的每一個參數(shù)都相當(dāng)于傳統(tǒng)神經(jīng)網(wǎng)絡(luò)中的權(quán)值參數(shù),與對應(yīng)的局部像素相連接,將卷積核的各個參數(shù)與對應(yīng)的局部像素值相乘之和,(通常還要再加上一個偏置參數(shù)),得到卷積層上的結(jié)果。如下圖所示。
?
今天公司學(xué)通訊的同事跟我討論到底卷積是個什么東西,給我說通過卷積后,信號當(dāng)中特別是時域會放大,https://en.wikipedia.org/wiki/Convolution。因此在FCN當(dāng)中會通過卷積越變越大,但是這明明違背了圖像卷積的概念。
下面這個動圖更好地解釋:
?
2 CNN三大核心思想
卷積神經(jīng)網(wǎng)絡(luò)CNN的出現(xiàn)是為了解決MLP多層感知器全連接和梯度發(fā)散的問題。其引入三個核心思想:1.局部感知(local field),2.權(quán)值共享(Shared Weights),3.下采樣(subsampling)。極大地提升了計算速度,減少了連接數(shù)量。
2.1 局部感知
形象地說,就是模仿你的眼睛,想想看,你在看東西的時候,目光是聚焦在一個相對很小的局部的吧?嚴(yán)格一些說,普通的多層感知器中,隱層節(jié)點會全連接到一個圖像的每個像素點上,而在卷積神經(jīng)網(wǎng)絡(luò)中,每個隱層節(jié)點只連接到圖像某個足夠小局部的像素點上,從而大大減少需要訓(xùn)練的權(quán)值參數(shù)。
對于一個 1000?1000 的輸入圖像而言,如果下一個隱藏層的神經(jīng)元數(shù)目為 106 個,采用全連接則有 1000?1000?106=1012 個權(quán)值參數(shù),如此數(shù)目巨大的參數(shù)幾乎難以訓(xùn)練;而采用局部連接,隱藏層的每個神經(jīng)元僅與圖像中 10?10的局部圖像相連接,那么此時的權(quán)值參數(shù)數(shù)量為 10?10?106=108,將直接減少4個數(shù)量級。
如下圖所示,左邊是每個像素的全連接,右邊是每行隔兩個像素作為局部連接,因此在數(shù)量上,少了很多權(quán)值參數(shù)數(shù)量(每一條連接每一條線需要有一個權(quán)值參數(shù),具體忘記了的可以回顧單個[神經(jīng)元模型]。因此 局部感知就是:
通過卷積操作,把 全連接變成局部連接 ,因為多層網(wǎng)絡(luò)能夠抽取高階統(tǒng)計特性, 即使網(wǎng)絡(luò)為局部連接,由于格外的突觸連接和額外的神經(jīng)交互作用,也可以使網(wǎng)絡(luò)在不十分嚴(yán)格的意義下獲得一個全局關(guān)系。
?
下面我們來詳細(xì)看一下到底局部感知如何使 全連接變成局部連接,按照人工神經(jīng)網(wǎng)絡(luò)的方法,把輸入圖像的像素一字排開之后,每一個像素值就是一個神經(jīng)元輸入,需要對隱層或者輸出層做全連接,如上圖左側(cè)所示。卷積神經(jīng)網(wǎng)絡(luò)引入卷積概念后,卷積核通過原圖像,然后卷積核對原圖像上符合卷積核大小的像素進(jìn)行加權(quán)求和,每一次只是對符合卷積核的圖像像素做卷積,這就是局部感知的概念,使 全連接變成局部連接。
?
2.2 權(quán)值共享
盡管局部感知使計算量減少了幾個數(shù)量級,但權(quán)重參數(shù)數(shù)量依然很多。能不能再進(jìn)一步減少呢?方法就是權(quán)值共享。
權(quán)值共享:不同的圖像或者同一張圖像共用一個卷積核,減少重復(fù)的卷積核。同一張圖像當(dāng)中可能會出現(xiàn)相同的特征,共享卷積核能夠進(jìn)一步減少權(quán)值參數(shù)。
如下圖所示,為了找到鳥嘴,一個激活函數(shù)A需要檢測圖像左側(cè)有沒有鳥嘴,另外一個激活函數(shù)B需要檢測另外一張圖像中間有沒有類似的鳥嘴。其實,鳥嘴都可能具有同樣的特征,只需要一個激活函數(shù)C就可以了,這個時候,就可以共享同樣的權(quán)值參數(shù)(也就是卷積核)。
?
如果使用了權(quán)值共享(共同使用一個卷積核),那么將可以大大減少卷積核的數(shù)量,加快運(yùn)算速度。天下武功,唯快不破。
?
舉個栗子,在局部連接中隱藏層的每一個神經(jīng)元連接的是一個 10?10 的局部圖像,因此有 10?10 個權(quán)值參數(shù),將這 10?10 個權(quán)值參數(shù)共享給剩下的神經(jīng)元,也就是說隱藏層中 106 個神經(jīng)元的權(quán)值參數(shù)相同,那么此時不管隱藏層神經(jīng)元的數(shù)目是多少,需要訓(xùn)練的參數(shù)就是這 10?10 個權(quán)值參數(shù)(也就是卷積核(也稱濾波器)的大小。
盡管只有這么少的參數(shù),依舊有出色的性能。但是,這樣僅提取了圖像的一種特征,如果要多提取出一些特征,需要增加多個卷積核,不同的卷積核能夠得到圖像的不同映射下的特征,稱之為 Feature Map。如果有100個卷積核,最終的權(quán)值參數(shù)也僅為 100?100=104 個而已。另外,偏置參數(shù)b也是共享的,同一種濾波器共享一個。
2.3 池化
在卷積神經(jīng)網(wǎng)絡(luò)中,沒有必要一定就要對原圖像做處理,而是可以使用某種“壓縮”方法,這就是池化,也就是每次將原圖像卷積后,都通過一個下采樣的過程,來減小圖像的規(guī)模。
pooling的好處有什么?
1. 這些統(tǒng)計特征能夠有更低的維度,減少計算量。
2. 不容易過擬合,當(dāng)參數(shù)過多的時候很容易造成過度擬合。
3. 縮小圖像的規(guī)模,提升計算速度。
如下圖所示,原圖是一張500?500 的圖像,經(jīng)過subsampling之后哦,變成了一張 250?250 的圖像。這樣操作的好處非常明顯,雖然經(jīng)過權(quán)值共享和局部連接后的圖像權(quán)值參數(shù)已經(jīng)大大減少,但是對于計算量來說,還是非常巨大,需要消費(fèi)很大的計算時間,于是為了進(jìn)一步減少計算量,于是加入了subsampling這個概念,不僅僅使圖像像素減少了, 同時也減少計算時間。
?
舉個栗子:以最大池化(Max Pooling)為例,1000×1000的圖像經(jīng)過10×10的卷積核卷積后,得到的是991×991的特征圖,然后使用2×2的池化規(guī)模,即每4個點組成的小方塊中,取最大的一個作為輸出,最終得到的是496×496大小的特征圖。
下采樣,即池化,目的是減小特征圖,池化規(guī)模一般為2×2。常用的池化方法有:
Pooling算法
最大池化(Max Pooling)。取4個點的最大值。這是最常用的池化方法。
均值池化(Mean Pooling)。取4個點的均值。
可訓(xùn)練池化。訓(xùn)練函數(shù) f ,接受4個點為輸入,出入1個點。
由于特征圖的變長不一定是2的倍數(shù),所以在邊緣處理上也有兩種方案:
保留邊緣。將特征圖的變長用0填充為2的倍數(shù),然后再池化。
忽略邊緣。將多出來的邊緣直接省去。
3 CNN 物理意義
了解三個關(guān)于CNN的核心特性之后,來看看CNN的具體是怎么運(yùn)作的。
為了從原始圖像得到C層,需要把原始圖像中的每一個像素值作為神經(jīng)網(wǎng)絡(luò)當(dāng)中一個神經(jīng)元,那么這里把原始輸入圖像一字排開,作為輸入層。通過BP反向傳播算法計算好的權(quán)值參數(shù)(卷積核)去計算C層對應(yīng)的的每一個像素的值。
?
從上圖我們得到了C層,也就是提取特征后得到特征層,需要對特征層處理減少特征數(shù)量,進(jìn)一步抽取高層特性,因此需要進(jìn)步特征映射層(S層)。下圖的pooling層(S層)使用了max pooling算法,pooling核為2x2,沒有重疊部分,取每4個像素中最大的一個像素值作為新的像素值。
?
那么在這個模型當(dāng)中,我們已經(jīng)確定了激活函數(shù)φ(?),輸入x1,x2,...,xn 是確定的,未知量就剩下神經(jīng)元k的突觸權(quán)值wk1,wk2,...,wkn ,bk 偏置。反向傳播算法(back propagation)就是為了求整個神經(jīng)網(wǎng)絡(luò)當(dāng)中的兩種未知變量:權(quán)值 w 和偏置 b。在上圖這個模型當(dāng)中,卷積核大小為3?3,也就是有9個權(quán)值w組成,因此反向傳播的時候就是要求這兩個卷積核的權(quán)值w,使用大量的圖片作為輸入就是為了使用BP算法求得卷積核的值,當(dāng)求得卷積核的值之后,分類的時候輸入一張未知的圖片,然后通過整個網(wǎng)絡(luò),直接就可以得到最終的分類結(jié)果,因為權(quán)值和偏置已經(jīng)通過訓(xùn)練求出來了,整個網(wǎng)絡(luò)沒有未知量。
4 卷積神經(jīng)網(wǎng)絡(luò)圖解
?
回顧一下開篇的CNN網(wǎng)絡(luò)結(jié)構(gòu),輸入圖像通過和三個可訓(xùn)練的濾波器和可加偏置進(jìn)行卷積。
濾波過程如圖,卷積后在C1層產(chǎn)生三個特征映射圖,然后特征映射圖中每組的四個像素再進(jìn)行求和,加權(quán)值,加偏置,通過一個Sigmoid函數(shù)得到三個S2層的特征映射圖。
這些映射圖再進(jìn)過濾波得到C3層。這個層級結(jié)構(gòu)再和S2一樣產(chǎn)生S4,特征映射圖中每組的像素再進(jìn)行求和,加權(quán)值,加偏置,通過一個Sigmoid函數(shù)得到多個freture map(S4)的特征映射圖。
最終,這些像素值被光柵化,并連接成一個向量輸入到傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)進(jìn)行分類判別,得到輸出。
小結(jié)
卷積神經(jīng)網(wǎng)絡(luò)CNN的核心思想是:局部感知(local field),權(quán)值共享(Shared Weights)以及下采樣(subsampling)這三種思想結(jié)合起來,獲得了某種程度的位移、尺度、形變不變性,提高了運(yùn)算速度和精度。
多層網(wǎng)絡(luò)可以根據(jù)其輸入引出高階統(tǒng)計特性, 即使網(wǎng)絡(luò)為局部連接,由于格外的突觸連接和額外的神經(jīng)交互作用,也可以使網(wǎng)絡(luò)在不十分嚴(yán)格的意義下獲得一個全局關(guān)系。這也就是CNN使用局部連接之后還獲得很好的效果的原因。
[1]斯坦福CNN教程
?
評論