這篇文章給大家介紹如何用Keras框架構(gòu)建一個(gè)簡(jiǎn)單的卷積神經(jīng)網(wǎng)絡(luò),內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),賀蘭企業(yè)網(wǎng)站建設(shè),賀蘭品牌網(wǎng)站建設(shè),網(wǎng)站定制,賀蘭網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,賀蘭網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。問(wèn)題介紹
在討論問(wèn)題細(xì)節(jié)之前,我想先介紹一下業(yè)務(wù)流程,Avito.ma是一個(gè)行業(yè)領(lǐng)先的摩洛哥電子商務(wù)廣告平臺(tái),用戶可以在其中發(fā)布廣告,銷售二手商品或新產(chǎn)品,如手機(jī)、筆記本電腦、汽車、摩托車等。
現(xiàn)在,讓我們討論這個(gè)問(wèn)題:為了發(fā)布廣告、銷售產(chǎn)品,你首先必須填寫(xiě)一個(gè)表單,描述你的產(chǎn)品概況,設(shè)定價(jià)格,并上傳其相應(yīng)的照片。在成功填寫(xiě)這些字段后,你必須等待大約60分鐘,以便在網(wǎng)站相關(guān)管理人員審核驗(yàn)證這些圖片后,再發(fā)布你提交的廣告。
如今,在深度學(xué)習(xí)和計(jì)算機(jī)視覺(jué)的時(shí)代,通過(guò)人工檢查網(wǎng)頁(yè)內(nèi)容這被認(rèn)為是一種缺陷,并且非常耗時(shí),而且它可能產(chǎn)生許多錯(cuò)誤。例如下面這個(gè)錯(cuò)誤,網(wǎng)站審核人員發(fā)布了列在電話類別中的筆記本電腦廣告,這是錯(cuò)誤的,并將影響搜索引擎質(zhì)量,而這項(xiàng)工作可以通過(guò)深度學(xué)習(xí)模型在一秒鐘內(nèi)完成。
筆記本廣告發(fā)布在手機(jī)類鏈接中
在這篇博文中,我將介紹如何通過(guò)使用Keras框架構(gòu)建一個(gè)簡(jiǎn)單的卷積神經(jīng)網(wǎng)絡(luò)來(lái)優(yōu)化此過(guò)程,該框架可以分析上傳的圖像是用于手機(jī)廣告還是筆記本電腦廣告,并告訴我們圖像是否與廣告類別匹配。
博客文章將這個(gè)案例分為5個(gè)具體步驟。
數(shù)據(jù)收集
數(shù)據(jù)預(yù)處理
數(shù)據(jù)建模
使用TensorBoard分析模型
模型部署和評(píng)估
1.數(shù)據(jù)收集
就像任何數(shù)據(jù)科學(xué)項(xiàng)目一樣,我們應(yīng)該尋找的第一個(gè)組件是數(shù)據(jù),在這種情況下,我們將處理的數(shù)據(jù)從同一網(wǎng)站Avito.ma中刪除的一組圖像,用于筆記本電腦和手機(jī)兩類產(chǎn)品,結(jié)果文件夾將包含兩個(gè)子目錄分別稱為“筆記本電腦”和“電話”,下載的圖像大小在120×90到67×90之間,每個(gè)子目錄有3個(gè)RGB通道。以下是執(zhí)行此任務(wù)的代碼的快照,而筆記本中提供了完整代碼。(https://github.com/PaacMaan/avito_upload_classifier/blob/master/avito_image_classifier.ipynb)
一旦這個(gè)過(guò)程完成,我們得到了2097張筆記本電腦圖像和2180張手機(jī)圖像。為了使分類更準(zhǔn)確并且沒(méi)有偏差,我們需要驗(yàn)證幾乎相同的觀察數(shù)量的這兩個(gè)類,因?yàn)槲覀兛梢詮南旅娴膱D中實(shí)現(xiàn)可視化,兩個(gè)類的數(shù)量大致相當(dāng)平衡。
圖像分布在類上
2.數(shù)據(jù)預(yù)處理
對(duì)于預(yù)處理任務(wù),我們將其分為三個(gè)子任務(wù),如下所示:
2.1刪除噪聲數(shù)據(jù)
當(dāng)人工檢查下載的圖像時(shí),會(huì)注意到存在一些與相關(guān)類無(wú)關(guān)的噪聲圖像,例如下面的那些(手機(jī)充電器、手機(jī)包、虛擬現(xiàn)實(shí)眼鏡)能夠在手機(jī)文件夾中觀察到:
手機(jī)圖像中發(fā)現(xiàn)噪聲圖像
不幸的是,沒(méi)有自動(dòng)的方法來(lái)解決這個(gè)問(wèn)題,因此我們必須人工查看它們,并開(kāi)始刪除它們以僅保留與相應(yīng)類相關(guān)的圖像。
2.2圖像大小調(diào)整
此步驟完全取決于采用的深度學(xué)習(xí)架構(gòu),例如,當(dāng)使用Alexnet模型對(duì)圖像進(jìn)行分類時(shí),輸入圖像大小應(yīng)為22×227,而對(duì)于VGG-19,輸入圖像大小為224×224。
由于我們不打算采用任何預(yù)先構(gòu)建的架構(gòu),將構(gòu)建自己的卷積神經(jīng)網(wǎng)絡(luò)模型,其輸入大小為64 ×64,如下面的代碼快照所示。
要執(zhí)行此任務(wù),我們?cè)趦蓚€(gè)子目錄phone和laptop中創(chuàng)建另一個(gè)名為preprocessed_data的目錄,然后我們循環(huán)raw_data原始文件夾中的每個(gè)圖像以調(diào)整其大小,并將其保存在新創(chuàng)建的目錄中。
因此,我們最終得到了兩個(gè)類的新生成數(shù)據(jù)集,其格式為64×64。
2.3數(shù)據(jù)拆分
在調(diào)整數(shù)據(jù)集大小后,我們將其拆分為80%用于訓(xùn)練集,并保留其余部分進(jìn)行驗(yàn)證。為了執(zhí)行此任務(wù),我們創(chuàng)建了一個(gè)名為data的新目錄,其中我們?cè)O(shè)置了train和validation另外兩個(gè)新目錄,我們將為手機(jī)和筆記本電腦設(shè)置兩個(gè)類圖像。
更明確地,我們定義當(dāng)前目標(biāo)和目標(biāo)目錄,然后我們將訓(xùn)練集的比率固定為0.8,將驗(yàn)證的比率固定為0.2,以測(cè)量我們將從原始路徑移動(dòng)到目標(biāo)路徑的圖像數(shù)量。
執(zhí)行數(shù)據(jù)拆分的代碼快照
需要很好地可視化文件夾層次結(jié)構(gòu),這是項(xiàng)目樹(shù)視圖:
全局項(xiàng)目結(jié)構(gòu)
3.數(shù)據(jù)建模
現(xiàn)在我們到了這一管道的主要步驟,即數(shù)據(jù)建模,為此我們將建立一個(gè)卷積神經(jīng)網(wǎng)絡(luò),將對(duì)我們之前處理過(guò)的幾千部手機(jī)和筆記本電腦圖像進(jìn)行訓(xùn)練。
在計(jì)算機(jī)視覺(jué)中,卷積運(yùn)算是卷積神經(jīng)網(wǎng)絡(luò)的基本構(gòu)建塊之一,需要4個(gè)必需組件:
卷積神經(jīng)網(wǎng)絡(luò)的主要組成部分
對(duì)于這個(gè)模型,我們將討論每個(gè)組件如何使用Keras實(shí)現(xiàn)它以及從卷積到完全連接層的自己的參數(shù),但首先,讓我們發(fā)現(xiàn)內(nèi)置模型的完整架構(gòu)。
卷積神經(jīng)網(wǎng)絡(luò)(CNN)模型架構(gòu)
卷積層
在將順序?qū)ο髮?shí)例化為模型之后,我們使用add方法添加一個(gè)名為Conv2D的卷積層,其中第一個(gè)參數(shù)是過(guò)濾器,它是輸出數(shù)量的維數(shù),如模型摘要所示,第一層輸出的形狀為(None, 62, 62, 32)。
對(duì)于第二個(gè)參數(shù),kernel_size指定了1D卷積窗口的長(zhǎng)度,這里我們選擇3×3的窗口大小來(lái)卷積輸入卷。
第三個(gè)參數(shù)代表input_shape,它是分別與image_width x image_height x color channels (RGB)相關(guān)的64×64×3的大小,最后但并非最不重要的是activation_function,它負(fù)責(zé)添加非線性轉(zhuǎn)換。在這種情況下,我們選擇relu激活功能。
使用kernel_size =(3,3)進(jìn)行卷積運(yùn)算的插圖
大池層
在卷積之后添加大池化層的原因是減少我們之前應(yīng)用的卷積層提取的特征量,換句話說(shuō),我們對(duì)這些特征的位置感興趣。
為了對(duì)其高度進(jìn)行概括,如果有一個(gè)從x到y(tǒng)的垂直邊緣,將圖像的垂直邊緣降到圖像的2/3的高度。
所有這一過(guò)程都在Keras的一行代碼中恢復(fù):
在這里,我們使用add方法注入另一層名為MaxPooling2D的Maximum Pooling,其中pool_size是(2,2)的窗口,默認(rèn)情況下strides = None和padding ='valid'。
大池與pool_size =(2,2)的圖示
展平輸出
在結(jié)束卷積神經(jīng)網(wǎng)絡(luò)(CNN)模型時(shí),將大池展平輸出為連續(xù)的一維向量是必需的步驟。
Keras在這里所做的,只是在網(wǎng)絡(luò)中添加一個(gè)Flatten圖層,它簡(jiǎn)單地相當(dāng)于使用'C'排序重塑numpy中的函數(shù)。
全連接層
最后,我們將最后一層注入到全連接層的網(wǎng)絡(luò)中,您可以將其視為學(xué)習(xí)從先前卷積中提取的特征的非線性組合的廉價(jià)方法。
Keras通過(guò)將Dense功能添加到網(wǎng)絡(luò)中很容易實(shí)現(xiàn),它只需要兩個(gè)參數(shù)units和activation,它們分別代表我們將擁有的輸出單元的數(shù)量,因?yàn)槲覀冋谶M(jìn)行二進(jìn)制分類,因此它取值為2并激活功能使用。
編譯網(wǎng)絡(luò)
最后,我們必須通過(guò)調(diào)用編譯函數(shù)來(lái)編譯我們剛剛構(gòu)建的網(wǎng)絡(luò),這是使用Keras構(gòu)建的每個(gè)模型的必需步驟。
loss參數(shù),因?yàn)槲覀冇幸粋€(gè)二元分類,其中類M的數(shù)量等于2,交叉熵可以計(jì)算為:
二元交叉熵的目標(biāo)函數(shù)
其中p是預(yù)測(cè)概率,y是二進(jìn)制指示符(0或1)。
為了最小化這個(gè)目標(biāo)函數(shù),我們需要調(diào)用優(yōu)化器,例如adam,這是Adaptive Moment Estimation的簡(jiǎn)稱,默認(rèn)情況下,其學(xué)習(xí)速率設(shè)置為0.001,但不會(huì)關(guān)閉超參數(shù)調(diào)整窗口。為了總結(jié)我們所做的事情,下面是內(nèi)置模型的完整代碼。
加載圖像和數(shù)據(jù)轉(zhuǎn)換
為了將圖像提供給我們編譯的模型,我們調(diào)用ImageDataGenerator函數(shù),它將幫助我們生成具有實(shí)時(shí)數(shù)據(jù)增強(qiáng)的批量張量圖像數(shù)據(jù)。數(shù)據(jù)將循環(huán)(批量)。
現(xiàn)在我們已經(jīng)創(chuàng)建了兩個(gè)ImageDataGenerator實(shí)例,我們需要使用分類類模式為訓(xùn)練和驗(yàn)證數(shù)據(jù)集提供正確的路徑。
一旦訓(xùn)練(train)和驗(yàn)證(validation)集準(zhǔn)備好為網(wǎng)絡(luò)提供信息,我們就會(huì)調(diào)用fit_generator方法將它們提供給模型。
通常我們準(zhǔn)備另一個(gè)測(cè)試數(shù)據(jù)集,除了評(píng)估最終訓(xùn)練模型的驗(yàn)證,但為了保持簡(jiǎn)單性,并且只在驗(yàn)證集上進(jìn)行評(píng)估。
模型評(píng)估
完成訓(xùn)練后,我們的準(zhǔn)確率達(dá)到87.7%左右,仍然有0.352的高損失率,但具有高精度并不一定意味著我們有良好的模型質(zhì)量。我們需要在時(shí)間內(nèi)跟蹤和可視化模型的行為,為此,我們使用Keras提供的TensorBoard作為與TensorFlow后端一起運(yùn)行的回調(diào)函數(shù)。
4.使用TensorBoard分析模型
在這一步驟中,我們將看到如何使用TensorBoard分析我們的模型行為。TensorBoard是使用TensorFlow后端構(gòu)建的模型的工具,幫助我們基本上可視化我們的模型隨時(shí)間的訓(xùn)練,以及觀察準(zhǔn)確性與驗(yàn)證準(zhǔn)確度或損失與驗(yàn)證損失的關(guān)系。
使用Keras,可以通過(guò)調(diào)用TensorBoard函數(shù)僅在一行代碼中恢復(fù)此步驟,并在擬合數(shù)據(jù)時(shí)將其作為回調(diào)注入。
損失(Loss)
訓(xùn)練和驗(yàn)證集的損失直方圖
從上圖可以清楚地看出,對(duì)于從0.39到0.13的訓(xùn)練線,損失顯著下降,而對(duì)于驗(yàn)證線,從0.42開(kāi)始并且花費(fèi)25個(gè)周期達(dá)到0.35,它逐漸減少。
就個(gè)人而言,每當(dāng)我想評(píng)估模型時(shí),都會(huì)看到驗(yàn)證損失,我們可以在這里看到的是,在19個(gè)周期之后,驗(yàn)證損失開(kāi)始稍微增加,這可能會(huì)導(dǎo)致模型記住許多輸入樣本,驗(yàn)證這個(gè)假設(shè),我們更好地檢查準(zhǔn)確性直方圖。
準(zhǔn)確性
訓(xùn)練和驗(yàn)證集的準(zhǔn)確度直方圖的演變
正如我們所看到的,驗(yàn)證準(zhǔn)確性一直在增加,直到第19個(gè)周期它變得有些穩(wěn)定,并且具有預(yù)期的下降和上升,這可以通過(guò)從同一時(shí)期開(kāi)始增加時(shí)的驗(yàn)證損失行為來(lái)解釋。
為了保持良好的模型質(zhì)量,建議在這種情況下使用早期停止回調(diào),這將迫使模型在驗(yàn)證損失開(kāi)始增加或精度下降時(shí)以一定的容差停止訓(xùn)練。
5.采用Flask進(jìn)行模型部署
在轉(zhuǎn)移到部署細(xì)節(jié)之前,我們首先需要保存我們之前訓(xùn)練過(guò)的模型,為此我們調(diào)用save方法,如下所示:
一旦我們的模型被保存,我們可以在以后使用它來(lái)預(yù)測(cè)新的圖像類。
為什么采用Flask?
Flask是一個(gè)Python的微框架,其靈感來(lái)自于引用“Do Thing and Do It Well”,這就是我選擇Flask作為REST API提供模型的原因。
Flask應(yīng)用程序由2個(gè)主要組件組成:python應(yīng)用程序(app.py)和HTML模板,對(duì)于app.py,它將包含執(zhí)行預(yù)測(cè)的邏輯代碼,該代碼將作為HTTP響應(yīng)發(fā)送。該文件包含三個(gè)主要組件,可以顯示如下:
加載保存的模型。
轉(zhuǎn)換上傳的圖像。
使用加載的模型預(yù)測(cè)其適當(dāng)?shù)念悺?/p>
在下一節(jié)中,我們將討論這些方面最重要的組成部分。
回到主要問(wèn)題
當(dāng)用戶選擇作為廣告類別的筆記本電腦時(shí),預(yù)計(jì)他必須上傳筆記本電腦的圖像,但正在發(fā)生的事情是不同的。正如我們之前看到的那樣,有許多廣告,其中圖片包含標(biāo)注手機(jī)類別的筆記本電腦。
在運(yùn)行應(yīng)用程序并假設(shè)模型已成功加載后,用戶可以上傳不同大小的圖像,而我們的模型只能預(yù)測(cè)64×64×3的圖像,因此我們需要將它們轉(zhuǎn)換為正確的大小,以便我們的模型可以很好地預(yù)測(cè)它。
處理上傳圖像的代碼快照
轉(zhuǎn)換上傳的圖像后,我們將其作為參數(shù)發(fā)送到加載的模型,以便進(jìn)行預(yù)測(cè)并將HTTP響應(yīng)作為JSON對(duì)象返回,其中模式如下:
第一個(gè)屬性是圖像預(yù)測(cè)類,第二個(gè)屬性是布爾值,表示從用戶中選擇的類別是否與上傳的圖像匹配。下面我展示了執(zhí)行此工作的代碼邏輯的快照。
應(yīng)用演示
要運(yùn)行應(yīng)用程序,我們只需切換到創(chuàng)建app.py的文件夾,然后運(yùn)行以下命令:
然后我們?yōu)g覽控制臺(tái)上顯示的以下URL:http://127.0.0.1:5000 /,一旦顯示索引頁(yè)面,選擇廣告類別并上傳其相關(guān)照片,在幕后將請(qǐng)求發(fā)送到路徑/上傳將照片保存在目錄中以預(yù)測(cè)其適當(dāng)?shù)念悺?/p>
這是現(xiàn)場(chǎng)演示我們?cè)诒卷?xiàng)目結(jié)束時(shí)能夠建立的內(nèi)容。
Web應(yīng)用程序演示
如果選擇的和預(yù)測(cè)的類都匹配,那么你會(huì)得到一條成功消息,說(shuō)明一切正常,否則會(huì)收到一條警告消息,選擇框?qū)⒆詣?dòng)更改為相應(yīng)的預(yù)測(cè)類。
結(jié)論
最后,本博客文章通過(guò)構(gòu)建深度學(xué)習(xí)模型來(lái)展示完整的計(jì)算機(jī)視覺(jué)管道,該模型可以預(yù)測(cè)應(yīng)用于電子商務(wù)場(chǎng)景的上傳圖像的類別,從數(shù)據(jù)收集到數(shù)據(jù)建模,并通過(guò)模型部署作為Web完成應(yīng)用程序。
改善的方法:
1.通過(guò)為兩個(gè)類刪除更多圖像來(lái)增加數(shù)據(jù)大小并刪除噪聲。
2.針對(duì)學(xué)習(xí)率和beta值的超參數(shù)調(diào)整。
3.嘗試其他架構(gòu),如Lenet-5。(yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf)
4.在完全連接(密集)層上使用Dropout。
關(guān)于如何用Keras框架構(gòu)建一個(gè)簡(jiǎn)單的卷積神經(jīng)網(wǎng)絡(luò)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
本文標(biāo)題:如何用Keras框架構(gòu)建一個(gè)簡(jiǎn)單的卷積神經(jīng)網(wǎng)絡(luò)-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://www.rwnh.cn/article46/cegseg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、App設(shè)計(jì)、響應(yīng)式網(wǎng)站、建站公司、網(wǎng)站策劃、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容