溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

發(fā)布時(shí)間:2021-12-23 16:39:11 來源:億速云 閱讀:140 作者:柒染 欄目:互聯(lián)網(wǎng)科技

這篇文章給大家介紹如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò),內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

問題介紹

在討論問題細(xì)節(jié)之前,我想先介紹一下業(yè)務(wù)流程,Avito.ma是一個(gè)行業(yè)領(lǐng)先的摩洛哥電子商務(wù)廣告平臺(tái),用戶可以在其中發(fā)布廣告,銷售二手商品或新產(chǎn)品,如手機(jī)、筆記本電腦、汽車、摩托車等。

現(xiàn)在,讓我們討論這個(gè)問題:為了發(fā)布廣告、銷售產(chǎn)品,你首先必須填寫一個(gè)表單,描述你的產(chǎn)品概況,設(shè)定價(jià)格,并上傳其相應(yīng)的照片。在成功填寫這些字段后,你必須等待大約60分鐘,以便在網(wǎng)站相關(guān)管理人員審核驗(yàn)證這些圖片后,再發(fā)布你提交的廣告。

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

如今,在深度學(xué)習(xí)和計(jì)算機(jī)視覺的時(shí)代,通過人工檢查網(wǎng)頁內(nèi)容這被認(rèn)為是一種缺陷,并且非常耗時(shí),而且它可能產(chǎn)生許多錯(cuò)誤。例如下面這個(gè)錯(cuò)誤,網(wǎng)站審核人員發(fā)布了列在電話類別中的筆記本電腦廣告,這是錯(cuò)誤的,并將影響搜索引擎質(zhì)量,而這項(xiàng)工作可以通過深度學(xué)習(xí)模型在一秒鐘內(nèi)完成。

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

筆記本廣告發(fā)布在手機(jī)類鏈接中

在這篇博文中,我將介紹如何通過使用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)來優(yōu)化此過程,該框架可以分析上傳的圖像是用于手機(jī)廣告還是筆記本電腦廣告,并告訴我們圖像是否與廣告類別匹配。

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

博客文章將這個(gè)案例分為5個(gè)具體步驟。

  1. 數(shù)據(jù)收集

  2. 數(shù)據(jù)預(yù)處理

  3. 數(shù)據(jù)建模

  4. 使用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)

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

一旦這個(gè)過程完成,我們得到了2097張筆記本電腦圖像和2180張手機(jī)圖像。為了使分類更準(zhǔn)確并且沒有偏差,我們需要驗(yàn)證幾乎相同的觀察數(shù)量的這兩個(gè)類,因?yàn)槲覀兛梢詮南旅娴膱D中實(shí)現(xiàn)可視化,兩個(gè)類的數(shù)量大致相當(dāng)平衡。

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

圖像分布在類上

2.數(shù)據(jù)預(yù)處理

對(duì)于預(yù)處理任務(wù),我們將其分為三個(gè)子任務(wù),如下所示:

2.1刪除噪聲數(shù)據(jù)

當(dāng)人工檢查下載的圖像時(shí),會(huì)注意到存在一些與相關(guān)類無關(guān)的噪聲圖像,例如下面的那些(手機(jī)充電器、手機(jī)包、虛擬現(xiàn)實(shí)眼鏡)能夠在手機(jī)文件夾中觀察到:

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

手機(jī)圖像中發(fā)現(xiàn)噪聲圖像

不幸的是,沒有自動(dòng)的方法來解決這個(gè)問題,因此我們必須人工查看它們,并開始刪除它們以僅保留與相應(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,如下面的代碼快照所示。

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

要執(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ù)量。

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

執(zhí)行數(shù)據(jù)拆分的代碼快照

需要很好地可視化文件夾層次結(jié)構(gòu),這是項(xiàng)目樹視圖: 

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

全局項(xiàng)目結(jié)構(gòu)

3.數(shù)據(jù)建模

現(xiàn)在我們到了這一管道的主要步驟,即數(shù)據(jù)建模,為此我們將建立一個(gè)卷積神經(jīng)網(wǎng)絡(luò),將對(duì)我們之前處理過的幾千部手機(jī)和筆記本電腦圖像進(jìn)行訓(xùn)練。

在計(jì)算機(jī)視覺中,卷積運(yùn)算是卷積神經(jīng)網(wǎng)絡(luò)的基本構(gòu)建塊之一,需要4個(gè)必需組件:

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

卷積神經(jīng)網(wǎng)絡(luò)的主要組成部分

對(duì)于這個(gè)模型,我們將討論每個(gè)組件如何使用Keras實(shí)現(xiàn)它以及從卷積到完全連接層的自己的參數(shù),但首先,讓我們發(fā)現(xiàn)內(nèi)置模型的完整架構(gòu)。

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

卷積神經(jīng)網(wǎng)絡(luò)(CNN)模型架構(gòu)

卷積層

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

在將順序?qū)ο髮?shí)例化為模型之后,我們使用add方法添加一個(gè)名為Conv2D的卷積層,其中第一個(gè)參數(shù)是過濾器,它是輸出數(shù)量的維數(shù),如模型摘要所示,第一層輸出的形狀為(None, 62, 62, 32)。

對(duì)于第二個(gè)參數(shù),kernel_size指定了1D卷積窗口的長度,這里我們選擇3×3的窗口大小來卷積輸入卷。

第三個(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激活功能。

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

使用kernel_size =(3,3)進(jìn)行卷積運(yùn)算的插圖

最大池層

在卷積之后添加最大池化層的原因是減少我們之前應(yīng)用的卷積層提取的特征量,換句話說,我們對(duì)這些特征的位置感興趣。

為了對(duì)其高度進(jìn)行概括,如果有一個(gè)從x到y(tǒng)的垂直邊緣,將圖像的垂直邊緣降到圖像的2/3的高度。

所有這一過程都在Keras的一行代碼中恢復(fù):

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

在這里,我們使用add方法注入另一層名為MaxPooling2D的Maximum Pooling,其中pool_size是(2,2)的窗口,默認(rèn)情況下strides = None和padding ='valid'。

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

最大池與pool_size =(2,2)的圖示

展平輸出

在結(jié)束卷積神經(jīng)網(wǎng)絡(luò)(CNN)模型時(shí),將最大池展平輸出為連續(xù)的一維向量是必需的步驟。

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

Keras在這里所做的,只是在網(wǎng)絡(luò)中添加一個(gè)Flatten圖層,它簡單地相當(dāng)于使用'C'排序重塑numpy中的函數(shù)。

全連接層

最后,我們將最后一層注入到全連接層的網(wǎng)絡(luò)中,您可以將其視為學(xué)習(xí)從先前卷積中提取的特征的非線性組合的廉價(jià)方法。

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

Keras通過將Dense功能添加到網(wǎng)絡(luò)中很容易實(shí)現(xiàn),它只需要兩個(gè)參數(shù)units和activation,它們分別代表我們將擁有的輸出單元的數(shù)量,因?yàn)槲覀冋谶M(jìn)行二進(jìn)制分類,因此它取值為2并激活功能使用。

編譯網(wǎng)絡(luò)

最后,我們必須通過調(diào)用編譯函數(shù)來編譯我們剛剛構(gòu)建的網(wǎng)絡(luò),這是使用Keras構(gòu)建的每個(gè)模型的必需步驟。

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

loss參數(shù),因?yàn)槲覀冇幸粋€(gè)二元分類,其中類M的數(shù)量等于2,交叉熵可以計(jì)算為:

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

二元交叉熵的目標(biāo)函數(shù)

其中p是預(yù)測(cè)概率,y是二進(jìn)制指示符(0或1)。

為了最小化這個(gè)目標(biāo)函數(shù),我們需要調(diào)用優(yōu)化器,例如adam,這是Adaptive Moment Estimation的簡稱,默認(rèn)情況下,其學(xué)習(xí)速率設(shè)置為0.001,但不會(huì)關(guān)閉超參數(shù)調(diào)整窗口。為了總結(jié)我們所做的事情,下面是內(nèi)置模型的完整代碼。

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

加載圖像和數(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ù)集提供正確的路徑。

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

一旦訓(xùn)練(train)和驗(yàn)證(validation)集準(zhǔn)備好為網(wǎng)絡(luò)提供信息,我們就會(huì)調(diào)用fit_generator方法將它們提供給模型。

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

通常我們準(zhǔn)備另一個(gè)測(cè)試數(shù)據(jù)集,除了評(píng)估最終訓(xùn)練模型的驗(yà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,可以通過調(diào)用TensorBoard函數(shù)僅在一行代碼中恢復(fù)此步驟,并在擬合數(shù)據(jù)時(shí)將其作為回調(diào)注入。

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

損失(Loss)

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

訓(xùn)練和驗(yàn)證集的損失直方圖

從上圖可以清楚地看出,對(duì)于從0.39到0.13的訓(xùn)練線,損失顯著下降,而對(duì)于驗(yàn)證線,從0.42開始并且花費(fèi)25個(gè)周期達(dá)到0.35,它逐漸減少。

就個(gè)人而言,每當(dāng)我想評(píng)估模型時(shí),都會(huì)看到驗(yàn)證損失,我們可以在這里看到的是,在19個(gè)周期之后,驗(yàn)證損失開始稍微增加,這可能會(huì)導(dǎo)致模型記住許多輸入樣本,驗(yàn)證這個(gè)假設(shè),我們更好地檢查準(zhǔn)確性直方圖。

準(zhǔn)確性

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

訓(xùn)練和驗(yàn)證集的準(zhǔn)確度直方圖的演變

正如我們所看到的,驗(yàn)證準(zhǔn)確性一直在增加,直到第19個(gè)周期它變得有些穩(wěn)定,并且具有預(yù)期的下降和上升,這可以通過從同一時(shí)期開始增加時(shí)的驗(yàn)證損失行為來解釋。

為了保持良好的模型質(zhì)量,建議在這種情況下使用早期停止回調(diào),這將迫使模型在驗(yàn)證損失開始增加或精度下降時(shí)以一定的容差停止訓(xùn)練。

5.采用Flask進(jìn)行模型部署

在轉(zhuǎn)移到部署細(xì)節(jié)之前,我們首先需要保存我們之前訓(xùn)練過的模型,為此我們調(diào)用save方法,如下所示:

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

一旦我們的模型被保存,我們可以在以后使用它來預(yù)測(cè)新的圖像類。

為什么采用Flask?

Flask是一個(gè)Python的微框架,其靈感來自于引用“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è)主要組件,可以顯示如下:

  1. 加載保存的模型。

  2. 轉(zhuǎn)換上傳的圖像。

  3. 使用加載的模型預(yù)測(cè)其適當(dāng)?shù)念悺?/p>

在下一節(jié)中,我們將討論這些方面最重要的組成部分。

回到主要問題

當(dāng)用戶選擇作為廣告類別的筆記本電腦時(shí),預(yù)計(jì)他必須上傳筆記本電腦的圖像,但正在發(fā)生的事情是不同的。正如我們之前看到的那樣,有許多廣告,其中圖片包含標(biāo)注手機(jī)類別的筆記本電腦。

在運(yùn)行應(yīng)用程序并假設(shè)模型已成功加載后,用戶可以上傳不同大小的圖像,而我們的模型只能預(yù)測(cè)64×64×3的圖像,因此我們需要將它們轉(zhuǎn)換為正確的大小,以便我們的模型可以很好地預(yù)測(cè)它。

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

處理上傳圖像的代碼快照

轉(zhuǎn)換上傳的圖像后,我們將其作為參數(shù)發(fā)送到加載的模型,以便進(jìn)行預(yù)測(cè)并將HTTP響應(yīng)作為JSON對(duì)象返回,其中模式如下:

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

第一個(gè)屬性是圖像預(yù)測(cè)類,第二個(gè)屬性是布爾值,表示從用戶中選擇的類別是否與上傳的圖像匹配。下面我展示了執(zhí)行此工作的代碼邏輯的快照。

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

應(yīng)用演示

要運(yùn)行應(yīng)用程序,我們只需切換到創(chuàng)建app.py的文件夾,然后運(yùn)行以下命令:

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

然后我們?yōu)g覽控制臺(tái)上顯示的以下URL:http://127.0.0.1:5000 /,一旦顯示索引頁面,選擇廣告類別并上傳其相關(guān)照片,在幕后將請(qǐng)求發(fā)送到路徑/上傳將照片保存在目錄中以預(yù)測(cè)其適當(dāng)?shù)念悺?/p>

這是現(xiàn)場(chǎng)演示我們?cè)诒卷?xiàng)目結(jié)束時(shí)能夠建立的內(nèi)容。

如何用Keras框架構(gòu)建一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)

Web應(yīng)用程序演示

如果選擇的和預(yù)測(cè)的類都匹配,那么你會(huì)得到一條成功消息,說明一切正常,否則會(huì)收到一條警告消息,選擇框?qū)⒆詣?dòng)更改為相應(yīng)的預(yù)測(cè)類。

結(jié)論

最后,本博客文章通過構(gòu)建深度學(xué)習(xí)模型來展示完整的計(jì)算機(jī)視覺管道,該模型可以預(yù)測(cè)應(yīng)用于電子商務(wù)場(chǎng)景的上傳圖像的類別,從數(shù)據(jù)收集到數(shù)據(jù)建模,并通過模型部署作為Web完成應(yīng)用程序。

改善的方法:

1.通過為兩個(gè)類刪除更多圖像來增加數(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è)簡單的卷積神經(jīng)網(wǎng)絡(luò)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI