0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用Keras創(chuàng)造一個(gè)卷積神經(jīng)網(wǎng)絡(luò)來(lái)識(shí)別神奇寶貝妙蛙種子的填充玩具

nlfO_thejiangme ? 來(lái)源:未知 ? 作者:李倩 ? 2018-08-31 11:11 ? 次閱讀

用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ù)量少

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 神經(jīng)網(wǎng)絡(luò)

    關(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)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    利用Keras實(shí)現(xiàn)四種卷積神經(jīng)網(wǎng)絡(luò)(CNN)可視化

    Keras實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)(CNN)可視化
    發(fā)表于 07-12 11:01

    卷積神經(jīng)網(wǎng)絡(luò)如何使用

    卷積神經(jīng)網(wǎng)絡(luò)(CNN)究竟是什么,鑒于神經(jīng)網(wǎng)絡(luò)在工程上經(jīng)歷了曲折的歷史,您為什么還會(huì)在意它呢? 對(duì)于這些非常中肯的問(wèn)題,我們似乎可以給出相對(duì)簡(jiǎn)明的答案。
    發(fā)表于 07-17 07:21

    什么是圖卷積神經(jīng)網(wǎng)絡(luò)?

    卷積神經(jīng)網(wǎng)絡(luò)
    發(fā)表于 08-20 12:05

    卷積神經(jīng)網(wǎng)絡(luò)的優(yōu)點(diǎn)是什么

    卷積神經(jīng)網(wǎng)絡(luò)的優(yōu)點(diǎn)
    發(fā)表于 05-05 18:12

    卷積神經(jīng)網(wǎng)絡(luò)卷積的處理過(guò)程

    。本文就以卷積神經(jīng)網(wǎng)絡(luò)為例談?wù)勗趺?b class='flag-5'>來(lái)進(jìn)步優(yōu)化卷積神經(jīng)網(wǎng)
    發(fā)表于 12-23 06:16

    卷積神經(jīng)網(wǎng)絡(luò)模型發(fā)展及應(yīng)用

    卷積神經(jīng)網(wǎng)絡(luò)模型發(fā)展及應(yīng)用轉(zhuǎn)載****地址:http://fcst.ceaj.org/CN/abstract/abstract2521.shtml深度學(xué)習(xí)是機(jī)器學(xué)習(xí)和人工智能研究的最新趨勢(shì),作為
    發(fā)表于 08-02 10:39

    卷積神經(jīng)網(wǎng)絡(luò)簡(jiǎn)介:什么是機(jī)器學(xué)習(xí)?

    列文章將只關(guān)注卷積神經(jīng)網(wǎng)絡(luò) (CNN)。CNN的主要應(yīng)用領(lǐng)域是輸入數(shù)據(jù)中包含的對(duì)象的模式識(shí)別和分類。CNN是種用于深度學(xué)習(xí)的人工神經(jīng)網(wǎng)絡(luò)。
    發(fā)表于 02-23 20:11

    卷積神經(jīng)網(wǎng)絡(luò)的應(yīng)用 卷積神經(jīng)網(wǎng)絡(luò)通常用來(lái)處理什么

    神經(jīng)網(wǎng)絡(luò),卷積神經(jīng)網(wǎng)絡(luò)廣泛用于圖像識(shí)別、自然語(yǔ)言處理、視頻處理等方面。本文將對(duì)卷積神經(jīng)網(wǎng)絡(luò)的應(yīng)用
    的頭像 發(fā)表于 08-21 16:41 ?4990次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)概述 卷積神經(jīng)網(wǎng)絡(luò)的特點(diǎn) cnn卷積神經(jīng)網(wǎng)絡(luò)的優(yōu)點(diǎn)

    卷積神經(jīng)網(wǎng)絡(luò)概述 卷積神經(jīng)網(wǎng)絡(luò)的特點(diǎn) cnn卷積神經(jīng)網(wǎng)絡(luò)的優(yōu)點(diǎn)?
    的頭像 發(fā)表于 08-21 16:41 ?2989次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)的工作原理 卷積神經(jīng)網(wǎng)絡(luò)通俗解釋

    。CNN可以幫助人們實(shí)現(xiàn)許多有趣的任務(wù),如圖像分類、物體檢測(cè)、語(yǔ)音識(shí)別、自然語(yǔ)言處理和視頻分析等。本文將詳細(xì)介紹卷積神經(jīng)網(wǎng)絡(luò)的工作原理并用通俗易懂的語(yǔ)言解釋。 1.概述 卷積
    的頭像 發(fā)表于 08-21 16:49 ?3763次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)如何識(shí)別圖像

    卷積神經(jīng)網(wǎng)絡(luò)如何識(shí)別圖像? 卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network, CNN)由于其出色的圖像
    的頭像 發(fā)表于 08-21 16:49 ?1942次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)應(yīng)用領(lǐng)域

    不同領(lǐng)域的應(yīng)用。 1.圖像識(shí)別 卷積神經(jīng)網(wǎng)絡(luò)最早應(yīng)用在圖像識(shí)別領(lǐng)域。其核心思想是通過(guò)多層濾波器來(lái)提取圖像的特征。
    的頭像 發(fā)表于 08-21 16:49 ?4494次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)的基本原理 卷積神經(jīng)網(wǎng)絡(luò)發(fā)展 卷積神經(jīng)網(wǎng)絡(luò)三大特點(diǎn)

    中最重要的神經(jīng)網(wǎng)絡(luò)。它是種由多個(gè)卷積層和池化層(也可稱為下采樣層)組成的神經(jīng)網(wǎng)絡(luò)。CNN 的基本思想是以圖像為輸入,通過(guò)
    的頭像 發(fā)表于 08-21 16:49 ?2453次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)層級(jí)結(jié)構(gòu) 卷積神經(jīng)網(wǎng)絡(luò)卷積層講解

    像分類、目標(biāo)檢測(cè)、人臉識(shí)別等。卷積神經(jīng)網(wǎng)絡(luò)的核心是卷積層和池化層,它們構(gòu)成了網(wǎng)絡(luò)的主干,實(shí)現(xiàn)了對(duì)圖像特征的提取和抽象。
    的頭像 發(fā)表于 08-21 16:49 ?8908次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)的介紹 什么是卷積神經(jīng)網(wǎng)絡(luò)算法

    卷積神經(jīng)網(wǎng)絡(luò)的介紹 什么是卷積神經(jīng)網(wǎng)絡(luò)算法 卷積神經(jīng)網(wǎng)絡(luò)涉及的關(guān)鍵技術(shù)
    的頭像 發(fā)表于 08-21 16:49 ?1882次閱讀