python识别人脸多种属性_人脸检测及识别python实现系列(4)——卷积神经网络(CNN)入门...
人臉檢測(cè)及識(shí)別python實(shí)現(xiàn)系列(4)——卷積神經(jīng)網(wǎng)絡(luò)(CNN)入門
上篇博文我們準(zhǔn)備好了2000張訓(xùn)練數(shù)據(jù),接下來(lái)的幾節(jié)我們將詳細(xì)講述如何利用這些數(shù)據(jù)訓(xùn)練我們的識(shí)別模型。前面說(shuō)過(guò),原博文給出的訓(xùn)練程序使用的是keras庫(kù),對(duì)我的機(jī)器來(lái)說(shuō)就是tensorflow版的keras。訓(xùn)練程序建立了一個(gè)包含4個(gè)卷積層的神經(jīng)網(wǎng)絡(luò)(CNN),程序利用這個(gè)網(wǎng)絡(luò)訓(xùn)練我的人臉識(shí)別模型,并將最終訓(xùn)練結(jié)果保存到硬盤上。在我們實(shí)際動(dòng)手操練之前我們必須先弄明白一個(gè)問(wèn)題——什么是卷積神經(jīng)網(wǎng)絡(luò)(CNN)?
CNN(Convolutional Neural Network)——卷積神經(jīng)網(wǎng)絡(luò),人工神經(jīng)網(wǎng)絡(luò)(Neural Network,NN)的一種,其它還有RNN、DNN等類型,而CNN就是利用卷積進(jìn)行濾波的神經(jīng)網(wǎng)絡(luò)。換句話說(shuō),CNN就是卷積加神經(jīng)網(wǎng)絡(luò)。網(wǎng)上關(guān)于CNN的資料非常多,度娘一搜一大堆,良莠不齊,有不少資料過(guò)于艱深,對(duì)于剛?cè)胄械男“讈?lái)說(shuō)一上來(lái)看這種資料會(huì)迷失方向,產(chǎn)生極強(qiáng)的挫折感,有可能會(huì)讓你失去學(xué)習(xí)的信心和興趣。作為一個(gè)過(guò)來(lái)人,我對(duì)此深有體會(huì)。幸運(yùn)的是,我還是找到了一些關(guān)于CNN講得很不錯(cuò)的資料,首先是這個(gè):
知乎上專欄作者張覺(jué)非的文章,講得很不錯(cuò),比較通俗。微信公眾號(hào)“新智元”轉(zhuǎn)發(fā)了此文,上面給出的鏈接就是轉(zhuǎn)發(fā)地址,其原文鏈接為:https://zhuanlan.zhihu.com/p/25249694,不過(guò)原文鏈接有些圖片顯示不清楚,不知為何?如果你能夠顯示完整圖片,建議直接看原文,轉(zhuǎn)發(fā)文章與原文有些區(qū)別,并且代碼不能直接粘貼。然后我們接著看這個(gè):
其實(shí),對(duì)于圖像處理——離散卷積屬于常用算法,這篇文章對(duì)利用卷積對(duì)圖像濾波講得比上一篇文章更淺顯易懂,且只講了這一點(diǎn)內(nèi)容,很短,所以建議上篇文章看不下去的時(shí)候先轉(zhuǎn)頭看看這個(gè)再接著看上一篇,會(huì)有不錯(cuò)的效果。當(dāng)然,對(duì)于喜歡追根究底的同學(xué)來(lái)說(shuō),僅看上面這兩篇文章是遠(yuǎn)遠(yuǎn)不夠的,可能你和我一樣對(duì)于什么是卷積這個(gè)概念還不是很清楚,那么請(qǐng)接下來(lái)移步如下鏈接,看看他們對(duì)卷積的討論和理解:
基本上這三篇文章就能基本了解CNN是怎么回事,能夠看懂我在下一篇博文將要貼出的訓(xùn)練程序代碼了。
首先,關(guān)于什么是卷積,文章(3)有一牛人用一句話總結(jié)得很好:卷積就是帶權(quán)的積分,看下面的一維卷積公式:
函數(shù)值
與權(quán)值
的乘積相加即可得到卷積值c(x),換句話說(shuō),我們對(duì)函數(shù)值
的加權(quán)疊加,即可得到x處的卷積值。CNN利用的是多維卷積,但原理一樣,不多說(shuō)了,同時(shí)建議不要過(guò)多糾纏這個(gè)概念,理解就好,以后若作科研再作深入了解。對(duì)于圖像處理,CNN會(huì)對(duì)輸入圖像矩陣化,然后從矩陣第一個(gè)元素開(kāi)始逐一進(jìn)行卷積運(yùn)算。在這里進(jìn)行卷積運(yùn)算的矩陣元素值即為
,而
則被稱為卷積核或者濾波器,需求不同我們選用的濾波器會(huì)有所不同,其卷積效果會(huì)不同。比如均值濾波器(average filter)會(huì)將圖像模糊,而拉普拉斯濾波器(Laplacian filter)則會(huì)將圖像局部細(xì)節(jié)增強(qiáng)。但假如我們既不想將圖像模糊又不想將圖像增強(qiáng),而我們有其它古怪的需求呢?比如,我們正在做的人臉識(shí)別,如果輸入的是我的臉部圖像,經(jīng)過(guò)CNN卷積處理后我想得到一個(gè)固定數(shù)值0來(lái)代表我;而輸入我閨女的圖像時(shí),得到另一個(gè)數(shù)值1來(lái)代表她,這種需求我們?cè)撛趺崔k?這種情況下,我們就需要從一個(gè)隨機(jī)濾波器開(kāi)始,讓CNN根據(jù)我們的需求利用某種算法調(diào)整濾波器使其逐漸接近目標(biāo),即能夠根據(jù)輸入圖像的不同準(zhǔn)確地輸出0或者1這兩個(gè)數(shù)值。那么CNN是怎么做到的呢?
要想弄明白這個(gè)問(wèn)題,我們必須先了解一下什么是人工神經(jīng)網(wǎng)絡(luò)(NN,Neural Network)?人工神經(jīng)網(wǎng)絡(luò)是一種計(jì)算模型,是由多層、每層多個(gè)人工神經(jīng)元組成的復(fù)雜網(wǎng)絡(luò)。單個(gè)人工神經(jīng)元的結(jié)構(gòu)見(jiàn)下圖(該圖來(lái)自百度圖片,稍作修改):
其中,x1——xm為神經(jīng)元的輸入,w1-wm則是權(quán)值,b為偏置標(biāo)量(可理解為線性方程的截距),我們對(duì)x1-xm逐一加權(quán)(w1-wm)求和后得到卷積值,卷積值與偏置值b相加得到c,我們?cè)賹輸出給“激活函數(shù)f(c)”,最終我們得到人工神經(jīng)元的輸出a,即:
a = f(c)
需要特別交代的是:c = wTx+b為上述計(jì)算過(guò)程的向量表達(dá)形式,這樣可以讓公式看起來(lái)比較簡(jiǎn)潔(或者更高大上些)。其中w、x分別代表權(quán)值矩陣和輸入數(shù)據(jù)矩陣,wT為w的轉(zhuǎn)置矩陣。簡(jiǎn)單說(shuō)就是我們將矩陣w的“行列”進(jìn)行了轉(zhuǎn)換,“列”變成了“行”后得到轉(zhuǎn)置矩陣wT,這樣即可實(shí)現(xiàn)w和x的逐個(gè)元素相乘疊加,其本質(zhì)就是矩陣乘法。不懂的可以度娘查找矩陣乘法,很簡(jiǎn)單,就不多說(shuō)了。
我們得到c值后,將其輸入到激活函數(shù)進(jìn)行處理,那么激活函數(shù)是干啥的呢?我的個(gè)人理解就是將簡(jiǎn)單的線性輸入(上述加權(quán)疊加過(guò)程再?gòu)?fù)雜也是簡(jiǎn)單的線性組合)轉(zhuǎn)換成復(fù)雜的非線性輸出,以獲得更好的分類效果。換句話說(shuō),我們需要利用激活函數(shù)將簡(jiǎn)單的線性分類變成復(fù)雜的非線性分類以獲得更好的分類效果。舉個(gè)例子,如下圖:
兩種顏色代表兩類數(shù)據(jù),這兩類數(shù)據(jù)很老實(shí)地呆在直線的兩邊,我們很容易找到準(zhǔn)確描述這條直線的線性方程式,這就是簡(jiǎn)單的線性分類。但是,如果數(shù)據(jù)像下面這樣呢:
其實(shí),絕大多數(shù)情況下,數(shù)據(jù)都應(yīng)該是類似這樣,而且比這還復(fù)雜。因?yàn)檫@僅僅是二維空間一個(gè)簡(jiǎn)單到能夠一眼就能看出數(shù)據(jù)邊界的例子,如果是三維、四維以及更高維的情況呢?一條簡(jiǎn)單的直線顯然是辦不到的。這種情況下只能用多層神經(jīng)網(wǎng)絡(luò)利用激活函數(shù)將簡(jiǎn)單的線性分類變成復(fù)雜的非線性分類,讓分類邊界變成復(fù)雜的曲線并且能夠穿越多維空間,這樣才能達(dá)成我們的目標(biāo),至于激活函數(shù)經(jīng)過(guò)多層作用后,它到底會(huì)長(zhǎng)什么樣,誰(shuí)也不知道,我們只是知道——It worked!常見(jiàn)的激活函數(shù)有sigmoid、tanh、ReLu、maxout等,以sigmoid函數(shù)為例,其函數(shù)式如下:
其具備類似階躍函數(shù)的性質(zhì),其可以在跳躍點(diǎn)(某個(gè)數(shù)值)從0跳躍到1。該函數(shù)的值域?yàn)?0,1),人工神經(jīng)元將sigmoid函數(shù)的輸出與某個(gè)閥值進(jìn)行比較,比如0.5,大于0.5,神經(jīng)元輸出1,小于則輸出0。就這樣我們把當(dāng)前神經(jīng)元的輸出作為另一個(gè)神經(jīng)元的輸入,構(gòu)成一個(gè)多層,每層多個(gè)神經(jīng)元的復(fù)雜網(wǎng)絡(luò),如下圖:
我直接將文章(1)的圖截過(guò)來(lái)了,這個(gè)圖很形象地展示了CNN的結(jié)構(gòu),其屬于最簡(jiǎn)單的多層全連接前向神經(jīng)網(wǎng)絡(luò)系統(tǒng),它有10個(gè)輸入連接到了網(wǎng)絡(luò)的第一層,每個(gè)輸入均與第一層的所有神經(jīng)元連接。第一層神經(jīng)元的輸出作為下一層神經(jīng)元的輸入連接到下一層,以此類推,直至最后一層神經(jīng)元。上圖共有三層網(wǎng)絡(luò),第1、2層各有12個(gè)神經(jīng)元,第3層也就是最后一層有6個(gè)神經(jīng)元,也就是說(shuō)這個(gè)三層網(wǎng)絡(luò)最后會(huì)有6個(gè)輸出,即一個(gè)6元向量。
那么,類似這樣的網(wǎng)絡(luò)結(jié)構(gòu),是怎樣理解并實(shí)現(xiàn)我們識(shí)別人臉這樣的需求的呢?接下來(lái)就是訓(xùn)練數(shù)據(jù)登場(chǎng)的時(shí)候了。在這里,我們將訓(xùn)練數(shù)據(jù)稱為訓(xùn)練集,每組訓(xùn)練數(shù)據(jù)包括一個(gè)輸入、一個(gè)輸出,也就是ML經(jīng)常提到的帶標(biāo)注的數(shù)據(jù),標(biāo)注值為輸出,圖像等需要識(shí)別的內(nèi)容為輸入,N對(duì)這樣的數(shù)據(jù)構(gòu)成了訓(xùn)練數(shù)據(jù)集。以我們前面準(zhǔn)備的人臉識(shí)別數(shù)據(jù)為例,我的1000張臉部圖像作為輸入數(shù)據(jù),每輸入一張圖像,CNN的輸出應(yīng)為0,也就是說(shuō),一張圖像對(duì)應(yīng)一個(gè)固定數(shù)值0,1000張圖像與1000個(gè)0組成1000對(duì)訓(xùn)練集。同樣,閨女的1000張臉部圖像與1000個(gè)1組成另外1000對(duì)訓(xùn)練集。我們首先將臉部圖像作為輸入數(shù)據(jù)輸入給CNN,CNN從一個(gè)隨機(jī)濾波器開(kāi)始計(jì)算,其最終的輸出基本不太可能是正確的,但這不要緊,CNN會(huì)將自己的輸出Ocnn與數(shù)據(jù)集給出的輸出Oreal進(jìn)行比較,見(jiàn)下式:
我們求得n對(duì)樣本數(shù)據(jù)的真實(shí)值與輸出值之間差的平方和的均值e,此處e被稱作均方誤差,亦即mse。顯然e越小,其越接近真實(shí)輸出,于是CNN的實(shí)際工作就變?yōu)橄敕皆O(shè)法地讓e變小,直至e值進(jìn)入可接受范圍之內(nèi),此時(shí)我們就可以認(rèn)為CNN訓(xùn)練好了。像e這樣的函數(shù)我們統(tǒng)稱為代價(jià)函數(shù)(Cost Function),除了mse,我們還可以選擇其它代價(jià)函數(shù)用于調(diào)優(yōu)。那么我們?cè)趺床拍苷{(diào)優(yōu)呢?答案是使用梯度下降算法找到e的全局最小值,說(shuō)白了就是求偏導(dǎo)。CNN會(huì)沿著
的相反方向調(diào)整權(quán)值和偏置值(順著
的方向e值上升最快,反之則下降最快,不了解的可參閱高等數(shù)學(xué)之偏導(dǎo)數(shù)及向量?jī)刹糠謨?nèi)容,建議先看向量了解個(gè)大概再看偏導(dǎo),更弱的就先看導(dǎo)數(shù)),一次一個(gè)步長(zhǎng)(步長(zhǎng)被稱為學(xué)習(xí)效率,Learning Rate),如此反復(fù),經(jīng)過(guò)多次迭代,CNN即可得到e的最小值。于是,我們的目標(biāo)達(dá)成。
我相信你只要仔細(xì)閱讀并真正理解了上面講述的內(nèi)容,那么接下來(lái)讀懂訓(xùn)練代碼應(yīng)該不成問(wèn)題了。如果你覺(jué)得還不過(guò)癮,還想了解得更深,那么關(guān)于卷積神經(jīng)網(wǎng)絡(luò)更詳細(xì)的內(nèi)容,請(qǐng)?jiān)敿?xì)閱讀本文開(kāi)頭給出的幾篇文章,或者看知乎上關(guān)于它的
最后,還需要交代一點(diǎn):事實(shí)上,上面給出的三層卷積神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)圖是非常簡(jiǎn)單的,僅僅包含三層單一的卷積層,我們接下來(lái)實(shí)際使用的CNN網(wǎng)絡(luò)還需要幾種特殊的網(wǎng)絡(luò)層才能讓CNN更加成熟,包括pooling layer、Dropout layer、flatten layer、dense layer等,下一節(jié)我將結(jié)合代碼來(lái)詳細(xì)講解它們的實(shí)際用處,這里就不多說(shuō)了。
總結(jié)
以上是生活随笔為你收集整理的python识别人脸多种属性_人脸检测及识别python实现系列(4)——卷积神经网络(CNN)入门...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: pythonfor输入多个数字_我一天学
- 下一篇: python语句分类_Python新手入