日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

超干货|使用Keras和CNN构建分类器(内含代码和讲解)

發布時間:2024/8/23 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 超干货|使用Keras和CNN构建分类器(内含代码和讲解) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

摘要:?為了讓文章不那么枯燥,我構建了一個精靈圖鑒數據集(Pokedex)這都是一些受歡迎的精靈圖。我們在已經準備好的圖像數據集上,使用Keras庫訓練一個卷積神經網絡(CNN)。


為了讓文章不那么枯燥,我構建了一個精靈圖鑒數據集(Pokedex)這都是一些受歡迎的精靈圖。我們在已經準備好的圖像數據集上,使用Keras庫訓練一個卷積神經網絡(CNN)。


深度學習數據集



上圖是來自我們的精靈圖鑒深度學習數據集中的合成圖樣本。我的目標是使用Keras庫和深度學習訓練一個CNN,對Pokedex數據集中的圖像進行識別和分類。Pokedex數據集包括:Bulbasaur?(234 images)Charmander?(238 images)Squirtle?(223 images)Pikachu?(234 images)Mewtwo?(239 images)


訓練圖像包括以下組合:電視或電影的靜態幀;交易卡;行動人物;玩具和小玩意兒;圖紙和粉絲的藝術效果圖。

在這種多樣化的訓練圖像的情況下,實驗結果證明,CNN模型的分類準確度高達97


CNNKeras庫的項目結構

該項目分為幾個部分,目錄結構如下:



如上圖所示,共分為3個目錄:

1.數據集:包含五個類,每個類都是一個子目錄。

2.示例:包含用于測試卷積神經網絡的圖像。

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


另外,根目錄下有5個文件:

1.plot.png:訓練腳本運行后,生成的訓練/測試準確性和損耗圖。

2.lb.pickleLabelBinarizer序列化文件,在類名稱查找機制中包含類索引。

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

4.train.py:訓練Keras CNN,繪制準確性/損耗函數,然后將卷積神經網絡和類標簽二進制文件序列化到磁盤。

5.classify.py:測試腳本。


KerasCNN架構


我們今天使用的CNN架構,是由SimonyanZisserman2014年的論文用于大規模圖像識別的強深度卷積網絡中介紹的VGGNet網絡的簡單版本,結構圖如上圖所示。該網絡架構的特點是:

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

2.使用最大池化來減小數組大小。

3.網絡末端全連接層在softmax分類器之前。


假設你已經在系統上安裝并配置了Keras。如果沒有,請參照以下連接了解開發環境的配置教程:

1.配置Ubuntu,使用Python進行深度學習。

2.設置Ubuntu 16.04 + CUDA + GPU,使用Python進行深度學習。

3.配置macOS,使用Python進行深度學習。


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



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


現在定義SmallerVGGNet類:



該構建方法需要四個參數:

1.width:圖像寬度。

2.height?:圖像高度。

3.depth?:圖像深度。

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


注意:我們使用的是深度為3、大小為96 * 96的輸入圖像。后邊解釋輸入數組通過網絡的空間維度時,請記住這一點。


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

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


卷積層有32個內核大小為3*3的濾波器,使用RELU激活函數,然后進行批量標準化。

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

如代碼所示,在網絡架構中使用DropoutDropout隨機將節點從當前層斷開,并連接到下一層。這個隨機斷開的過程有助于降低模型中的冗余——網絡層中沒有任何單個節點負責預測某個類、對象、邊或角。

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


在降低輸入數組的空間維度前,將多個卷積層RELU層堆疊在一起可以學習更豐富的特征集。

請注意:將濾波器大小從32增加到64。隨著網絡的深入,輸入數組的空間維度越小,濾波器學習到的內容更多;將最大池化層從3*3降低到2*2,以確保不會過快地降低空間維度。在這個過程中再次執行Dropout

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


我們已經將濾波器的大小增加到128。對25%的節點執行Droupout以減少過擬合。

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


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

最后再執行一次Droupout——在訓練期間我們Droupout50%的節點。通常情況下,你會在全連接層在較低速率下使用40-50%的Droupout,其他網絡層為10-25%的Droupout

softmax分類器對模型進行四舍五入,該分類器將返回每個類別標簽的預測概率值。


CNN + Keras訓練腳本的實現

既然VGGNet小版本已經實現,現在我們使用Keras來訓練卷積神經網絡。

創建一個名為train.py的新文件,并插入以下代碼,導入需要的軟件包和庫:


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

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

7行導入了Adam優化器,用于訓練網絡。

9行的LabelBinarizer是一個重要的類,其作用如下:


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

2.將類標簽轉換為獨熱編碼矢量。

3.允許從Keras CNN中進行整型類別標簽預測,并轉換為人類可讀標簽。


經常會有讀者問:如何將類標簽字符串轉換為整型?或者如何將整型轉換為類標簽字符串。答案就是使用LabelBinarizer類。

10行的train_test_split函數用來創建訓練和測試分叉。

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


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

我們來解析一下命令行參數:



對于我們的訓練腳本,有三個必須的參數:

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

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

3.--labelbin:輸出標簽二進制器的路徑。


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

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

現在,初始化一些重要的變量:



35-38行對訓練Keras CNN時使用的重要變量進行初始化:

1.-EPOCHS訓練網絡的次數。

2.-INIT-LR初始學習速率值,1e-3Adam優化器的默認值,用來優化網絡。

3.-BS將成批的圖像傳送到網絡中進行訓練,同一時期會有多個批次,BS值控制批次的大小。

4.-IMAGE-DIMS提供輸入圖像的空間維度數。輸入的圖像為96*96*3(即RGB)。


然后初始化兩個列表——datalabels,分別保存預處理后的圖像和標簽。第46-48行抓取所有的圖像路徑并隨機擾亂。

現在,對所有的圖像路徑ImagePaths進行循環:


首先對imagePaths進行循環(第51行),再對圖像進行加載(第53行),然后調整其大小以適應模型(第54行)。

現在,更新datalabels列表。

調用Keras庫的img_to_arry函數,將圖像轉換為與Keras庫兼容的數組(第55行),然后將圖像添加到名為data的列表中(56)

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

那么,為什么需要類標簽分解過程呢?

考慮到這樣一個事實,我們有目的地創建dataset目錄結構,格式如下:


60行的路徑分隔符可以將路徑分割成一個數組,然后獲取列表中的倒數第二項——類標簽。

然后進行額外的預處理、二值化標簽和數據分區,代碼如下:?????????


首先將data數組轉換為NumPy數組,然后將像素強度縮放到[0,1]范圍內(第64行),也要將列表中的labels轉換為NumPy數組(第65行)。打印data矩陣的大小(以MB為單位)。

然后使用scikit-learn庫的LabelBinarzer對標簽進行二進制化(7071)

對于深度學習(或者任何機器學習),通常的做法是將訓練和測試分開。第7576行將訓練集和測試集按照80/20的比例進行分割。

接下來創建圖像數據增強對象:


因為訓練數據有限(每個類別的圖像數量小于250),因此可以利用數據增強為模型提供更多的圖像(基于現有圖像),數據增強是一種很重要的工具。

7981行使用ImageDataGenerator對變量aug進行初始化,即ImageDataGenerator??????

????????????現在,我們開始編譯模型和訓練:


85行和第86行使用96963的輸入圖像初始化Keras CNN模型。注意,我將SmallerVGGNet設計為接受96963輸入圖像。

87行使用具有學習速率衰減的Adam優化器,然后在88行和89行使用分類交叉熵編譯模型。

若只有2個類別,則使用二元交叉熵作為損失函數。

93-97行調用Kerasfit_generator方法訓練網絡。這一過程需要花費點時間,這取決于你是用CPU還是GPU進行訓練。

一旦Keras CNN訓練完成,我們需要保存模型(1)和標簽二進制化器(2),因為在訓練或測試集以外的圖像上進行測試時,需要從磁盤中加載出來:


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


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


使用Keras訓練CNN

執行以下代碼訓練模型:


訓練腳本的輸出結果如上圖所示,Keras CNN模型在訓練集上的分類準確率為96.84%;在測試集上的準確率為97.07

訓練損失函數和準確性圖如下:


如上圖所示,對模型訓練100次,并在有限的過擬合下實現了低損耗。在新的數據上也能獲得更高的準確性。


創建CNNKeras的腳本

現在,CNN已經訓練過了,我們需要編寫一個腳本,對新圖像進行分類。新建一個文件,并命名為classify.py,插入以下代碼:


上圖中第2-9行導入必要的庫。


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

1.--model:已訓練模型的路徑。

2.--labelbin:標簽二進制器的路徑。

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

接下來,加載圖像并對其進行預處理:


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

和訓練過程使用的預處理方式一樣,我們對圖像進行預處理(26-29行)。加載模型和標簽二值化器(3435行),對圖像進行分類:


隨后,對圖像進行分類并創建標簽(39-41行)。

剩余的代碼用于顯示:


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

1.50行將概率值和正確/不正確文本添加到類別標簽label上。

2.51行調整輸出圖像大小,使其適合屏幕輸出。

3.5253行在輸出圖像上繪制標簽。

4.5758行顯示輸出圖像并等待按鍵退出。


KNNKeras對圖像分類

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



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



其他圖像的分類代碼和以上兩個圖像的代碼一樣,可自行驗證其結果。


模型的局限性

該模型的主要局限是訓練數據少。我在各種不同的圖像進行測試,發現有時分類不正確。我仔細地檢查了輸入圖像和神經網絡,發現圖像中的主要顏色會影響分類結果。

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

理想情況下,訓練卷積神經網絡時,每個類別至少應有500-1,000幅圖像。

可以將Keras深度學習模型作為REST API嗎?

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

1.構建一個簡單的Keras +?深度學習REST API

2.可擴展的Keras +?深度學習REST API

3.使用KerasRedisFlaskApache進行深度學習


總結

這篇文章主要介紹了如何使用Keras庫來訓練卷積神經網絡(CNN)。使用的是自己創建的數據集(精靈圖鑒)作為訓練集和測試集,其分類的準確度達到97.07%。


原文鏈接

干貨好文,請關注掃描以下二維碼:



總結

以上是生活随笔為你收集整理的超干货|使用Keras和CNN构建分类器(内含代码和讲解)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 视频一区国产精品 | 黄色小毛片 | 日韩综合网 | 人人涩 | 超碰95在线 | 男女性生活视频网站 | 可以免费看的毛片 | 成人免费无码大片a毛片抽搐色欲 | 欧美福利网 | 91午夜视频 | 欧美日韩中文在线 | 欧美xxxx中国 | 日韩少妇激情 | 探花国产精品一区二区 | 国产成人av一区二区三区在线观看 | av美女在线观看 | 欧美国产日韩一区二区三区 | 巨大黑人极品videos精品 | 亚洲熟区| 叼嘿视频在线免费观看 | 六月丁香综合网 | 波多野结衣视频在线看 | a视频在线观看 | 日本三级中文字幕 | 久久99精品久久只有精品 | 日本高清视频www夜色资源 | 好男人www社区 | 风间由美av | 成人毛片18女人毛片 | av网址在线免费观看 | 大尺码肥胖女系列av | 日本嫩草影院 | 欧美在线xxx | 成人影视免费 | 欧美特黄色片 | 超碰超碰 | 国产日韩在线看 | 亚洲人一区二区三区 | 国产黄色网络 | 探花视频在线版播放免费观看 | 成人黄色视屏 | 中文字幕天堂网 | 久久高清精品 | 欧美熟妇精品一区二区蜜桃视频 | 最新中文字幕视频 | 美国伊人网 | 欧美男女视频 | 欧美激情中文字幕 | 国产一级大片 | 能在线看的av | 免费 成 人 黄 色 | 欧美日韩www | 国产丝袜视频在线 | 亚洲码无人客一区二区三区 | 天天操好逼 | av免费观看在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久免费精品国产 | 黄色一级大片在线观看 | 精品国产91 | 天天视频入口 | 欧美三级小视频 | 男人都懂的网址 | av激情小说| 亚洲国产欧洲 | 在线aa| 经典一区二区三区 | 毛片看看| 日本精品在线看 | 欧美女优视频 | 午夜丰满寂寞少妇精品 | 亚洲黄业 | 日本不卡网站 | 美女一区二区三区 | 大胸美女被爆操 | 免费观看在线高清 | 特黄aaaaaaaaa真人毛片 | 成人免费毛片日本片视频 | 国产91页 | av电影中文字幕 | 国产啊v在线观看 | 久久这里只有精品8 | 久草综合在线观看 | 久久狠狠婷婷 | 国产精品无码久久av | www.国产一区 | 一区二区三区韩国 | 午夜美女网站 | 欧美日韩激情视频在线观看 | 领导揉我胸亲奶揉下面 | 国产情侣自拍小视频 | 久久亚洲AV成人无码一二三 | 国产91精品在线观看 | 亚洲一区二区三区四区五区xx | 国产精品美女久久久免费 | 性生交大片免费看狂欲 | 国产精品三区四区 | 少女忠诚电影高清免费 | 无人在线观看高清视频 单曲 |