python使用深度神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)識(shí)別暹羅與英短

先來(lái)上兩張圖看看那種貓是暹羅?那種貓是英短?

第一張暹羅

第二張英短

你以后是不是可以識(shí)別了暹羅和英短了?大概能,好像又不能。這是因?yàn)樗夭奶倭?,我們看這兩張圖能分別提取出來(lái)短特征太少了。那如果我們暹羅短放100張圖,英短放100張圖給大家參考,再給一張暹羅或者英短短照片是不是就能識(shí)別出來(lái)是那種貓了,即使不能完全認(rèn)出來(lái),是不是也有90%可能是可以猜猜對(duì)。那么如果提供500張暹羅500張英短短圖片呢,是不是猜對(duì)的概率可以更高?

我們是怎么識(shí)別暹羅和英短的呢?當(dāng)然是先歸納兩種貓的特征如面部顏色分布、眼睛的顏色等等,當(dāng)再有一張要識(shí)別短圖片時(shí),我們就看看面部顏色分布、眼睛顏色是不是可暹羅的特征一致。

同樣把識(shí)別暹羅和英短的方法教給計(jì)算機(jī)后,是不是計(jì)算機(jī)也可以識(shí)別這兩種貓?

那么計(jì)算機(jī)是怎么識(shí)別圖像的呢?先來(lái)看一下計(jì)算機(jī)是怎么存儲(chǔ)圖像的。

圖像在計(jì)算機(jī)里是一堆按順序排列的數(shù)字,1到255,這是一個(gè)只有黑白色的圖,但是顏色千變?nèi)f化離不開三原色——紅綠藍(lán)。

這樣,一張圖片在計(jì)算機(jī)里就是一個(gè)長(zhǎng)方體!depth為3的長(zhǎng)方體。每一層都是1到255的數(shù)字。

讓計(jì)算機(jī)識(shí)別圖片,就要先讓計(jì)算機(jī)了解它要識(shí)別短圖片有那些特征。提取圖片中的特征就是識(shí)別圖片要做的主要工作。

下面就該主角出場(chǎng)了,卷及神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network, CNN).

最簡(jiǎn)單的卷積神經(jīng)網(wǎng)絡(luò)就長(zhǎng)下面的樣子。

分為輸入、卷積層、池化層(采樣層)、全連接和輸出。每一層都將最重要的識(shí)別信息進(jìn)行壓縮,并傳導(dǎo)至下一層。

卷積層:幫助提取特征,越深(層數(shù)多)的卷積神經(jīng)網(wǎng)絡(luò)會(huì)提取越具體的特征,越淺的網(wǎng)絡(luò)提取越淺顯的特征。

池化層:減少圖片的分辨率,減少特征映射。

全連接:扁平化圖片特征,將圖片當(dāng)成數(shù)組,并將像素值當(dāng)作預(yù)測(cè)圖像中數(shù)值的特征。

?卷積層

卷積層從圖片中提取特征,圖片在計(jì)算機(jī)中就上按我們上面說(shuō)的格式存儲(chǔ)的(長(zhǎng)方體),先取一層提取特征,怎么提???使用卷積核(權(quán)值)。做如下短操作:

觀察左右兩個(gè)矩陣,矩陣大小從6×6 變成了 4×4,但數(shù)字的大小分布好像還是一致的??聪抡鎸?shí)圖片:

圖片好像變模糊了,但這兩個(gè)圖片大小沒(méi)變是怎么回事呢?其實(shí)是用了如下的方式:same padding

在6×6的矩陣周圍加了一圈0,再做卷積的時(shí)候得到的還是一個(gè)6×6的矩陣,為什么加一圈0這個(gè)和卷積核大小、步長(zhǎng)和邊界有關(guān)。自己算吧。

上面是在一個(gè)6×6的矩陣上使用3X3的矩陣做的演示。在真實(shí)的圖片上做卷積是什么樣的呢?如下圖:

對(duì)一個(gè)32x32x3的圖使用10個(gè)5x5x3的filter做卷積得到一個(gè)28x28x10的激活圖(激活圖是卷積層的輸出).

?池化層

減少圖片的分辨率,減少特征映射。怎么減少的呢?

池化在每一個(gè)縱深維度上獨(dú)自完成,因此圖像的縱深保持不變。池化層的最常見形式是最大池化。

可以看到圖像明顯的變小了。如圖:

在激活圖的每一層的二維矩陣上按2×2提取最大值得到新的圖。真實(shí)效果如下:

隨著卷積層和池化層的增加,對(duì)應(yīng)濾波器檢測(cè)的特征就更加復(fù)雜。隨著累積,就可以檢測(cè)越來(lái)越復(fù)雜的特征。這里還有一個(gè)卷積核優(yōu)化的問(wèn)題,多次訓(xùn)練優(yōu)化卷積核。

下面使用apple的卷積神經(jīng)網(wǎng)絡(luò)框架TuriCreate實(shí)現(xiàn)區(qū)分暹羅和英短。(先說(shuō)一下我是在win10下裝的熬夜把電腦重裝了不下3次,系統(tǒng)要有wls,不要用企業(yè)版,mac系統(tǒng)和ubuntu系統(tǒng)下安裝turicreae比較方便)

首先準(zhǔn)備訓(xùn)練用圖片暹羅50張,英短50長(zhǎng)。測(cè)試用圖片10張。

上代碼:(開發(fā)工具anaconda,python 2.7)

數(shù)據(jù)放到了h盤image目錄下,我是在win10下裝的ubuntu,所以h盤掛在mnt/下。

test的文件:(x指暹羅,y指英短,這樣命名是為了代碼里給測(cè)試圖片區(qū)分貓咪類型)

test_data[‘label’] = test_data[‘path’].apply(lambda path: ‘xianluo’ if ‘x’ in path else ‘yingduan’)

第一次結(jié)果如下:

訓(xùn)練精度0.955 驗(yàn)證精度才0.75 正確率才0.5。好吧,看來(lái)是學(xué)習(xí)得太少,得上三年高考五年模擬版,將暹羅和英短的圖片都增加到100張。在看結(jié)果。

這次訓(xùn)練精度就達(dá)到0.987了,驗(yàn)證精度1.0,正確率1.0 牛逼了。

看下turicreate識(shí)別的結(jié)果:

我們實(shí)際圖片上貓是:(紅色為真實(shí)的貓的類型-在代碼里根據(jù)圖片名稱標(biāo)記的,綠色為識(shí)別出來(lái)的貓的類型)

可以看到兩者是一致的。牛逼了訓(xùn)練數(shù)據(jù)才兩百?gòu)垐D片,就可以達(dá)到這種效果。

本文原創(chuàng)首發(fā)于Cobub官網(wǎng)博客,如需轉(zhuǎn)載請(qǐng)注明出處~

Cobub開源社區(qū)QQ194022996

Cobub Razor是一款開源的移動(dòng)應(yīng)用數(shù)據(jù)統(tǒng)計(jì)分析系統(tǒng),您可以將它私有化部署在您的應(yīng)用上,收集并展現(xiàn)來(lái)自您的移動(dòng)App(包括iOS,Android和Windows Phone及混合型應(yīng)用)的相關(guān)用戶行為,數(shù)據(jù)私有靈活更安全。它可以幫助企業(yè)降低運(yùn)營(yíng)成本,提高用戶留存率,轉(zhuǎn)化率以及活躍度,實(shí)現(xiàn)精細(xì)化運(yùn)營(yíng)!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容