前言
本文總結(jié)了關(guān)于卷積神經(jīng)網(wǎng)絡(luò)(CNN)的一些基礎(chǔ)的概念,并且對(duì)于其中的細(xì)節(jié)進(jìn)行了詳細(xì)的原理講解,通過(guò)此文可以十分全面的了解卷積神經(jīng)網(wǎng)絡(luò)(CNN),非常適合于作為Deep Learning的入門學(xué)習(xí)。下面就是本篇博客的全部?jī)?nèi)容!
一、什么是卷積神經(jīng)網(wǎng)絡(luò)
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks, CNN)這個(gè)概念的提出可以追溯到二十世紀(jì)80~90年代,但是有那么一段時(shí)間這個(gè)概念被“雪藏”了,因?yàn)楫?dāng)時(shí)的硬件和軟件技術(shù)比較落后,而隨著各種深度學(xué)習(xí)理論相繼被提出以及數(shù)值計(jì)算設(shè)備的高速發(fā)展,卷積神經(jīng)網(wǎng)絡(luò)得到了快速發(fā)展。
那究竟什么是卷積神經(jīng)網(wǎng)絡(luò)呢?以手寫數(shù)字識(shí)別為例,整個(gè)識(shí)別的過(guò)程如下所示:
圖1:手寫數(shù)字識(shí)別過(guò)程
話說(shuō)回來(lái),可以看到整個(gè)過(guò)程需要在如下幾層進(jìn)行運(yùn)算:
•輸入層:輸入圖像等信息
•卷積層:用來(lái)提取圖像的底層特征
•池化層:防止過(guò)擬合,將數(shù)據(jù)維度減小
•全連接層:匯總卷積層和池化層得到的圖像的底層特征和信息
•輸出層:根據(jù)全連接層的信息得到概率最大的結(jié)果
可以看到其中最重要的一層就是卷積層,這也是卷積神經(jīng)網(wǎng)絡(luò)名稱的由來(lái),下面將會(huì)詳細(xì)講解這幾層的相關(guān)內(nèi)容。
二、輸入層
輸入層比較簡(jiǎn)單,這一層的主要工作就是輸入圖像等信息,因?yàn)榫矸e神經(jīng)網(wǎng)絡(luò)主要處理的是圖像相關(guān)的內(nèi)容,但是我們?nèi)搜劭吹降膱D像和計(jì)算機(jī)處理的圖像是一樣的么?
很明顯是不一樣的,對(duì)于輸入圖像,首先要將其轉(zhuǎn)換為對(duì)應(yīng)的二維矩陣,這個(gè)二位矩陣就是由圖像每一個(gè)像素的像素值大小組成的,我們可以看一個(gè)例子,如下圖所示的手寫數(shù)字“8”的圖像,計(jì)算機(jī)讀取后是以像素值大小組成的二維矩陣存儲(chǔ)的圖像。
圖2:數(shù)字8的灰度圖像與其對(duì)應(yīng)的二維矩陣
上圖又稱為灰度圖像,因?yàn)槠涿恳粋(gè)像素值的范圍是0~255(由純黑色到純白色),表示其顏色強(qiáng)弱程度。另外還有黑白圖像,每個(gè)像素值要么是0(表示純黑色),要么是255(表示純白色)。
我們?nèi)粘I钪凶畛R?jiàn)的就是RGB圖像,有三個(gè)通道,分別是紅色、綠色、藍(lán)色。每個(gè)通道的每個(gè)像素值的范圍也是0~255,表示其每個(gè)像素的顏色強(qiáng)弱。
但是我們?nèi)粘L幚淼幕径际腔叶葓D像,因?yàn)楸容^好操作(值范圍較小,顏色較單一),有些RGB圖像在輸入給神經(jīng)網(wǎng)絡(luò)之前也被轉(zhuǎn)化為灰度圖像,也是為了方便計(jì)算,否則三個(gè)通道的像素一起處理計(jì)算量非常大。
當(dāng)然,隨著計(jì)算機(jī)性能的高速發(fā)展,現(xiàn)在有些神經(jīng)網(wǎng)絡(luò)也可以處理三通道的RGB圖像。
現(xiàn)在我們已經(jīng)知道了,輸入層的作用就是將圖像轉(zhuǎn)換為其對(duì)應(yīng)的由像素值構(gòu)成的二維矩陣,并將此二維矩陣存儲(chǔ),等待后面幾層的操作。
三、卷積層
那圖片輸入進(jìn)來(lái)之后該怎么處理呢?
假設(shè)我們已經(jīng)得到圖片的二維矩陣了,想要提取其中特征,那么卷積操作就會(huì)為存在特征的區(qū)域確定一個(gè)高值,否則確定一個(gè)低值。這個(gè)過(guò)程需要通過(guò)計(jì)算其與卷積核(Convolution Kernel)的乘積值來(lái)確定。
假設(shè)我們現(xiàn)在的輸入圖片是一個(gè)人的腦袋,而人的眼睛是我們需要提取的特征,那么我們就將人的眼睛作為卷積核,通過(guò)在人的腦袋的圖片上移動(dòng)來(lái)確定哪里是眼睛,這個(gè)過(guò)程如下所示:
圖3:提取人的眼睛的特征的過(guò)程
通過(guò)整個(gè)卷積過(guò)程又得到一個(gè)新的二維矩陣,此二維矩陣也被稱為特征圖(Feature Map),最后我們可以將得到的特征圖進(jìn)行上色處理(我只是打個(gè)比方,比如高值為白色,低值為黑色),最后可以提取到關(guān)于人的眼睛的特征,如下所示:
圖4:提取人的眼睛的特征的結(jié)果
看著上面的描述可能有點(diǎn)懵,別急,首先卷積核也是一個(gè)二維矩陣,當(dāng)然這個(gè)二維矩陣要比輸入圖像的二維矩陣要小或相等,卷積核通過(guò)在輸入圖像的二維矩陣上不停的移動(dòng),每一次移動(dòng)都進(jìn)行一次乘積的求和,作為此位置的值,這個(gè)過(guò)程如下圖所示:
圖5:卷積的過(guò)程
可以看到,整個(gè)過(guò)程就是一個(gè)降維的過(guò)程,通過(guò)卷積核的不停移動(dòng)計(jì)算,可以提取圖像中最有用的特征。
我們通常將卷積核計(jì)算得到的新的二維矩陣稱為特征圖,比如上方動(dòng)圖中,下方移動(dòng)的深藍(lán)色正方形就是卷積核,上方不動(dòng)的青色正方形就是特征圖。
有的讀者可能注意到,每次卷積核移動(dòng)的時(shí)候中間位置都被計(jì)算了,而輸入圖像二維矩陣的邊緣卻只計(jì)算了一次,會(huì)不會(huì)導(dǎo)致計(jì)算的結(jié)果不準(zhǔn)確呢?
讓我們仔細(xì)思考,如果每次計(jì)算的時(shí)候,邊緣只被計(jì)算一次,而中間被多次計(jì)算,那么得到的特征圖也會(huì)丟失邊緣特征,最終會(huì)導(dǎo)致特征提取不準(zhǔn)確,那為了解決這個(gè)問(wèn)題。
我們可以在原始的輸入圖像的二維矩陣周圍再拓展一圈或者幾圈,這樣每個(gè)位置都可以被公平的計(jì)算到了,也就不會(huì)丟失任何特征,此過(guò)程可見(jiàn)下面兩種情況,這種通過(guò)拓展解決特征丟失的方法又被稱為Padding。
•Padding取值為1,拓展一圈
圖6:Padding為1時(shí)卷積的過(guò)程
•Padding取值為2,拓展兩圈
圖7:Padding為2時(shí)卷積的過(guò)程
那如果情況再?gòu)?fù)雜一些呢?如果我們使用兩個(gè)卷積核去提取一張彩色圖片呢?
之前我們介紹過(guò),彩色圖片都是三個(gè)通道,也就是說(shuō)一個(gè)彩色圖片會(huì)有三個(gè)二維矩陣,當(dāng)然,我們僅以第一個(gè)通道示例,否則太多了也不好介紹。
此時(shí)我們使用兩組卷積核,每組卷積核都用來(lái)提取自己通道的二維矩陣的特征,剛才說(shuō)了,我們只考慮第一通道的,所以說(shuō)我們只需要用兩組卷積核的第一個(gè)卷積核來(lái)計(jì)算得到特征圖就可以了,那么這個(gè)過(guò)程可見(jiàn)下圖
圖8:兩個(gè)卷積核進(jìn)行卷積的過(guò)程
看著上面的動(dòng)圖確實(shí)有些不知所措是吧,我來(lái)解釋一下,按照剛才的思路,輸入圖片是彩色圖片,有三個(gè)通道,所以輸入圖片的尺寸就是7×7×3,而我們只考慮第一個(gè)通道,也就是從第一個(gè)7×7的二維矩陣中提取特征。
那么我們只需要使用每組卷積核的第一個(gè)卷積核即可,這里可能有讀者會(huì)注意到Bias,其實(shí)它就是偏置項(xiàng),最后計(jì)算的結(jié)果加上它就可以了,最終通過(guò)計(jì)算就可以得到特征圖了。
可以發(fā)現(xiàn),有幾個(gè)卷積核就有幾個(gè)特征圖,因?yàn)槲覀儸F(xiàn)在只使用了兩個(gè)卷積核,所以會(huì)得到兩個(gè)特征圖。
以上就是關(guān)于卷積層的一些相關(guān)知識(shí),當(dāng)然,本文也只是一個(gè)入門,所以說(shuō)還有一些比較復(fù)雜的內(nèi)容沒(méi)有進(jìn)行深入闡述,這個(gè)就需要等到過(guò)后的學(xué)習(xí)與總結(jié)了。
四、池化層
剛才我們也提到了,有幾個(gè)卷積核就有多少個(gè)特征圖,現(xiàn)實(shí)中情況肯定更為復(fù)雜,也就會(huì)有更多的卷積核,那么就會(huì)有更多的特征圖,當(dāng)特征圖非常多的時(shí)候,意味著我們得到的特征也非常多,但是這么多特征都是我們所需要的么?
顯然不是,其實(shí)有很多特征我們是不需要的,而這些多余的特征通常會(huì)給我們帶來(lái)如下兩個(gè)問(wèn)題:
•過(guò)擬合
•維度過(guò)高
為了解決這個(gè)問(wèn)題,我們可以利用池化層,那什么是池化層呢?
池化層又稱為下采樣,也就是說(shuō),當(dāng)我們進(jìn)行卷積操作后,再將得到的特征圖進(jìn)行特征提取,將其中最具有代表性的特征提取出來(lái),可以起到減小過(guò)擬合和降低維度的作用,這個(gè)過(guò)程如下所示:
圖9:池化的過(guò)程
那有的讀者可能會(huì)問(wèn)了,我應(yīng)該以什么規(guī)則進(jìn)行特征提取呢?
其實(shí)這個(gè)過(guò)程類似于卷積的過(guò)程,就是一個(gè)正方形的小方塊在圖片上進(jìn)行移動(dòng),每次我們?nèi)∵@個(gè)正方形方框中最具有代表性的特征,那么問(wèn)題又來(lái)了,如何提取到最有代表性的特征呢,通常有兩種方法:
•最大池化
顧名思義,最大池化就是每次取正方形中所有值的最大值,這個(gè)最大值也就相當(dāng)于當(dāng)前位置最具有代表性的特征,這個(gè)過(guò)程如下所示:
圖10:最大池化的過(guò)程
這里有幾個(gè)參數(shù)需要說(shuō)明一下:
① kernel_size = 2:池化過(guò)程使用的正方形尺寸是2×2,如果是在卷積的過(guò)程中就說(shuō)明卷積核的大小是2×2
② stride = 2:每次正方形移動(dòng)兩個(gè)位置(從左到右,從上到下),這個(gè)過(guò)程其實(shí)和卷積的操作過(guò)程一樣
③ padding = 0:這個(gè)之前介紹過(guò),如果此值為0,說(shuō)明沒(méi)有進(jìn)行拓展
•平均池化
平均池化就是取此正方形區(qū)域中所有值的平均值,考慮到每個(gè)位置的值對(duì)于此處特征的影響,平均池化計(jì)算也比較簡(jiǎn)單,整個(gè)過(guò)程如下圖所示:
圖11:平均池化的過(guò)程
對(duì)于其中的參數(shù)含義與上面介紹的最大池化一致,另外,需要注意計(jì)算平均池化時(shí)采用向上取整。
以上就是關(guān)于池化層的所有操作,我們?cè)倩仡櫼幌,?jīng)過(guò)池化后,我們可以提取到更有代表性的特征。
同時(shí)還減少了不必要的計(jì)算,這對(duì)于我們現(xiàn)實(shí)中的神經(jīng)網(wǎng)絡(luò)計(jì)算大有脾益,因?yàn)楝F(xiàn)實(shí)情況中神經(jīng)網(wǎng)絡(luò)非常大,而經(jīng)過(guò)池化層后,就可以明顯的提高模型的效率。
所以說(shuō),池化層的好處很多,將其優(yōu)點(diǎn)總結(jié)如下:
•在減少參數(shù)量的同時(shí),還保留了原圖像的原始特征
•有效防止過(guò)擬合
•為卷積神經(jīng)網(wǎng)絡(luò)帶來(lái)平移不變性
以上兩個(gè)優(yōu)點(diǎn)我們之前已經(jīng)介紹過(guò)了,那什么又是平移不變性呢?可以用我們之前的一個(gè)例子,如下圖所示:
圖12:池化的平移不變性
可以看到,兩張?jiān)紙D片的位置有所不同,一個(gè)是正常的,另一個(gè)是人的腦袋稍稍左移了一些。
經(jīng)過(guò)卷積操作后,得到各自對(duì)應(yīng)的特征圖,這兩張?zhí)卣鲌D也和原始圖片的位置相對(duì)應(yīng),一個(gè)眼睛特征的位置是正常的,另一個(gè)眼睛特征的位置稍稍左移了一些。
雖然人可以分辨,但是經(jīng)過(guò)神經(jīng)網(wǎng)絡(luò)計(jì)算后,就可能帶來(lái)誤差,因?yàn)閼?yīng)該出現(xiàn)眼睛的位置并沒(méi)有出現(xiàn)眼睛,那應(yīng)該怎么辦呢?
此時(shí)使用池化層進(jìn)行池化操作,可以發(fā)現(xiàn),雖然池化之前兩幅圖片的眼睛特征不在一個(gè)位置,但是經(jīng)過(guò)池化之后,眼睛特征的位置都是相同的,這就為后續(xù)神經(jīng)網(wǎng)絡(luò)的計(jì)算帶來(lái)了方便,此性質(zhì)就是池化的平移不變性
五、全連接層
假設(shè)還是上面人的腦袋的示例,現(xiàn)在我們已經(jīng)通過(guò)卷積和池化提取到了這個(gè)人的眼睛、鼻子和嘴的特征,如果我想利用這些特征來(lái)識(shí)別這個(gè)圖片是否是人的腦袋該怎么辦呢?
此時(shí)我們只需要將提取到的所有特征圖進(jìn)行“展平”,將其維度變?yōu)? × x 1×x1×x,這個(gè)過(guò)程就是全連接的過(guò)程。
也就是說(shuō),此步我們將所有的特征都展開(kāi)并進(jìn)行運(yùn)算,最后會(huì)得到一個(gè)概率值,這個(gè)概率值就是輸入圖片是否是人的概率,這個(gè)過(guò)程如下所示:
圖13:全連接的過(guò)程
單看這個(gè)過(guò)程可能還是不太清晰,所以我們可以把之前的過(guò)程與全連接層結(jié)合起來(lái),如下圖所示:
圖14:整個(gè)過(guò)程
可以看到,經(jīng)過(guò)兩次卷積和最大池化之后,得到最后的特征圖,此時(shí)的特征都是經(jīng)過(guò)計(jì)算后得到的,所以代表性比較強(qiáng),最后經(jīng)過(guò)全連接層,展開(kāi)為一維的向量,再經(jīng)過(guò)一次計(jì)算后,得到最終的識(shí)別概率,這就是卷積神經(jīng)網(wǎng)絡(luò)的整個(gè)過(guò)程。
六、輸出層
卷積神經(jīng)網(wǎng)絡(luò)的輸出層理解起來(lái)就比較簡(jiǎn)單了,我們只需要將全連接層得到的一維向量經(jīng)過(guò)計(jì)算后得到識(shí)別值的一個(gè)概率,當(dāng)然,這個(gè)計(jì)算可能是線性的,也可能是非線性的。
在深度學(xué)習(xí)中,我們需要識(shí)別的結(jié)果一般都是多分類的,所以每個(gè)位置都會(huì)有一個(gè)概率值,代表識(shí)別為當(dāng)前值的概率,取最大的概率值,就是最終的識(shí)別結(jié)果。
在訓(xùn)練的過(guò)程中,可以通過(guò)不斷地調(diào)整參數(shù)值來(lái)使識(shí)別結(jié)果更準(zhǔn)確,從而達(dá)到最高的模型準(zhǔn)確率。
圖15:輸出層示意圖
七、回顧整個(gè)過(guò)程
卷積神經(jīng)網(wǎng)絡(luò)最經(jīng)典的應(yīng)用莫過(guò)于手寫數(shù)字識(shí)別了,比如我現(xiàn)在手寫一個(gè)數(shù)字8,那么卷積神經(jīng)網(wǎng)絡(luò)是如何識(shí)別出來(lái)的呢?整個(gè)識(shí)別的過(guò)程如下圖所示:
圖16:手寫數(shù)字識(shí)別的過(guò)程
1. 將手寫數(shù)字圖片轉(zhuǎn)換為像素矩陣
2. 對(duì)像素矩陣進(jìn)行Padding不為0的卷積運(yùn)算,目的是保留邊緣特征,生成一個(gè)特征圖
3. 對(duì)這個(gè)特征圖使用六個(gè)卷積核進(jìn)行卷積運(yùn)算,得到六個(gè)特征圖
4. 對(duì)每個(gè)特征圖進(jìn)行池化操作(也可稱為下采樣操作),在保留特征的同時(shí)縮小數(shù)據(jù)流,生成六個(gè)小圖,這六個(gè)小圖和上一層各自的特征圖長(zhǎng)得很像,但尺寸縮小了
5. 對(duì)池化操作后得到的六個(gè)小圖進(jìn)行第二次卷積運(yùn)算,生成了更多的特征圖
6. 對(duì)第二次卷積生成的特征圖進(jìn)行池化操作(下采樣操作)
7. 將第二次池化操作得到的特征進(jìn)行第一次全連接
8. 將第一次全連接的結(jié)果進(jìn)行第二次全連接
9.將第二次全鏈接的結(jié)果進(jìn)行最后一次運(yùn)算,這種運(yùn)算可能是線性的也可能是非線性的,最終每個(gè)位置(一共十個(gè)位置,從0到9)都有一個(gè)概率值,這個(gè)概率值就是將輸入的手寫數(shù)字識(shí)別為當(dāng)前位置數(shù)字的概率,最后以概率最大的位置的值作為識(shí)別結(jié)果。
可以看到,右側(cè)上方是我的手寫數(shù)字,右側(cè)下方是模型(LeNet)的識(shí)別結(jié)果,最終的識(shí)別結(jié)果與我輸入的手寫數(shù)字是一致的,這一點(diǎn)從圖片左邊最上邊也可以看到,說(shuō)明此模型可以成功識(shí)別手寫數(shù)字
總結(jié)
以上就是本篇博客的全部?jī)?nèi)容了,可以看到內(nèi)容寫的非常充實(shí),也耗費(fèi)了我不少時(shí)間來(lái)總結(jié),希望可以和大家一起學(xué)習(xí)、進(jìn)步。另外,由于本人水平有限,有錯(cuò)的地方還望讀者指正,謝謝大家!