卷積神經(jīng)網(wǎng)絡(luò)實(shí)戰(zhàn)——使用keras識(shí)別貓咪
在近些年,深度學(xué)習(xí)領(lǐng)域的卷積神經(jīng)網(wǎng)絡(luò)(CNNs或ConvNets)在各行各業(yè)為我們解決了大量的實(shí)際問題。但是對(duì)于大多數(shù)人來說,CNN仿佛戴上了神秘的面紗。我經(jīng)常會(huì)想,要是能將神經(jīng)網(wǎng)絡(luò)的過程分解,看一看每一個(gè)步驟是什么樣的結(jié)果該有多好!這也就是這篇博客存在的意義。
高級(jí)CNN
首先,我們要了解一下卷積神經(jīng)網(wǎng)絡(luò)擅長(zhǎng)什么。CNN主要被用來找尋圖片中的模式。這個(gè)過程主要有兩個(gè)步驟,首先要對(duì)圖片做卷積,然后找尋模式。在神經(jīng)網(wǎng)絡(luò)中,前幾層是用來尋找邊界和角,隨著層數(shù)的增加,我們就能識(shí)別更加復(fù)雜的特征。這個(gè)性質(zhì)讓CNN非常擅長(zhǎng)識(shí)別圖片中的物體。
CNN是什么
CNN是一種特殊的神經(jīng)網(wǎng)絡(luò),它包含卷積層、池化層和激活層。
卷積層
要想了解什么是卷積神經(jīng)網(wǎng)絡(luò),你首先要知道卷積是怎么工作的。想象你有一個(gè)5*5矩陣表示的圖片,然后你用一個(gè)3*3的矩陣在圖片中滑動(dòng)。每當(dāng)3*3矩陣經(jīng)過的點(diǎn)就用原矩陣中被覆蓋的矩陣和這個(gè)矩陣相乘。這樣一來,我們可以使用一個(gè)值來表示當(dāng)前窗口中的所有點(diǎn)。下面是一個(gè)過程的動(dòng)圖:
正如你所見的那樣,特征矩陣中的每一個(gè)項(xiàng)都和原圖中的一個(gè)區(qū)域相關(guān)。
在圖中像窗口一樣移動(dòng)的叫做核。核一般都是方陣,對(duì)于小圖片來說,一般選用3*3的矩陣就可以了。每次窗口移動(dòng)的距離叫做步長(zhǎng)。值得注意的是,一些圖片在邊界會(huì)被填充零,如果直接進(jìn)行卷積運(yùn)算的話會(huì)導(dǎo)致邊界處的數(shù)據(jù)變小(當(dāng)然圖片中間的數(shù)據(jù)更重要)。
卷積層的主要目的是濾波。當(dāng)我們?cè)趫D片上操作時(shí),我們可以很容易得檢查出那部分的模式,這是由于我們使用了濾波,我們用權(quán)重向量乘以卷積之后的輸出。當(dāng)訓(xùn)練一張圖片時(shí),這些權(quán)重會(huì)不斷改變,而且當(dāng)遇到之前見過的模式時(shí),相應(yīng)的權(quán)值會(huì)提高。來自各種濾波器的高權(quán)重的組合讓網(wǎng)絡(luò)預(yù)測(cè)圖像的內(nèi)容的能力。 這就是為什么在CNN架構(gòu)圖中,卷積步驟由一個(gè)框而不是一個(gè)矩形表示; 第三維代表濾波器。
注意事項(xiàng):
卷積運(yùn)算后的輸出無論在寬度上還是高度上都比原來的小
核和圖片窗口之間進(jìn)行的是線性的運(yùn)算
濾波器中的權(quán)重是通過許多圖片學(xué)習(xí)的
池化層
池化層和卷積層很類似,也是用一個(gè)卷積核在圖上移動(dòng)。唯一的不同就是池化層中核和圖片窗口的操作不再是線性的。
***池化和平均池化是最常見的池化函數(shù)。***池化選取當(dāng)前核覆蓋的圖片窗口中***的數(shù),而平均池化則是選擇圖片窗口的均值。
激活層
在CNN中,激活函數(shù)和其他網(wǎng)絡(luò)一樣,函數(shù)將數(shù)值壓縮在一個(gè)范圍內(nèi)。下面列出了一些常見的函數(shù)。
在CNN中最常用的是relu(修正線性單元)。人們有許多喜歡relu的理由,但是最重要的一點(diǎn)就是它非常的易于實(shí)現(xiàn),如果數(shù)值是負(fù)數(shù)則輸出0,否則輸出本身。這種函數(shù)運(yùn)算簡(jiǎn)單,所以訓(xùn)練網(wǎng)絡(luò)也非???。
回顧:
CNN中主要有三種層,分別是:卷積層、池化層和激活層。
卷積層使用卷積核和圖片窗口相乘,并使用梯度下降法去優(yōu)化卷積核。
池化層使用***值或者均值來描述一個(gè)圖形窗口。
激活層使用一個(gè)激活函數(shù)將輸入壓縮到一個(gè)范圍中,典型的[0,1][-1,1]。
CNN是什么樣的呢?
在我們深入了解CNN之前,讓我們先補(bǔ)充一些背景知識(shí)。早在上世紀(jì)90年代,Yann LeCun就使用CNN做了一個(gè)手寫數(shù)字識(shí)別的程序。而隨著時(shí)代的發(fā)展,尤其是計(jì)算機(jī)性能和GPU的改進(jìn),研究人員有了更加豐富的想象空間。 2010年斯坦福的機(jī)器視覺實(shí)驗(yàn)室發(fā)布了ImageNet項(xiàng)目。該項(xiàng)目包含1400萬帶有描述標(biāo)簽的圖片。這個(gè)幾乎已經(jīng)成為了比較CNN模型的標(biāo)準(zhǔn)。目前,***的模型在這個(gè)數(shù)據(jù)集上能達(dá)到94%的準(zhǔn)確率。人們不斷的改善模型來提高準(zhǔn)確率。在2014年GoogLeNet 和VGGNet成為了***的模型,而在此之前是ZFNet。CNN應(yīng)用于ImageNet的***個(gè)可行例子是AlexNet,在此之前,研究人員試圖使用傳統(tǒng)的計(jì)算機(jī)視覺技術(shù),但AlexNet的表現(xiàn)要比其他一切都高出15%。讓我們一起看一下LeNet:
這個(gè)圖中并沒有顯示激活層,整個(gè)的流程是:
輸入圖片 →卷積層 →Relu → ***池化→卷積層 →Relu→ ***池化→隱藏層 →Softmax (activation)→輸出層。
讓我們一起看一個(gè)實(shí)際的例子
下圖是一個(gè)貓的圖片:
這張圖長(zhǎng)400像素寬320像素,有三個(gè)通道(rgb)的顏色。
那么經(jīng)過一層卷積運(yùn)算之后會(huì)變成什么樣子呢?
這是用一個(gè)3*3的卷積核和三個(gè)濾波器處理的效果(如果我們有超過3個(gè)的濾波器,那么我可以畫出貓的2d圖像。更高維的話就很難處理)
我們可以看到,圖中的貓非常的模糊,因?yàn)槲覀兪褂昧艘粋€(gè)隨機(jī)的初始值,而且我們還沒有訓(xùn)練網(wǎng)絡(luò)。他們都在彼此的頂端,即使每層都有細(xì)節(jié),我們將無法看到它。但我們可以制作出與眼睛和背景相同顏色的貓的區(qū)域。如果我們將內(nèi)核大小增加到10x10,會(huì)發(fā)生什么呢?
我們可以看到,由于內(nèi)核太大,我們失去了一些細(xì)節(jié)。還要注意,從數(shù)學(xué)角度來看,卷積核越大,圖像的形狀會(huì)變得越小。
如果我們把它壓扁一點(diǎn),我們可以更好的看到色彩通道會(huì)發(fā)生什么?
這張看起來好多了!現(xiàn)在我們可以看到我們的過濾器看到的一些事情??雌饋砑t色替換掉了黑色的鼻子和黑色眼睛,藍(lán)色替換掉了貓邊界的淺灰色。我們可以開始看到圖層如何捕獲照片中的一些更重要的細(xì)節(jié)。
如果我們?cè)黾觾?nèi)核大小,我們得到的細(xì)節(jié)就會(huì)越來越明顯,當(dāng)然圖像也比其他兩個(gè)都小。
增加一個(gè)激活層
我們通過添加一個(gè)relu,去掉了很多不是藍(lán)色的部分。
增加一個(gè)池化層
我們添加一個(gè)池化層(擺脫激活層***限度地讓圖片更加更容易顯示)。
正如預(yù)期的那樣,貓咪變成了斑駁的,而我們可以讓它更加斑駁。
現(xiàn)在圖片大約成了原來的三分之一。
激活和***池化
LeNet
如果我們將貓咪的圖片放到LeNet模型中做卷積和池化,那么效果會(huì)怎么樣呢?
總結(jié)
ConvNets功能強(qiáng)大,因?yàn)樗鼈兡軌蛱崛D像的核心特征,并使用這些特征來識(shí)別包含其中的特征的圖像。即使我們的兩層CNN,我們也可以開始看到網(wǎng)絡(luò)正在對(duì)貓的晶須,鼻子和眼睛這樣的地區(qū)給予很多的關(guān)注。這些是讓CNN將貓與鳥區(qū)分開的特征的類型。
CNN是非常強(qiáng)大的,雖然這些可視化并不***,但我希望他們能夠幫助像我這樣正在嘗試更好地理解ConvNets的人。

















































