成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

超干貨|使用Keras和CNN構(gòu)建分類器(內(nèi)含代碼和講解)

shadowbook / 2716人閱讀

摘要:我們在已經(jīng)準(zhǔn)備好的圖像數(shù)據(jù)集上,使用庫訓(xùn)練一個(gè)卷積神經(jīng)網(wǎng)絡(luò)。示例包含用于測試卷積神經(jīng)網(wǎng)絡(luò)的圖像。訓(xùn)練,繪制準(zhǔn)確性損耗函數(shù),然后將卷積神經(jīng)網(wǎng)絡(luò)和類標(biāo)簽二進(jìn)制文件序列化到磁盤。第和行將訓(xùn)練集和測試集按照的比例進(jìn)行分割。

為了讓文章不那么枯燥,我構(gòu)建了一個(gè)精靈圖鑒數(shù)據(jù)集(Pokedex)這都是一些受歡迎的精靈圖。我們在已經(jīng)準(zhǔn)備好的圖像數(shù)據(jù)集上,使用Keras庫訓(xùn)練一個(gè)卷積神經(jīng)網(wǎng)絡(luò)(CNN)。

深度學(xué)習(xí)數(shù)據(jù)集

上圖是來自我們的精靈圖鑒深度學(xué)習(xí)數(shù)據(jù)集中的合成圖樣本。我的目標(biāo)是使用Keras庫和深度學(xué)習(xí)訓(xùn)練一個(gè)CNN,對Pokedex數(shù)據(jù)集中的圖像進(jìn)行識別和分類。Pokedex數(shù)據(jù)集包括:Bulbasaur (234 images);Charmander (238 images);Squirtle (223 images);Pikachu (234 images);Mewtwo (239 images)

訓(xùn)練圖像包括以下組合:電視或電影的靜態(tài)幀;交易卡;行動(dòng)人物;玩具和小玩意兒;圖紙和粉絲的藝術(shù)效果圖。

在這種多樣化的訓(xùn)練圖像的情況下,實(shí)驗(yàn)結(jié)果證明,CNN模型的分類準(zhǔn)確度高達(dá)97%!

CNN和Keras庫的項(xiàng)目結(jié)構(gòu)

該項(xiàng)目分為幾個(gè)部分,目錄結(jié)構(gòu)如下:

如上圖所示,共分為3個(gè)目錄:

1.數(shù)據(jù)集:包含五個(gè)類,每個(gè)類都是一個(gè)子目錄。

2.示例:包含用于測試卷積神經(jīng)網(wǎng)絡(luò)的圖像。

3.pyimagesearch模塊:包含我們的SmallerVGGNet模型類。

另外,根目錄下有5個(gè)文件:

1.plot.png:訓(xùn)練腳本運(yùn)行后,生成的訓(xùn)練/測試準(zhǔn)確性和損耗圖。

2.lb.pickle:LabelBinarizer序列化文件,在類名稱查找機(jī)制中包含類索引。

3.pokedex.model:序列化Keras CNN模型文件(即“權(quán)重文件”)。

4.train.py:訓(xùn)練Keras CNN,繪制準(zhǔn)確性/損耗函數(shù),然后將卷積神經(jīng)網(wǎng)絡(luò)和類標(biāo)簽二進(jìn)制文件序列化到磁盤。

5.classify.py:測試腳本。

Keras和CNN架構(gòu)

我們今天使用的CNN架構(gòu),是由Simonyan和Zisserman在2014年的論文“用于大規(guī)模圖像識別的強(qiáng)深度卷積網(wǎng)絡(luò)”中介紹的VGGNet網(wǎng)絡(luò)的簡單版本,結(jié)構(gòu)圖如上圖所示。該網(wǎng)絡(luò)架構(gòu)的特點(diǎn)是:

1.只使用3*3的卷積層堆疊在一起來增加深度。

2.使用最大池化來減小數(shù)組大小。

3.網(wǎng)絡(luò)末端全連接層在softmax分類器之前。

假設(shè)你已經(jīng)在系統(tǒng)上安裝并配置了Keras。如果沒有,請參照以下連接了解開發(fā)環(huán)境的配置教程:

1.配置Ubuntu,使用Python進(jìn)行深度學(xué)習(xí)。

2.設(shè)置Ubuntu 16.04 + CUDA + GPU,使用Python進(jìn)行深度學(xué)習(xí)。

3.配置macOS,使用Python進(jìn)行深度學(xué)習(xí)。

繼續(xù)使用SmallerVGGNet——VGGNet的更小版本。在pyimagesearch模塊中創(chuàng)建一個(gè)名為smallervggnet.py的新文件,并插入以下代碼:

注意:在pyimagesearch中創(chuàng)建一個(gè)_init_.py文件,以便Python知道該目錄是一個(gè)模塊。如果你對_init_.py文件不熟悉或者不知道如何使用它來創(chuàng)建模塊,你只需在原文的“下載”部分下載目錄結(jié)構(gòu)、源代碼、數(shù)據(jù)集和示例圖像。

現(xiàn)在定義SmallerVGGNet類:

該構(gòu)建方法需要四個(gè)參數(shù):

1.width:圖像寬度。

2.height :圖像高度。

3.depth :圖像深度。

4.classes :數(shù)據(jù)集中類的數(shù)量(這將影響模型的最后一層),我們使用了5個(gè)Pokemon 類。

注意:我們使用的是深度為3、大小為96 * 96的輸入圖像。后邊解釋輸入數(shù)組通過網(wǎng)絡(luò)的空間維度時(shí),請記住這一點(diǎn)。

由于我們使用的是TensorFlow后臺,因此用“channels last”對輸入數(shù)據(jù)進(jìn)行排序;如果想用“channels last”,則可以用代碼中的23-25行進(jìn)行處理。

為模型添加層,下圖為第一個(gè)CONV => RELU => POOL代碼塊:

卷積層有32個(gè)內(nèi)核大小為3*3的濾波器,使用RELU激活函數(shù),然后進(jìn)行批量標(biāo)準(zhǔn)化。

池化層使用3 3的池化,將空間維度從96 96快速降低到32 32(輸入圖像的大小為96 96 * 3的來訓(xùn)練網(wǎng)絡(luò))。

如代碼所示,在網(wǎng)絡(luò)架構(gòu)中使用Dropout。Dropout隨機(jī)將節(jié)點(diǎn)從當(dāng)前層斷開,并連接到下一層。這個(gè)隨機(jī)斷開的過程有助于降低模型中的冗余——網(wǎng)絡(luò)層中沒有任何單個(gè)節(jié)點(diǎn)負(fù)責(zé)預(yù)測某個(gè)類、對象、邊或角。

在使用另外一個(gè)池化層前,添加(CONV => RELU)* 2層:

在降低輸入數(shù)組的空間維度前,將多個(gè)卷積層RELU層堆疊在一起可以學(xué)習(xí)更豐富的特征集。

請注意:將濾波器大小從32增加到64。隨著網(wǎng)絡(luò)的深入,輸入數(shù)組的空間維度越小,濾波器學(xué)習(xí)到的內(nèi)容更多;將最大池化層從33降低到22,以確保不會過快地降低空間維度。在這個(gè)過程中再次執(zhí)行Dropout。

再添加一個(gè)(CONV => RELU)* 2 => POOL代碼塊:

我們已經(jīng)將濾波器的大小增加到128。對25%的節(jié)點(diǎn)執(zhí)行Droupout以減少過擬合。

最后,還有一組FC => RELU層和一個(gè)softmax分類器:

Dense(1024)使用具有校正的線性單位激活和批量歸一化指定全連接層。

最后再執(zhí)行一次Droupout——在訓(xùn)練期間我們Droupout了50%的節(jié)點(diǎn)。通常情況下,你會在全連接層在較低速率下使用40-50%的Droupout,其他網(wǎng)絡(luò)層為10-25%的Droupout。

用softmax分類器對模型進(jìn)行四舍五入,該分類器將返回每個(gè)類別標(biāo)簽的預(yù)測概率值。

CNN + Keras訓(xùn)練腳本的實(shí)現(xiàn)

既然VGGNet小版本已經(jīng)實(shí)現(xiàn),現(xiàn)在我們使用Keras來訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)。

創(chuàng)建一個(gè)名為train.py的新文件,并插入以下代碼,導(dǎo)入需要的軟件包和庫:

使用”Agg” matplotlib后臺,以便可以將數(shù)字保存在背景中(第3行)。

ImageDataGenerator類用于數(shù)據(jù)增強(qiáng),這是一種對數(shù)據(jù)集中的圖像進(jìn)行隨機(jī)變換(旋轉(zhuǎn)、剪切等)以生成其他訓(xùn)練數(shù)據(jù)的技術(shù)。數(shù)據(jù)增強(qiáng)有助于防止過擬合。

第7行導(dǎo)入了Adam優(yōu)化器,用于訓(xùn)練網(wǎng)絡(luò)。

第9行的LabelBinarizer是一個(gè)重要的類,其作用如下:

1.輸入一組類標(biāo)簽的集合(即表示數(shù)據(jù)集中人類可讀的類標(biāo)簽字符串)。

2.將類標(biāo)簽轉(zhuǎn)換為獨(dú)熱編碼矢量。

3.允許從Keras CNN中進(jìn)行整型類別標(biāo)簽預(yù)測,并轉(zhuǎn)換為人類可讀標(biāo)簽。

經(jīng)常會有讀者問:如何將類標(biāo)簽字符串轉(zhuǎn)換為整型?或者如何將整型轉(zhuǎn)換為類標(biāo)簽字符串。答案就是使用LabelBinarizer類。

第10行的train_test_split函數(shù)用來創(chuàng)建訓(xùn)練和測試分叉。

讀者對我自己的imutils包較為了解。如果你沒有安裝或更新,可以通過以下方式進(jìn)行安裝:

如果你使用的是Python虛擬環(huán)境,確保在安裝或升級imutils之前,用workon命令訪問特定的虛擬環(huán)境。

我們來解析一下命令行參數(shù):

對于我們的訓(xùn)練腳本,有三個(gè)必須的參數(shù):

1.--dataset:輸入數(shù)據(jù)集的路徑。數(shù)據(jù)集放在一個(gè)目錄中,其子目錄代表每個(gè)類,每個(gè)子目錄約有250個(gè)精靈圖片。

2.--model:輸出模型的路徑,將訓(xùn)練模型輸出到磁盤。

3.--labelbin:輸出標(biāo)簽二進(jìn)制器的路徑。

還有一個(gè)可選參數(shù)--plot。如果不指定路徑或文件名,那么plot.png文件則在當(dāng)前工作目錄中。

不需要修改第22-31行來提供新的文件路徑,代碼在運(yùn)行時(shí)會自行處理。

現(xiàn)在,初始化一些重要的變量:

第35-38行對訓(xùn)練Keras CNN時(shí)使用的重要變量進(jìn)行初始化:

1.-EPOCHS:訓(xùn)練網(wǎng)絡(luò)的次數(shù)。

2.-INIT-LR:初始學(xué)習(xí)速率值,1e-3是Adam優(yōu)化器的默認(rèn)值,用來優(yōu)化網(wǎng)絡(luò)。

3.-BS:將成批的圖像傳送到網(wǎng)絡(luò)中進(jìn)行訓(xùn)練,同一時(shí)期會有多個(gè)批次,BS值控制批次的大小。

4.-IMAGE-DIMS:提供輸入圖像的空間維度數(shù)。輸入的圖像為96963(即RGB)。

然后初始化兩個(gè)列表——data和labels,分別保存預(yù)處理后的圖像和標(biāo)簽。第46-48行抓取所有的圖像路徑并隨機(jī)擾亂。

現(xiàn)在,對所有的圖像路徑ImagePaths進(jìn)行循環(huán):

首先對imagePaths進(jìn)行循環(huán)(第51行),再對圖像進(jìn)行加載(第53行),然后調(diào)整其大小以適應(yīng)模型(第54行)。

現(xiàn)在,更新data和labels列表。

調(diào)用Keras庫的img_to_arry函數(shù),將圖像轉(zhuǎn)換為與Keras庫兼容的數(shù)組(第55行),然后將圖像添加到名為data的列表中(第56行)。

對于labels列表,我們在第60行文件路徑中提取出label,并將其添加在第61行。

那么,為什么需要類標(biāo)簽分解過程呢?

考慮到這樣一個(gè)事實(shí),我們有目的地創(chuàng)建dataset目錄結(jié)構(gòu),格式如下:

第60行的路徑分隔符可以將路徑分割成一個(gè)數(shù)組,然后獲取列表中的倒數(shù)第二項(xiàng)——類標(biāo)簽。

然后進(jìn)行額外的預(yù)處理、二值化標(biāo)簽和數(shù)據(jù)分區(qū),代碼如下:

首先將data數(shù)組轉(zhuǎn)換為NumPy數(shù)組,然后將像素強(qiáng)度縮放到[0,1]范圍內(nèi)(第64行),也要將列表中的labels轉(zhuǎn)換為NumPy數(shù)組(第65行)。打印data矩陣的大?。ㄒ訫B為單位)。

然后使用scikit-learn庫的LabelBinarzer對標(biāo)簽進(jìn)行二進(jìn)制化(第70和71行)。

對于深度學(xué)習(xí)(或者任何機(jī)器學(xué)習(xí)),通常的做法是將訓(xùn)練和測試分開。第75和76行將訓(xùn)練集和測試集按照80/20的比例進(jìn)行分割。

接下來創(chuàng)建圖像數(shù)據(jù)增強(qiáng)對象:

因?yàn)橛?xùn)練數(shù)據(jù)有限(每個(gè)類別的圖像數(shù)量小于250),因此可以利用數(shù)據(jù)增強(qiáng)為模型提供更多的圖像(基于現(xiàn)有圖像),數(shù)據(jù)增強(qiáng)是一種很重要的工具。

第79到81行使用ImageDataGenerator對變量aug進(jìn)行初始化,即ImageDataGenerator。
現(xiàn)在,我們開始編譯模型和訓(xùn)練:

第85行和第86行使用96*96*3的輸入圖像初始化Keras CNN模型。注意,我將SmallerVGGNet設(shè)計(jì)為接受96*96*3輸入圖像。

第87行使用具有學(xué)習(xí)速率衰減的Adam優(yōu)化器,然后在88行和89行使用分類交叉熵編譯模型。

若只有2個(gè)類別,則使用二元交叉熵作為損失函數(shù)。

93-97行調(diào)用Keras的fit_generator方法訓(xùn)練網(wǎng)絡(luò)。這一過程需要花費(fèi)點(diǎn)時(shí)間,這取決于你是用CPU還是GPU進(jìn)行訓(xùn)練。

一旦Keras CNN訓(xùn)練完成,我們需要保存模型(1)和標(biāo)簽二進(jìn)制化器(2),因?yàn)樵谟?xùn)練或測試集以外的圖像上進(jìn)行測試時(shí),需要從磁盤中加載出來:

對模型(101行)和標(biāo)簽二進(jìn)制器(105-107行)進(jìn)行序列化,以便稍后在classify.py腳本中使用。

最后,繪制訓(xùn)練和損失的準(zhǔn)確性圖,并保存到磁盤(第121行),而不是顯示出來,原因有二:(1)我的服務(wù)器在云端;(2)確保不會忘記保存圖。

使用Keras訓(xùn)練CNN

執(zhí)行以下代碼訓(xùn)練模型:

 訓(xùn)練腳本的輸出結(jié)果如上圖所示,Keras CNN模型在訓(xùn)練集上的分類準(zhǔn)確率為96.84%;在測試集上的準(zhǔn)確率為97.07%

訓(xùn)練損失函數(shù)和準(zhǔn)確性圖如下:

如上圖所示,對模型訓(xùn)練100次,并在有限的過擬合下實(shí)現(xiàn)了低損耗。在新的數(shù)據(jù)上也能獲得更高的準(zhǔn)確性。

創(chuàng)建CNN和Keras的腳本

現(xiàn)在,CNN已經(jīng)訓(xùn)練過了,我們需要編寫一個(gè)腳本,對新圖像進(jìn)行分類。新建一個(gè)文件,并命名為classify.py,插入以下代碼:

上圖中第2-9行導(dǎo)入必要的庫。

我們來解析下代碼中的參數(shù)(12-19行),需要的三個(gè)參數(shù)如下:

1.--model:已訓(xùn)練模型的路徑。

2.--labelbin:標(biāo)簽二進(jìn)制器的路徑。

3.--image:輸入圖像的路徑。

接下來,加載圖像并對其進(jìn)行預(yù)處理:

第22行加載輸入圖像image,并復(fù)制一個(gè)副本,賦值給out(第23行)。

和訓(xùn)練過程使用的預(yù)處理方式一樣,我們對圖像進(jìn)行預(yù)處理(26-29行)。加載模型和標(biāo)簽二值化器(34和35行),對圖像進(jìn)行分類:

隨后,對圖像進(jìn)行分類并創(chuàng)建標(biāo)簽(39-41行)。

剩余的代碼用于顯示:

第46-47行從filename中提取精靈圖鑒的名字,并與label進(jìn)行比較。Correct變量是“正確(correct)”或“不正確(incorrect)”。然后執(zhí)行以下操作:

1.50行將概率值和“正確/不正確”文本添加到類別標(biāo)簽label上。

2.51行調(diào)整輸出圖像大小,使其適合屏幕輸出。

3.52和53行在輸出圖像上繪制標(biāo)簽。

4.57和58行顯示輸出圖像并等待按鍵退出。

用KNN和Keras對圖像分類

運(yùn)行classify.py腳本(確保已經(jīng)從原文“下載”部分獲取代碼和圖片)!下載并解壓縮文件到這個(gè)項(xiàng)目的根目錄下,然后從Charmander圖像開始。代碼及試驗(yàn)結(jié)果如下:

Bulbasaur圖像分類的代碼及結(jié)果如下所示:

其他圖像的分類代碼和以上兩個(gè)圖像的代碼一樣,可自行驗(yàn)證其結(jié)果。

模型的局限性

該模型的主要局限是訓(xùn)練數(shù)據(jù)少。我在各種不同的圖像進(jìn)行測試,發(fā)現(xiàn)有時(shí)分類不正確。我仔細(xì)地檢查了輸入圖像和神經(jīng)網(wǎng)絡(luò),發(fā)現(xiàn)圖像中的主要顏色會影響分類結(jié)果。

例如,如果圖像中有許多紅色和橙色,則可能會返回“Charmander”標(biāo)簽;圖像中的黃色通常會返回“Pikachu”標(biāo)簽。這歸因于輸入數(shù)據(jù),精靈圖鑒是虛構(gòu)的,它沒有“真實(shí)世界”中的真實(shí)圖像。并且,我們只為每個(gè)類別提供了比較有限的數(shù)據(jù)(約225-250張圖片)。

理想情況下,訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)時(shí),每個(gè)類別至少應(yīng)有500-1,000幅圖像。

可以將Keras深度學(xué)習(xí)模型作為REST API嗎?

如果想將此模型(或任何其他深度學(xué)習(xí)模型)用作REST API運(yùn)行,可以參照下面的博文內(nèi)容:

1.構(gòu)建一個(gè)簡單的Keras + 深度學(xué)習(xí)REST API

2.可擴(kuò)展的Keras + 深度學(xué)習(xí)REST API

3.使用Keras,Redis,F(xiàn)lask和Apache進(jìn)行深度學(xué)習(xí)

總結(jié)

這篇文章主要介紹了如何使用Keras庫來訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)(CNN)。使用的是自己創(chuàng)建的數(shù)據(jù)集(精靈圖鑒)作為訓(xùn)練集和測試集,其分類的準(zhǔn)確度達(dá)到97.07%。

本文由阿里云云棲社區(qū)組織翻譯。

文章原標(biāo)題《Keras and Convolutional Neural Networks (CNNs)》,譯者:Mags,審校:袁虎。

詳情請閱讀原文

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/11859.html

相關(guān)文章

  • 分享AI有道干貨 | 126 篇 AI 原創(chuàng)文章精選(ML、DL、資源、教程)

    摘要:值得一提的是每篇文章都是我用心整理的,編者一貫堅(jiān)持使用通俗形象的語言給我的讀者朋友們講解機(jī)器學(xué)習(xí)深度學(xué)習(xí)的各個(gè)知識點(diǎn)。今天,紅色石頭特此將以前所有的原創(chuàng)文章整理出來,組成一個(gè)比較合理完整的機(jī)器學(xué)習(xí)深度學(xué)習(xí)的學(xué)習(xí)路線圖,希望能夠幫助到大家。 一年多來,公眾號【AI有道】已經(jīng)發(fā)布了 140+ 的原創(chuàng)文章了。內(nèi)容涉及林軒田機(jī)器學(xué)習(xí)課程筆記、吳恩達(dá) deeplearning.ai 課程筆記、機(jī)...

    jimhs 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<