最通俗的理解
CNN:
提取特征的過程
先觀察下面兩張圖:
怎么讓機器進行匹配識別呢斯稳?
觀察這兩張X圖海铆,可以發(fā)現(xiàn)盡管像素值無法一一對應,但也存在著某些共同點挣惰。
看到解決思路了沒有卧斟?
如上圖所示,兩張圖中三個同色區(qū)域的結構完全一致憎茂!
從標準的X圖中我們提取出三個特征(feature):
只要用這三個feature便可定位到X的某個局部
feature在CNN中也被成為卷積核(filter)珍语,一般是3X3,或者5X5的大小竖幔。
執(zhí)行卷積運算:
卷積運算就是將原始圖片的與特定的Feature Detector(filter)做卷積運算(符號?)板乙,卷積運算就是將下圖兩個3x3的矩陣作相乘后再相加
下面的動圖更好地解釋了計算過程:
中間的Feature Detector(Filter)會隨機產(chǎn)生好幾種(ex:16種):
利用Feature Detector萃取出物體的邊界
回到本例中螃征,繼續(xù)執(zhí)行卷積運算:
9個都計算完了就會變成這樣:
這張新的圖我們稱之為 feature map (特征圖)盗忱。
進行卷積對應相乘運算并求得均值后,滑動窗便開始向右邊滑動。根據(jù)步長的不同選擇滑動幅度话瞧。比如逊脯,若步長 stride=1究飞,就往右平移一個像素埃疫。若 步長 stride=2,就往右平移兩個像素纠脾。
經(jīng)過一系列卷積對應相乘玛瘸,求均值運算后,終于把一張完整的feature map填滿了.
feature map是每一個feature從原始圖像中提取出來的“特征”苟蹈。其中的值糊渊,越接近為1表示對應位置和feature的匹配越完整,越是接近-1慧脱,表示對應位置和feature的反面匹配越完整渺绒,而值接近0的表示對應位置沒有任何匹配或者說沒有什么關聯(lián)。
一個feature作用于圖片產(chǎn)生一張feature map磷瘤,對這張X圖來說芒篷,我們用的是3個feature搜变,因此最終產(chǎn)生3個 feature map采缚。
非線性激活層
對原圖運算多個卷積后還要產(chǎn)生一組線性激活響應,而非線性激活層是對之前的結果進行一個非線性的激活響應挠他。
在神經(jīng)網(wǎng)絡中用到最多的非線性激活函數(shù)是Relu函數(shù)扳抽,它的公式定義如下:,
使用Relu函數(shù)去掉負值殖侵,更能淬煉出物體的形狀:
保留大于等于0的值贸呢,其余所有小于0的數(shù)值直接改寫為0。
如下圖所示:>=0的值不變
而<0的值一律改寫為0
得到非線性激活函數(shù)作用后的結果:
pooling池化層
池化層的作用是最大的目標就是減少數(shù)據(jù)量拢军。
池化分為兩種楞陷,Max Pooling 最大池化、Average Pooling平均池化茉唉。顧名思義固蛾,最大池化就是取最大值,平均池化就是取平均值度陆。
選擇池化尺寸為2x2艾凯,因為選定一個2x2的窗口,在其內選出最大值更新進新的feature map懂傀。
同樣向右依據(jù)步長滑動窗口:
最終得到池化后的feature map趾诗。可明顯發(fā)現(xiàn)數(shù)據(jù)量減少了很多蹬蚁。
最大池化保留了每一個小塊內的最大值恃泪,相當于保留了這一塊最佳匹配結果(因為值越接近1表示匹配越好)郑兴。
到這里就介紹了CNN的基本配置---卷積層、Relu層贝乎、池化層杈笔。
在常見的幾種CNN中,這三層都是可以堆疊使用的糕非,將前一層的輸入作為后一層的輸出蒙具。比如:
也可以自行添加更多的層以實現(xiàn)更為復雜的神經(jīng)網(wǎng)絡。
全連接層
原圖片尺寸為9X9朽肥,在一系列的卷積禁筏、relu、池化操作后衡招,得到尺寸被壓縮為2X2的三張?zhí)卣鲌D篱昔。
我們最初和最終的目的到底是什么?是對這張照片進行識別始腾,識別它到底是X還是O呢(其實也算是對它進行一個二分類)州刽。
全連接層要做的,就是對之前的所有操作進行一個總結浪箭,給我們一個最終的結果穗椅。
它最大的目的是對特征圖進行維度上的改變,來得到每個分類類別對應的概率值奶栖。全連接層的部分就是將之前的結果平坦化之后接到最基本的神經(jīng)網(wǎng)絡了.
上圖中得到一些2X2的特征圖后匹表,對其應用全連接網(wǎng)絡,再全連接層中有一個非常重要的函數(shù)----Softmax宣鄙,它是一個分類函數(shù)袍镀,輸出的是每個對應類別的概率值。
假設對一張看起來并不標準的圖進行分類冻晤。如下:
對于進行一系列操作后苇羡,假設得到的概率值如下所示:
對結果進行統(tǒng)計分析后可判斷這張圖片里的字母為X。
神經(jīng)網(wǎng)絡的訓練與優(yōu)化
前面說了那么多鼻弧,其實只是一個大致的框架的設計而已设江,里面的參數(shù)具體是多少則是需要訓練的。
針對這個識別X的例子温数,我們可以人為定義三個3X3的卷積核绣硝,便可實現(xiàn)對X的特征提取。但是在實際運用中撑刺,比如識別手寫字母鹉胖,幾乎不可能存在標準的寫法,每個人的字跡都完全不同,因此原來的那三個標準的卷積核就變得不再適用了甫菠,為了提高CNN模型的通用性(機器學習中的“泛化能力”)挠铲,就需要對卷積核進行改寫。經(jīng)過成千上萬的訓練集來訓練寂诱,每一次加入新的數(shù)據(jù)拂苹,都有可能對卷積核里的值造成影響。
那么具體的訓練方法是什么呢痰洒?
就是赫赫有名的BP算法---BackProp反向傳播算法瓢棒。
在訓練時,我們采用的訓練數(shù)據(jù)一般都是帶有標簽label的圖片丘喻。如果圖片中的字母是X脯宿,則label=x,如果圖片中的字母是A泉粉,則label=A连霉。 標簽能直觀地反映圖片。
在最開始嗡靡,訓練前跺撼,我們定義一個大小為3X3的卷積核,那么里面具體的值是多少讨彼,我們都不知道歉井,但又不能為0吧,所以就用隨機初始化法來進行賦值点骑,卷積核獲取到了一個隨機值酣难,便可以開始工作。
卷積神經(jīng)網(wǎng)絡便可以開始工作了黑滴,輸入一張帶有標簽的圖片(假設圖片內容是字母X)。經(jīng)網(wǎng)絡識別后判斷是X的概率為0.3紧索。本來應該是1.0的概率袁辈,現(xiàn)在只有0.3,問題就很明顯了珠漂,存在了很大的誤差晚缩。
一種簡單定義誤差error的計算公式為
訓練的終極目的就是使得這個誤差最小,常用的方法是 梯度下降法媳危。
內部設計的具體復雜公式在此不多做敘述荞彼。
簡單的說可以參照下圖,要使得誤差error最小待笑,就是讓卷積核里的參數(shù)w往梯度下降最小的反向改變鸣皂。
用這種方法來改變卷積核里的參數(shù)W使得誤差最小。
卷積層是構建卷積神經(jīng)網(wǎng)絡的核心層,它產(chǎn)生了網(wǎng)絡中大部分的計算量寞缝。注意是計算量而不是參數(shù)量癌压。
3個超參數(shù)控制著輸出數(shù)據(jù)體的尺寸:深度(depth),步長(stride)和零填充(zero-padding)荆陆。
- 將沿著深度方向排列滩届、感受野相同的神經(jīng)元集合稱為深度列(depth column),也有人使用纖維(fibre)來稱呼它們被啼。
在滑動濾波器的時候帜消,必須指定步長。當步長為1浓体,意味著濾鏡逐個像素地滑動券犁。通過增加步幅大小,濾波器在輸入上滑動的間隔更大汹碱,因此單元之間的重疊更少粘衬。
下面的動畫顯示步幅大小為1。當步長為2咳促,濾波器滑動時每次移動2個像素稚新。
image
- 有時候將輸入數(shù)據(jù)體用0在邊緣處進行填充是很方便的。這個零填充(zero-padding)的尺寸是一個超參數(shù)跪腹。零填充有一個良好性質褂删,即可以控制輸出數(shù)據(jù)體的空間尺寸(最常用的是用來保持輸入數(shù)據(jù)體在空間上的尺寸,使得輸入和輸出的寬高都相等)冲茸。
輸出數(shù)據(jù)體在空間上的尺寸
可以通過輸入數(shù)據(jù)體尺寸
屯阀,卷積層中神經(jīng)元的感受野尺寸(F),步長(S)轴术,濾波器數(shù)量(K)和零填充的數(shù)量(P)計算輸出出來难衰。
一般說來,當步長S=1時逗栽,零填充的值是P=(F-1)/2盖袭,這樣就能保證輸入和輸出數(shù)據(jù)體有相同的空間尺寸。
可視化卷積層的一種好方法如下所示彼宠,最后我們以一張動圖解釋下卷積層到底做了什么:
CNN架構簡單來說就是:圖片經(jīng)過各兩次的Convolution, Pooling, Fully Connected就是CNN的架構了鳄虱,因此只要搞懂Convolution, Pooling, Fully Connected三個部分的內容就可以完全掌握了CNN!