用Keras創(chuàng)造一個(gè)卷積神經(jīng)網(wǎng)絡(luò)來(lái)識(shí)別神奇寶貝妙蛙種子的填充玩具
簡(jiǎn) 介
本文內(nèi)容是構(gòu)建完整端對(duì)端圖像分類+深度學(xué)習(xí)應(yīng)用系列的第二部分,你將會(huì)了解如何在你自己的數(shù)據(jù)庫(kù)中建立、訓(xùn)練并評(píng)估一個(gè)卷積神經(jīng)網(wǎng)絡(luò)。
為了讓這個(gè)系列輕松、愉快,我決定實(shí)現(xiàn)我童年的一個(gè)夢(mèng)想,那就是構(gòu)造一個(gè)神奇寶貝圖鑒。神奇寶貝圖鑒是于神奇寶貝(一部很火的動(dòng)畫(huà)片、電子游戲和集換卡系列)世界中的一個(gè)設(shè)備(我曾經(jīng)是以及現(xiàn)在還是神奇寶貝的大粉絲)。
如果你對(duì)于神奇寶貝不了解,你可以把神奇寶貝圖鑒想象成一個(gè)可以識(shí)別神奇寶貝(一個(gè)長(zhǎng)得像動(dòng)物、存在于在神奇寶貝世界的生物)的智能手機(jī)app。
當(dāng)然你也可以換成你自己的數(shù)據(jù),我只是覺(jué)得很有趣并且在做一件很懷舊的事情。
想要知道如何在你自己的數(shù)據(jù)庫(kù)中用Keras和深度學(xué)習(xí)訓(xùn)練一個(gè)卷積神經(jīng)網(wǎng)絡(luò),繼續(xù)往下讀就行了。
目 錄
1.Keras和卷積神經(jīng)網(wǎng)絡(luò)
我們的深度學(xué)習(xí)數(shù)據(jù)庫(kù)
卷積神經(jīng)網(wǎng)絡(luò)和Keras項(xiàng)目的結(jié)構(gòu)
Keras和CNN結(jié)構(gòu)
完成我們的CNN+Keras訓(xùn)練腳本
用Keras訓(xùn)練CNN
創(chuàng)造CNN和Keras訓(xùn)練腳本
用CNN和Keras分類圖片
該模型的局限性
我們能否使用這個(gè)Keras深度學(xué)習(xí)模型建一個(gè)REST API?
Keras和卷積神經(jīng)網(wǎng)絡(luò)
在上周的博文中,我們學(xué)習(xí)了如何能快速建立一個(gè)深度學(xué)習(xí)的圖像數(shù)據(jù)庫(kù)——我們使用了博文中的過(guò)程和代碼來(lái)收集、下載和組織電腦上的圖像。
既然已有下載并組織好的圖像,下一步就是在數(shù)據(jù)上訓(xùn)練一個(gè)卷積神經(jīng)網(wǎng)絡(luò)(CNN)。
我將會(huì)在今天的博文中向你展示如何用Keras和深度學(xué)習(xí)來(lái)訓(xùn)練你的CNN。下周將要發(fā)布這個(gè)系列的最后一部分,將會(huì)向你展示你如何僅用幾行代碼將你訓(xùn)練好的Keras模型應(yīng)用在一個(gè)智能手機(jī)(特別是iPhone)app上。
這個(gè)系列的最終目的是幫助你建立一個(gè)能夠運(yùn)行的深度學(xué)習(xí)app——用這個(gè)系列的文章作為發(fā)靈感啟發(fā),并且開(kāi)始幫助你建立自己的深度學(xué)習(xí)應(yīng)用。
現(xiàn)在讓我們開(kāi)始用Keras和深度學(xué)習(xí)訓(xùn)練一個(gè)CNN。
我們的深度學(xué)習(xí)數(shù)據(jù)庫(kù)
圖1:神奇寶貝深度學(xué)習(xí)數(shù)據(jù)庫(kù)中的樣本示意圖。它展示了神奇寶貝的每個(gè)種類。正如我們所見(jiàn),數(shù)據(jù)庫(kù)的內(nèi)容范圍很大,包含了插畫(huà)、電影/電視節(jié)目截圖、模型、玩具等。
我們深度學(xué)習(xí)的數(shù)據(jù)庫(kù)有1191個(gè)神奇寶貝)的圖片。
我們的目標(biāo)是用Keras和深度學(xué)習(xí)訓(xùn)練一個(gè)卷積神經(jīng)網(wǎng)絡(luò)來(lái)識(shí)別和分類這些神奇寶貝。
我們將要識(shí)別的神奇寶貝包括這幾種:
妙蛙種子(234張圖片)
小火龍(238張圖片)
杰尼龜(223張圖片)
皮卡丘(234張圖片)
超夢(mèng)(239張圖片)
每個(gè)種類的訓(xùn)練圖片的示意圖在圖1中可見(jiàn)。
正如你所見(jiàn),我們的訓(xùn)練圖片包括:
電視節(jié)目和電影中的截圖
集換卡
模型
玩具
粉絲的畫(huà)作和藝術(shù)表達(dá)
我們的CNN將從這些涵蓋范圍很廣的使N一大堆圖片中識(shí)別出5種神奇寶貝?!椅覀儗?huì)看到,我們可以達(dá)到97%的分類準(zhǔn)確率!
卷積神經(jīng)網(wǎng)絡(luò)和Keras項(xiàng)目的結(jié)構(gòu)
今天的項(xiàng)目有很多活動(dòng)部件?。我們現(xiàn)在從回顧項(xiàng)目的目錄結(jié)構(gòu)開(kāi)始。
有3個(gè)目錄:
dataset:包含了5個(gè)種類,每個(gè)種類有自己?jiǎn)为?dú)的子目錄,這使得分析種類標(biāo)簽較為容易。
examples:包含了我們將要用來(lái)測(cè)試CNN的圖片。
pyimagesearch模塊:包含了SmallerVGGNet模型種類(在這片文章的后面將會(huì)用到)。
根目錄下有5個(gè)文件:
plot.png:訓(xùn)練腳本運(yùn)行之后產(chǎn)生的的訓(xùn)練/測(cè)試準(zhǔn)確率和失敗率的圖像
lb.pickle:LabelBinarizer序列化的目標(biāo)文件——包含個(gè)從種類指標(biāo)到種類名稱的查找機(jī)制
pokedex.model:這是我們序列化的Keras卷積神經(jīng)網(wǎng)絡(luò)的模型文件(即權(quán)值文件)
train.py:我們將用這個(gè)腳本來(lái)訓(xùn)練我們的Keras CNN,劃分準(zhǔn)確率/失敗率,然后將CNN和標(biāo)簽二值序列化于磁盤上。
classify.py:測(cè)試腳本
Keras和CNN結(jié)構(gòu)
圖2:一個(gè)我稱為“SmallerVGGNet”的VGGNet類神經(jīng)網(wǎng)絡(luò),它將被用于和Keras一起訓(xùn)練一個(gè)深度學(xué)習(xí)分類器。
我們將要使用的CNN結(jié)構(gòu)是VGGNet網(wǎng)絡(luò)的一個(gè)小而緊湊的變體。Simonyan和Zisserman在他們2014年的論文Very Deep Convolutional Networks for Large Scale Image Recognition中引入。
VGGNet類結(jié)構(gòu)有這些特點(diǎn):
在增加深度方面只用3×3個(gè)互相交疊的卷積層。
使用最大化池化來(lái)減少體積。
相比于softmax分類器,優(yōu)先網(wǎng)絡(luò)最后完全連接的層。
我假設(shè)你已經(jīng)安裝了Keras并且在你的系統(tǒng)上配置好了它。如果沒(méi)有,這里有一些關(guān)于深度學(xué)習(xí)構(gòu)建環(huán)境配置指導(dǎo)的鏈接:
使用Python為深度學(xué)習(xí)配置Ubuntu
使用Python建立Ubuntu 16.04 + CUDA + GPU進(jìn)行深度學(xué)習(xí)
配置macOS以便使用Python進(jìn)行深入學(xué)習(xí)
如果你想要跳過(guò)配置深度學(xué)習(xí)環(huán)境,我推薦你用以下幾個(gè)云上預(yù)先配置好的實(shí)體個(gè):
Amazon AMI用于使用Python進(jìn)行深度學(xué)習(xí)
微軟的數(shù)據(jù)科學(xué)虛擬機(jī)(DSVM)用于深度學(xué)習(xí)
現(xiàn)在讓我們開(kāi)始執(zhí)行更小版本的BGGNet,即SmallerVGGNet。在pyimagesearch模塊中創(chuàng)建一個(gè)命名為smallervggnet.py的新文件,插入以下代碼:
首先我們輸入模塊——注意到它們都來(lái)自于Keras,每個(gè)都在Deep Learning for Computer Vision with Python課程中有涉及到。
注意:在pyimagesearch中創(chuàng)建__init__.py文件,這樣Python就知道這個(gè)文件夾是一個(gè)模塊。如果你對(duì)__init__.py這個(gè)文件或者如何用他們創(chuàng)建模塊不熟悉,不要擔(dān)心,用本文最后的“下載”部分來(lái)下載我的目錄結(jié)構(gòu)、源代碼和數(shù)據(jù)庫(kù)+圖片樣例。
在此,我們定義SmallerVGGNet類:
我們構(gòu)建的方法需要4個(gè)參數(shù):
width:圖像的寬度
height:圖像的高度
depth:圖像的深度——也叫做隧道數(shù)
classes:數(shù)據(jù)庫(kù)中的種類數(shù)(這將會(huì)影響模型的最后一層)。
在這篇博文中,我們用到神奇寶貝的5個(gè)種類,但是如果你為每個(gè)種類下載了足夠多的樣例圖片,你可以使用807個(gè)神奇寶貝種類!
注意:我們將會(huì)使用96*96、深度為3的輸入圖片。請(qǐng)記住這個(gè),因?yàn)槲覀円呀?jīng)解釋了當(dāng)它穿過(guò)網(wǎng)絡(luò)輸入的體積的空間參數(shù)。
因?yàn)槲覀兪褂?a href="http://wenjunhu.com/tags/tensorflow/" target="_blank">TensorFlow的編譯器后端,我們用頻道最后的數(shù)據(jù)順序來(lái)安排輸入形狀,但是如果你想使用頻道最先(Theano等),那么它將在23-25行被自動(dòng)處理。
現(xiàn)在,我們開(kāi)始在模型中添加層:
以上是我們第一個(gè)CONV=>RELU=>POOL塊。
卷積層有3×3個(gè)核的32個(gè)過(guò)濾器。我們?cè)谂?guī)范化后使用激活函數(shù)RELU。POOL層有3×3的POOL大小來(lái)減少圖片的空間參數(shù),從96×96變成32×32(我們將使用96×96×3的輸入圖片來(lái)訓(xùn)練網(wǎng)絡(luò))。
如你在代碼中所見(jiàn),我們將網(wǎng)絡(luò)中使用丟棄這個(gè)功能。丟棄的工作機(jī)制是隨機(jī)斷開(kāi)從當(dāng)前層到下一層之間的節(jié)點(diǎn)作。這個(gè)在訓(xùn)練批中隨機(jī)斷開(kāi)的過(guò)程能夠在模型中自然引入丟棄——層中沒(méi)有一個(gè)單獨(dú)的節(jié)點(diǎn)是用于預(yù)測(cè)一個(gè)確定的類、目標(biāo)、邊或者角。
從這里在使用另外一個(gè)POOL層之前加入(CONV=>RELU)*2層。
堆疊多個(gè)CONV和RELU層在一起(在減少體檢的空間尺寸之前),這樣們能夠獲得更豐富的特征。
注意:
增加過(guò)濾器尺寸,從32到64。網(wǎng)絡(luò)越深,體積的空間尺寸越小,我們就能學(xué)習(xí)更多過(guò)濾器。
我們減少最大池化尺寸,從3×3變成2×2,以保證我們不會(huì)太快地減少空間尺寸。
這一階段再次使用丟棄段。
現(xiàn)添加另外一組(CONV=>RELU)*2=>POOL:
注意到我們已經(jīng)將的過(guò)濾器的尺寸增加到128。節(jié)點(diǎn)的25%再次被丟棄以減少過(guò)度擬合。
最后,我們有一組FC=>RELU的層和一個(gè)softmax分類器:
完全連接的層由具備矯正線性單元激活器和批規(guī)范化的Dense(1024)來(lái)指定。
最后再操作一次丟棄次。這次注意到,在訓(xùn)練時(shí),我們丟棄了50%的節(jié)點(diǎn)。一般情況下,在我們的完全連接層你將使用一個(gè)40-50%丟棄率的丟棄和一個(gè)低得多的丟棄率,通常是在之前的層10-25%丟層(如果有某個(gè)丟棄在所有層都使用)。
我們用softmax分類器來(lái)完善這個(gè)模型,該分類器可為每個(gè)種類反饋預(yù)測(cè)概率型。
在這個(gè)部分的一開(kāi)始的圖2是一個(gè)SmallerVGGNet前幾層的網(wǎng)絡(luò)結(jié)構(gòu)的圖片。如果想看完整的SmallerVGGNet的Keras CNN結(jié)構(gòu),可以進(jìn)入這個(gè)鏈接
https://www.pyimagesearch.com/wp-content/uploads/2018/04/smallervggnet_model.png。
執(zhí)行我們的CNN+Keras訓(xùn)練腳本
既然SmallerVGGNet已經(jīng)完成了,我們可以用Keras來(lái)訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)了。
打開(kāi)一個(gè)新的文件,命名為train.py,并且加入下面的代碼,我們?cè)诖思虞d需要的包和庫(kù)。
我們將使用“Agg” matplotlib后端將圖片保存在背景中。(第三行)
ImageDataGenerator類將被用于數(shù)據(jù)增加,這是一個(gè)用已經(jīng)存在于我們數(shù)據(jù)庫(kù)的圖片并且使用隨機(jī)變換(旋轉(zhuǎn)、剪切等)來(lái)闡釋新的訓(xùn)練數(shù)據(jù)的技巧。數(shù)據(jù)增加能夠防止過(guò)擬合。
第七行載入了Adam優(yōu)化器,一個(gè)用來(lái)訓(xùn)練網(wǎng)絡(luò)的優(yōu)化器。
LabelBinarizer(第九行)是一個(gè)重要的類,這個(gè)類使得我們能夠:
輸入一系列種類的標(biāo)簽(如,代表了在數(shù)據(jù)庫(kù)中人類可以閱讀的種類標(biāo)簽的字符串)
把種類標(biāo)簽轉(zhuǎn)化成一個(gè)獨(dú)熱編碼向量。
讓我們能夠取一個(gè)Keras CNN中的整數(shù)種類標(biāo)簽預(yù)測(cè),并且把它轉(zhuǎn)化為一個(gè)人類可讀的標(biāo)簽。
在PyImageSearch博客上我經(jīng)常被問(wèn)到如何將一個(gè)種類標(biāo)簽字符串轉(zhuǎn)換成一個(gè)整數(shù)及其反向操作?,F(xiàn)在你知道方法就是使用LabelBinarizer類。
train_test_split函數(shù)(第10行)用于創(chuàng)建訓(xùn)練和測(cè)試劃分。同樣注意到第11行中載入SmallerVGGNet——這是我們上一節(jié)中已經(jīng)完成了的Keras CNN。
這個(gè)博客的讀者很熟悉我自己的imutils安裝包。如果你還沒(méi)有安裝/升級(jí)它,可以這樣安裝它:
如果你正在用一個(gè)虛擬的Python環(huán)境(正如在PyImageSearchg博客中我們總是做的那樣),確保你在安裝/升級(jí)imutils之前使用workon命令來(lái)進(jìn)入虛擬環(huán)境級(jí)前。
現(xiàn)在,讓我們分析一下命令行的語(yǔ)句:
為了我們的訓(xùn)練腳本,需要使用三個(gè)命令行語(yǔ)句:
--dataset:這是輸入數(shù)據(jù)庫(kù)的路徑。數(shù)據(jù)庫(kù)在dataset的目錄中,這個(gè)目錄下面有代表每個(gè)種類的子目錄。在每個(gè)子目錄中,有大約250個(gè)神奇寶貝的圖像。請(qǐng)看開(kāi)頭的目錄結(jié)構(gòu)。
--model:這個(gè)是輸出模型的路徑——這個(gè)訓(xùn)練腳本將會(huì)訓(xùn)練模型并且把它輸出到磁盤上。
--labelbin:這是輸出標(biāo)簽二值器的路徑——正如你將看到,我們從dataset目錄的名字中提取種類標(biāo)簽并建立標(biāo)簽二值器。
我們還有一個(gè)可選的語(yǔ)句“—plot”。如果你不特別指定一個(gè)路徑/文件名,那么plot.png這個(gè)文件將被放在目前的工作目錄中。
你不需要修改第22-31行來(lái)提供新的文件目錄。命令行語(yǔ)句將在runtime被執(zhí)行。如果你不明白,那么請(qǐng)回顧我的命令行語(yǔ)句那篇博文。
既然我們已經(jīng)寫完了命令行語(yǔ)句,現(xiàn)在開(kāi)始一些重要的變量:
第35-38行初始化用于訓(xùn)練Keras CNN的重要變量。
EPOCHS:我們將要訓(xùn)練的網(wǎng)絡(luò)總epoch次數(shù)。(即,次網(wǎng)絡(luò)“看見(jiàn)”訓(xùn)練例子并從中學(xué)習(xí)模式的次數(shù))
INIT_LR:開(kāi)始的學(xué)習(xí)率——1e-3是我們將用于訓(xùn)練網(wǎng)絡(luò)的Adam優(yōu)化器的初始值。
BS:我們將輸入很多捆圖片進(jìn)入網(wǎng)絡(luò)進(jìn)行訓(xùn)練。在每個(gè)epoch有很多捆,BS值控制了捆的大小。
IMAGE_DIMS:我們使用輸入圖片的空間大小。輸入圖片是96×96像素,并有3個(gè)通道(紅綠藍(lán))。我也注意到把SmallerVGGNet設(shè)計(jì)成處理96×96的圖片。
我們初始化兩個(gè)列表——data和labels,他們是預(yù)先處理過(guò)的圖片和標(biāo)簽。
第46-48行得到所有圖片的路徑并且隨機(jī)切換它們。
從這,我們循環(huán)一下每個(gè)imagePahts:
在第51行我們循環(huán)imagePaths然后加載圖片(第53行),并且調(diào)整它的尺寸使之適應(yīng)我們的模型(第54行)。
現(xiàn)在更新data和labels列表。
使用Keras img_to_array函數(shù)來(lái)將圖片轉(zhuǎn)換成一個(gè)兼容Keras的數(shù)組(第55行),接著把圖片貼在我們的data列表上(第56行)。
對(duì)于labels列表,我們從第60行的文件路徑上提取label并把它加入列表(第61行)。
為什么這個(gè)種類標(biāo)簽分析過(guò)程有效?
到我們有意創(chuàng)建了dataset目錄結(jié)構(gòu)來(lái)得到下以下格式式
用第60行的路徑分離器,我們可以將分離路徑成一個(gè)數(shù)組,然后抓取從第二個(gè)到最后一項(xiàng)放進(jìn)列表——種類標(biāo)簽。
如果這個(gè)過(guò)程讓你困惑,我建議你打開(kāi)Python的殼文件,然后通過(guò)分離操作系統(tǒng)的路徑分離器的路徑來(lái)探索imagePath這個(gè)例子。
我們繼續(xù)。一些事情在下面的代碼塊中發(fā)生了——更多的預(yù)處理、二值化的標(biāo)簽和分割數(shù)據(jù)。
我們首先把data數(shù)據(jù)轉(zhuǎn)化成一個(gè)NumPy數(shù)組,然后調(diào)整像素密度到[0,1]的范圍(第64行)。我們也在第65行把一個(gè)列表中的labels轉(zhuǎn)換到一個(gè)NumPy數(shù)據(jù)。一個(gè)表示data矩陣的大小(以MB為單位)的信息出現(xiàn)了。
然后,我們用scikit-learn的LabelBinarizer二值化標(biāo)簽nr(第70和71行)。
隨著深入學(xué)習(xí)或任何機(jī)器學(xué)習(xí),通常的做法是進(jìn)行訓(xùn)練和測(cè)試的劃分。在第75和76行,我們創(chuàng)建了一個(gè)對(duì)于數(shù)據(jù)的80/20的隨機(jī)分劃。
接著,我們創(chuàng)建的圖像數(shù)據(jù)放大器項(xiàng)目:
既然我們?cè)谔幚硎芟薜臄?shù)據(jù)點(diǎn)(每個(gè)種類<250個(gè)圖像),我們可以利用訓(xùn)練過(guò)程中的數(shù)據(jù)給模型帶來(lái)更多圖像(基于已經(jīng)存在的圖像)進(jìn)行訓(xùn)練。
數(shù)據(jù)放大應(yīng)該是每個(gè)深度學(xué)習(xí)從業(yè)者的必備工具。
我們?cè)诘?9-81行初始化ImageDataGenerator。
從這里開(kāi)始我們編譯模型并且開(kāi)始訓(xùn)練。
在第85和86行,我們初始化96×96×3輸入空間大小的Keras CNN。我將再重申一遍這個(gè)問(wèn)題,因?yàn)槲液芏啻伪粏?wèn)到這個(gè)問(wèn)題——SmallerVGGNet被設(shè)計(jì)成接受96×96×3的輸入圖片。如果你想要用不同的空間尺寸,你也許需要:
要么減少較小圖片的網(wǎng)絡(luò)深度
要么給較大圖片增加網(wǎng)絡(luò)深度
不要瞎改代碼。先考慮較大或較小圖片的含義!
我們用到有學(xué)習(xí)速度衰變的Adam優(yōu)化器(第87行),然后用多種的交叉熵編譯我們的模型,因?yàn)槲覀冇?2個(gè)種類(第88和89行)。
注意:如果只有兩個(gè)類別,你應(yīng)該用二元的交叉熵作為遺失函數(shù)。
從這里開(kāi)始,我們使用Keras fit_generator方法來(lái)訓(xùn)練網(wǎng)絡(luò)(第93-97行)。要有耐心——這會(huì)花一些時(shí)間,這取決于你用CPU還是GPU來(lái)訓(xùn)練。
一旦Keras CNN完成了訓(xùn)練,我們將會(huì)想要保存(1)模型和(2)標(biāo)簽二值化,因?yàn)楫?dāng)我們用網(wǎng)絡(luò)測(cè)試不在訓(xùn)練/測(cè)試集中的圖片時(shí),我們需要從磁盤上加載它們片。
我們保存模型(第101行)和標(biāo)簽二值化(第105-107行),這樣我們就能在之后的classify.py腳本中使用它們。
標(biāo)簽二值化文件包含了種類指數(shù)和人類刻度的種類標(biāo)簽詞典。其目的是讓我們不必把我們使用Keras CNN腳本中的種類標(biāo)簽用一個(gè)固定值代表。
最終,我們可以劃分出訓(xùn)練和失敗準(zhǔn)確率。
我選擇保存我的圖片到磁盤上(第121行)而不是展示它,有兩個(gè)原因:
我在使用一個(gè)沒(méi)有顯示器的云端服務(wù)器,
我想要確保我不會(huì)忘記保存這些圖片。
用Keras訓(xùn)練CNN
現(xiàn)在我們準(zhǔn)備好訓(xùn)練神奇寶貝圖鑒CNN。
確保閱讀了這篇博客的“下載”部分以下載代碼+數(shù)據(jù)。
然后執(zhí)行下面的語(yǔ)句來(lái)訓(xùn)練模型。確保正確提供命令行語(yǔ)句。
查看訓(xùn)練腳本的結(jié)果,我們發(fā)現(xiàn)Keras CNN獲得:
訓(xùn)練集上的96.84%的分類準(zhǔn)確率
測(cè)試集上的97.07%的準(zhǔn)確率
訓(xùn)練失敗和準(zhǔn)確率如下:
圖3:用Keras訓(xùn)練的神奇寶貝圖鑒深度學(xué)習(xí)分類器的訓(xùn)練和驗(yàn)證失敗/準(zhǔn)確率片s
正如你在圖3中所見(jiàn),我訓(xùn)練了這個(gè)模型100遍來(lái)達(dá)到在過(guò)擬合限制下的低失敗率。如果有更多的訓(xùn)練數(shù)據(jù),我們就能得到更高的準(zhǔn)確率。
創(chuàng)建CNN和Keras訓(xùn)練腳本
既然我們的CNN已經(jīng)被訓(xùn)練了,我們需要完成一個(gè)腳本來(lái)分類不在我們訓(xùn)練/測(cè)試集中的圖片。打開(kāi)一個(gè)新的文件,命名為classify.py,并加入以下代碼:
首先載入必要的包(第2-9行)。
從這里開(kāi)始分析命令行語(yǔ)句。
我們有三個(gè)必要的命令行語(yǔ)句需要分析:
model:我們剛才訓(xùn)練的模型的路徑。
labelbin:標(biāo)簽二值化文件的路徑。
image:我們輸入圖片文件的路徑。
這三個(gè)命令在第12-19行。記住,你不需要修改這些命令——我將會(huì)在下一節(jié)告訴你如何運(yùn)用runtime提供的命令行語(yǔ)句運(yùn)行這個(gè)程序在的。
接著,我們加載并預(yù)處理圖片。
現(xiàn)在我們加載輸入image(第22行),備份命名為做output,以備展示。(第23行)
然后用訓(xùn)練時(shí)一樣的方法預(yù)處理image(第26-29行)。
這時(shí),加載模型和標(biāo)簽二值化,然后分類圖片:
為了分類圖片,我們需要模型和標(biāo)簽二值化。我們?cè)诘?4和35行加載這兩者。
接著,我們分類圖片然后創(chuàng)建標(biāo)簽(第39-41行)。
剩下的代碼塊是為了展示:
在第46和47行,我們從filename中提取神奇寶貝的名字并且把它和label比較。correct變量將會(huì)根據(jù)結(jié)果顯示”correct”或”incorrect”。顯然這兩行包含了這樣的假設(shè),即你輸入的文件有一個(gè)文件名是它真正的標(biāo)簽。
我們進(jìn)行如下步驟:
附加百分比的概率和”correct”/”incorrect”的文本進(jìn)了類標(biāo)簽(第50行)。
調(diào)整output圖片的尺寸使得它適合屏幕(第51行)。
在output圖片上畫(huà)標(biāo)簽的文字(第52和53行)。
展示output圖像并且等待按鍵來(lái)退出(第57和58行)。
用CNN和Keras分類圖片
現(xiàn)在準(zhǔn)備運(yùn)行classify.py腳本!
確保你已經(jīng)從“下載”部分(在這篇博文的下面)獲得了代碼+圖片。
一旦你已經(jīng)下載并且解壓了壓縮文件,就把它放入這個(gè)項(xiàng)目的根目錄中,并且跟著我從一個(gè)小火龍的圖片開(kāi)始。注意到我們已經(jīng)提供了三個(gè)命令行語(yǔ)句來(lái)執(zhí)行這個(gè)腳本:
圖4:用Keras和CNN正確分類了一個(gè)輸入圖片
現(xiàn)在用尊貴和兇猛的布隆巴爾口袋妖怪填充玩具來(lái)考驗(yàn)我們的模型。
圖5:Keras深度學(xué)習(xí)圖片分類器再次正確分類輸入圖片。
嘗試一個(gè)超夢(mèng)(一個(gè)基因改造過(guò)的神奇寶貝)的玩具立體模型。
圖6:在CNN中使用Keras、深度學(xué)習(xí)和Python我們能夠正確分類輸入圖片。
如果一個(gè)神奇寶貝圖鑒不能識(shí)別出皮卡丘,那它有什么用呢!
圖7:用Keras模型我們可以識(shí)別標(biāo)志性的皮卡丘。
現(xiàn)在嘗試可愛(ài)的杰尼龜神奇寶貝。
圖8:用Keras和CNN正確分類圖片。
最后,再次分類有火尾巴的小火龍。這次他很害羞并且有一部分藏在了我的顯示器下面。
圖9:最后一個(gè)用Keras和CNN正確分類輸入圖片的例子。
這些神奇寶貝中的每一個(gè)都和我的新神奇寶貝不符合。
目前,有大概807種不同種類的神奇寶貝。我們的分類器被訓(xùn)練用來(lái)分類5種不同的神奇寶貝(為了簡(jiǎn)單的目的)。
如果你想要訓(xùn)練一個(gè)分類器來(lái)識(shí)別神奇寶貝圖鑒中的更多神奇寶貝,你將要更多每個(gè)種類的更多的訓(xùn)練圖片。理想的情況下,你的目標(biāo)應(yīng)該是在每個(gè)你想要識(shí)別的種類里有500-1000個(gè)圖片。
為了獲得訓(xùn)練圖片,我建議你使用微軟必應(yīng)的圖片搜索API,比谷歌的圖片搜索引擎更好用。
這個(gè)模型的限制
這個(gè)模型的主要限制是很少的訓(xùn)練數(shù)據(jù)。我測(cè)試過(guò)不同的圖片,有時(shí)這個(gè)分類器是不準(zhǔn)確額。這時(shí),我仔細(xì)檢查了輸入圖片+網(wǎng)絡(luò)然后發(fā)現(xiàn)圖片中最顯著的顏色很嚴(yán)重地影響了分類器。
比如,一個(gè)有很多的紅色或者黃色的圖片很可能讓它被識(shí)別成小火龍。類似的,一個(gè)有很多黃色的圖片通常被識(shí)別成皮卡丘。
這一部分是因?yàn)槲覀兊妮斎霐?shù)據(jù)。神奇寶貝顯然是虛假的并且沒(méi)有它們顯示中的圖片(除了立體模型和毛絨玩具)。
我們的圖片大多數(shù)來(lái)自于一個(gè)粉絲的繪畫(huà),或者電影/電視的截圖。此外,我們每個(gè)種類只有很少的數(shù)據(jù)(225-250個(gè)圖片)。
理想的情況下,在訓(xùn)練一個(gè)卷積神經(jīng)網(wǎng)絡(luò)時(shí)我們每個(gè)種類有至少500-1000個(gè)圖片。記住這個(gè)當(dāng)你處理你自己的數(shù)據(jù)時(shí)。
我們能否使用Keras深度學(xué)習(xí)模型作為一個(gè)REST API?
如果你想用這個(gè)模型(或其它深度學(xué)習(xí)模型)作為一個(gè)REST API,我寫過(guò)三個(gè)博文來(lái)幫助你開(kāi)始:
創(chuàng)建一個(gè)簡(jiǎn)單的Keras+深度學(xué)習(xí)REST API
一個(gè)可拓展的Keras+深度學(xué)習(xí)REST API
深度學(xué)習(xí)和Keras、Redis、Flask、Apache一起使用
總 結(jié)
在今天的博文中你學(xué)習(xí)了如何用Keras深度學(xué)習(xí)庫(kù)構(gòu)建一個(gè)卷積神經(jīng)網(wǎng)絡(luò)s。
我們數(shù)據(jù)集的收集方法在上周的博文中已經(jīng)講過(guò)了。
我們的數(shù)據(jù)集包含5種神奇寶貝的1191個(gè)圖片。
用卷積神經(jīng)網(wǎng)絡(luò)和Keras,我們能獲得97.07%的準(zhǔn)確率。這是很厲害的,因?yàn)椋?/p>
我們數(shù)據(jù)集不大
我們網(wǎng)絡(luò)中的參數(shù)量少
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4772瀏覽量
100808 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5503瀏覽量
121206 -
keras
+關(guān)注
關(guān)注
2文章
20瀏覽量
6087
原文標(biāo)題:用Keras和CNN建立模型,識(shí)別神奇寶貝(附代碼)
文章出處:【微信號(hào):thejiangmen,微信公眾號(hào):將門創(chuàng)投】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論