用Keras框架構建一個簡單的卷積神經網路!

格伯納發表於2018-09-03

問題介紹

在討論問題細節之前,我想先介紹一下業務流程,Avito.ma是一個行業領先的摩洛哥電子商務廣告平臺,使用者可以在其中釋出廣告,銷售二手商品或新產品,如手機、膝上型電腦、汽車、摩托車等。

現在,讓我們討論這個問題:為了釋出廣告、銷售產品,你首先必須填寫一個表單,描述你的產品概況,設定價格,並上傳其相應的照片。在成功填寫這些欄位後,你必須等待大約60分鐘,以便在網站相關管理人員稽核驗證這些圖片後,再發布你提交的廣告。

用Keras框架構建一個簡單的卷積神經網路!


如今,在深度學習和計算機視覺的時代,透過人工檢查網頁內容這被認為是一種缺陷,並且非常耗時,而且它可能產生許多錯誤。例如下面這個錯誤,網站稽核人員釋出了列在電話類別中的膝上型電腦廣告,這是錯誤的,並將影響搜尋引擎質量,而這項工作可以透過深度學習模型在一秒鐘內完成。

用Keras框架構建一個簡單的卷積神經網路!

筆記本廣告發布在手機類連結中

在這篇博文中,我將介紹如何透過使用Keras框架構建一個簡單的卷積神經網路來最佳化此過程,該框架可以分析上傳的影像是用於手機廣告還是膝上型電腦廣告,並告訴我們影像是否與廣告類別匹配。

用Keras框架構建一個簡單的卷積神經網路!


部落格文章將這個案例分為5個具體步驟。

  1. 資料收集

  2. 資料預處理

  3. 資料建模

  4. 使用TensorBoard分析模型

模型部署和評估

1.資料收集

就像任何資料科學專案一樣,我們應該尋找的第一個元件是資料,在這種情況下,我們將處理的資料從同一網站Avito.ma中刪除的一組影像,用於膝上型電腦和手機兩類產品,結果資料夾將包含兩個子目錄分別稱為“膝上型電腦”和“電話”,下載的影像大小在120×90到67×90之間,每個子目錄有3個RGB通道。以下是執行此任務的程式碼的快照,而筆記本中提供了完整程式碼。(https://github.com/PaacMaan/avito_upload_classifier/blob/master/avito_image_classifier.ipynb)

用Keras框架構建一個簡單的卷積神經網路!


一旦這個過程完成,我們得到了2097張膝上型電腦影像和2180張手機影像。為了使分類更準確並且沒有偏差,我們需要驗證幾乎相同的觀察數量的這兩個類,因為我們可以從下面的圖中實現視覺化,兩個類的數量大致相當平衡。

用Keras框架構建一個簡單的卷積神經網路!

影像分佈在類上

2.資料預處理

對於預處理任務,我們將其分為三個子任務,如下所示:

2.1刪除噪聲資料

當人工檢查下載的影像時,會注意到存在一些與相關類無關的噪聲影像,例如下面的那些(手機充電器、手機包、虛擬現實眼鏡)能夠在手機資料夾中觀察到:

用Keras框架構建一個簡單的卷積神經網路!

手機影像中發現噪聲影像

不幸的是,沒有自動的方法來解決這個問題,因此我們必須人工檢視它們,並開始刪除它們以僅保留與相應類相關的影像。

2.2影像大小調整

此步驟完全取決於採用的深度學習架構,例如,當使用Alexnet模型對影像進行分類時,輸入影像大小應為22×227,而對於VGG-19,輸入影像大小為224×224。

由於我們不打算採用任何預先構建的架構,將構建自己的卷積神經網路模型,其輸入大小為64 ×64,如下面的程式碼快照所示。

用Keras框架構建一個簡單的卷積神經網路!


要執行此任務,我們在兩個子目錄phone和laptop中建立另一個名為preprocessed_data的目錄,然後我們迴圈raw_data原始資料夾中的每個影像以調整其大小,並將其儲存在新建立的目錄中。

因此,我們最終得到了兩個類的新生成資料集,其格式為64×64。

2.3資料拆分

在調整資料集大小後,我們將其拆分為80%用於訓練集,並保留其餘部分進行驗證。為了執行此任務,我們建立了一個名為data的新目錄,其中我們設定了train和validation另外兩個新目錄,我們將為手機和膝上型電腦設定兩個類影像。

更明確地,我們定義當前目標和目標目錄,然後我們將訓練集的比率固定為0.8,將驗證的比率固定為0.2,以測量我們將從原始路徑移動到目標路徑的影像數量。

用Keras框架構建一個簡單的卷積神經網路!

執行資料拆分的程式碼快照

需要很好地視覺化資料夾層次結構,這是專案樹檢視:  

用Keras框架構建一個簡單的卷積神經網路!

全域性專案結構

3.資料建模

現在我們到了這一管道的主要步驟,即資料建模,為此我們將建立一個卷積神經網路,將對我們之前處理過的幾千部手機和膝上型電腦影像進行訓練。

在計算機視覺中,卷積運算是卷積神經網路的基本構建塊之一,需要4個必需元件:

用Keras框架構建一個簡單的卷積神經網路!

卷積神經網路的主要組成部分

對於這個模型,我們將討論每個元件如何使用Keras實現它以及從卷積到完全連線層的自己的引數,但首先,讓我們發現內建模型的完整架構。

用Keras框架構建一個簡單的卷積神經網路!

卷積神經網路(CNN)模型架構

卷積層

用Keras框架構建一個簡單的卷積神經網路!


在將順序物件例項化為模型之後,我們使用add方法新增一個名為Conv2D的卷積層,其中第一個引數是過濾器,它是輸出數量的維數,如模型摘要所示,第一層輸出的形狀為(None, 62, 62, 32)。

對於第二個引數,kernel_size指定了1D卷積視窗的長度,這裡我們選擇3×3的視窗大小來卷積輸入卷。

第三個引數代表input_shape,它是分別與image_width x image_height x color channels (RGB)相關的64×64×3的大小,最後但並非最不重要的是activation_function,它負責新增非線性轉換。在這種情況下,我們選擇relu啟用功能。

用Keras框架構建一個簡單的卷積神經網路!

使用kernel_size =(3,3)進行卷積運算的插圖

最大池層

在卷積之後新增最大池化層的原因是減少我們之前應用的卷積層提取的特徵量,換句話說,我們對這些特徵的位置感興趣。

為了對其高度進行概括,如果有一個從x到y的垂直邊緣,將影像的垂直邊緣降到影像的2/3的高度。

所有這一過程都在Keras的一行程式碼中恢復:

用Keras框架構建一個簡單的卷積神經網路!


在這裡,我們使用add方法注入另一層名為MaxPooling2D的Maximum Pooling,其中pool_size是(2,2)的視窗,預設情況下strides = None和padding ='valid'。

用Keras框架構建一個簡單的卷積神經網路!

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

展平輸出

在結束卷積神經網路(CNN)模型時,將最大池展平輸出為連續的一維向量是必需的步驟。

用Keras框架構建一個簡單的卷積神經網路!


Keras在這裡所做的,只是在網路中新增一個Flatten圖層,它簡單地相當於使用'C'排序重塑numpy中的函式。

全連線層

最後,我們將最後一層注入到全連線層的網路中,您可以將其視為學習從先前卷積中提取的特徵的非線性組合的廉價方法。

用Keras框架構建一個簡單的卷積神經網路!


Keras透過將Dense功能新增到網路中很容易實現,它只需要兩個引數units和activation,它們分別代表我們將擁有的輸出單元的數量,因為我們正在進行二進位制分類,因此它取值為2並啟用功能使用。

編譯網路

最後,我們必須透過呼叫編譯函式來編譯我們剛剛構建的網路,這是使用Keras構建的每個模型的必需步驟。

用Keras框架構建一個簡單的卷積神經網路!


loss引數,因為我們有一個二元分類,其中類M的數量等於2,交叉熵可以計算為:

用Keras框架構建一個簡單的卷積神經網路!

二元交叉熵的目標函式

其中p是預測機率,y是二進位制指示符(0或1)。

為了最小化這個目標函式,我們需要呼叫最佳化器,例如adam,這是Adaptive Moment Estimation的簡稱,預設情況下,其學習速率設定為0.001,但不會關閉超引數調整視窗。為了總結我們所做的事情,下面是內建模型的完整程式碼。

用Keras框架構建一個簡單的卷積神經網路!

載入影像和資料轉換

為了將影像提供給我們編譯的模型,我們呼叫ImageDataGenerator函式,它將幫助我們生成具有實時資料增強的批次張量影像資料。資料將迴圈(批次)。

現在我們已經建立了兩個ImageDataGenerator例項,我們需要使用分類類模式為訓練和驗證資料集提供正確的路徑。

用Keras框架構建一個簡單的卷積神經網路!


一旦訓練(train)和驗證(validation)集準備好為網路提供資訊,我們就會呼叫fit_generator方法將它們提供給模型。

用Keras框架構建一個簡單的卷積神經網路!


通常我們準備另一個測試資料集,除了評估最終訓練模型的驗證,但為了保持簡單性,並且只在驗證集上進行評估。

模型評估

完成訓練後,我們的準確率達到87.7%左右,仍然有0.352的高損失率,但具有高精度並不一定意味著我們有良好的模型質量。我們需要在時間內跟蹤和視覺化模型的行為,為此,我們使用Keras提供的TensorBoard作為與TensorFlow後端一起執行的回撥函式。

4.使用TensorBoard分析模型

在這一步驟中,我們將看到如何使用TensorBoard分析我們的模型行為。TensorBoard是使用TensorFlow後端構建的模型的工具,幫助我們基本上視覺化我們的模型隨時間的訓練,以及觀察準確性與驗證準確度或損失與驗證損失的關係。

使用Keras,可以透過呼叫TensorBoard函式僅在一行程式碼中恢復此步驟,並在擬合資料時將其作為回撥注入。

用Keras框架構建一個簡單的卷積神經網路!


損失(Loss)

用Keras框架構建一個簡單的卷積神經網路!

訓練和驗證集的損失直方圖

從上圖可以清楚地看出,對於從0.39到0.13的訓練線,損失顯著下降,而對於驗證線,從0.42開始並且花費25個週期達到0.35,它逐漸減少。

就個人而言,每當我想評估模型時,都會看到驗證損失,我們可以在這裡看到的是,在19個週期之後,驗證損失開始稍微增加,這可能會導致模型記住許多輸入樣本,驗證這個假設,我們更好地檢查準確性直方圖。

準確性

用Keras框架構建一個簡單的卷積神經網路!

訓練和驗證集的準確度直方圖的演變

正如我們所看到的,驗證準確性一直在增加,直到第19個週期它變得有些穩定,並且具有預期的下降和上升,這可以透過從同一時期開始增加時的驗證損失行為來解釋。

為了保持良好的模型質量,建議在這種情況下使用早期停止回撥,這將迫使模型在驗證損失開始增加或精度下降時以一定的容差停止訓練。

5.採用Flask進行模型部署

在轉移到部署細節之前,我們首先需要儲存我們之前訓練過的模型,為此我們呼叫save方法,如下所示:

用Keras框架構建一個簡單的卷積神經網路!


一旦我們的模型被儲存,我們可以在以後使用它來預測新的影像類。

為什麼採用Flask?

Flask是一個Python的微框架,其靈感來自於引用“Do Thing and Do It Well”,這就是我選擇Flask作為REST API提供模型的原因。

Flask應用程式由2個主要元件組成:python應用程式(app.py)和HTML模板,對於app.py,它將包含執行預測的邏輯程式碼,該程式碼將作為HTTP響應傳送。該檔案包含三個主要元件,可以顯示如下:

  1. 載入儲存的模型。

  2. 轉換上傳的影像。

  3. 使用載入的模型預測其適當的類。

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

回到主要問題

當使用者選擇作為廣告類別的膝上型電腦時,預計他必須上傳膝上型電腦的影像,但正在發生的事情是不同的。正如我們之前看到的那樣,有許多廣告,其中圖片包含標註手機類別的膝上型電腦。

在執行應用程式並假設模型已成功載入後,使用者可以上傳不同大小的影像,而我們的模型只能預測64×64×3的影像,因此我們需要將它們轉換為正確的大小,以便我們的模型可以很好地預測它。

用Keras框架構建一個簡單的卷積神經網路!

處理上傳影像的程式碼快照

轉換上傳的影像後,我們將其作為引數傳送到載入的模型,以便進行預測並將HTTP響應作為JSON物件返回,其中模式如下:

用Keras框架構建一個簡單的卷積神經網路!


第一個屬性是影像預測類,第二個屬性是布林值,表示從使用者中選擇的類別是否與上傳的影像匹配。下面我展示了執行此工作的程式碼邏輯的快照。

用Keras框架構建一個簡單的卷積神經網路!

應用演示

要執行應用程式,我們只需切換到建立app.py的資料夾,然後執行以下命令:

用Keras框架構建一個簡單的卷積神經網路!


然後我們瀏覽控制檯上顯示的以下URL:http://127.0.0.1:5000 /,一旦顯示索引頁面,選擇廣告類別並上傳其相關照片,在幕後將請求傳送到路徑/上傳將照片儲存在目錄中以預測其適當的類。

這是現場演示我們在本專案結束時能夠建立的內容。

用Keras框架構建一個簡單的卷積神經網路!

Web應用程式演示

如果選擇的和預測的類都匹配,那麼你會得到一條成功訊息,說明一切正常,否則會收到一條警告訊息,選擇框將自動更改為相應的預測類。

結論

最後,本部落格文章透過構建深度學習模型來展示完整的計算機視覺管道,該模型可以預測應用於電子商務場景的上傳影像的類別,從資料收集到資料建模,並透過模型部署作為Web完成應用程式。

改善的方法:

1.透過為兩個類刪除更多影像來增加資料大小並刪除噪聲。

2.針對學習率和beta值的超引數調整。

3.嘗試其他架構,如Lenet-5。(yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf)

4.在完全連線(密集)層上使用Dropout。

有用的連結:

完整專案+筆記本+資料集:

https://github.com/PaacMaan/avito_upload_classifier

Flask Web應用程式:

https://github.com/PaacMaan/avito_upload_classifier/tree/master/flask_app

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31509949/viewspace-2213460/,如需轉載,請註明出處,否則將追究法律責任。

相關文章