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