05.08 通過 TensorFlow 構建您的第一個深度學習分類器(以狗為例)!

通過 TensorFlow 構建您的第一個深度學習分類器(以狗為例)!

卷積神經網絡(如上圖所示)是圖像分類的有力工具

在本文中,會向您展示幾種不同的技術。幫助您開發可用於經典圖像分類問題的算法:從圖像中檢測狗品種。

並且在本文末,作者將為用戶提供可以輸入任何圖像的代碼,返回對不同狗品種的估計。此外,如果檢測到人類,算法將提供最相似狗的品種的估計值。

注:這個項目是作為Udacity機器學習Nanodegree(GitHub回購)的一部分完成的。

1.什麼是卷積神經網絡?

卷積神經網絡(也稱為CNN或ConvNet)是一類深度神經網絡,它在計算機視覺和視覺圖像應用方面得到廣泛採用。

有關CNN應用的著名案例可以參照斯坦福研究團隊的研究論文。,他們通過單個CNN證明了皮膚損傷的級別。在這裡需要注意的是,神經網絡僅需使用像素和疾病標籤作為輸入項來訓練圖像。

卷積神經網絡由多層組成。與其他圖像分類算法相比,它對預處理的要求相對較少。

他們通過使用過濾器將卷積神經網絡應用於圖像來進行學習。算法是採用一個小方塊(或“窗口”)把它應用在圖像上。通過過濾器讓CNN識別圖像中的某些圖案。以達到CNN通過零件濾鏡,尋找與原圖內容匹配的圖像。

通過 TensorFlow 構建您的第一個深度學習分類器(以狗為例)!

用於圖像分類的CNN層體系結構的示例(來源:https://bit.ly/2vwlegO)

網絡的前幾層可以檢測簡單的特徵,如線條,圓形,邊緣。在每層中,網絡能夠將這些發現結合起來,不斷深入到神經網絡的各個層面,學習更復雜的概念。

1.1有什麼樣的圖層?

CNN的總體結構由輸入層,隱藏層和輸出層組成。它們是類型層,例如,卷積,激活,合併,壓差,密集和SoftMax層。

通過 TensorFlow 構建您的第一個深度學習分類器(以狗為例)!

神經網絡由輸入層,隱藏層和輸出層組成(來源:https://bit.ly/2Hxhjaw)

卷積層(或Conv層)是構成卷積神經網絡的核心。Conv層由一組濾波器組成。每個濾波器可以被認為是一個小的正方形(具有固定的寬度和高度)。

在每次過程中,過濾器會在輸入體積的寬度和高度上“卷積”。這個過程會產生一個二維激活圖。這個圖會給出在每個空間位置上該濾波器的響應。

為了避免過度擬合。在激活圖中,Pooling圖層應用於非線性下采樣。換句話說,Pooling圖層在丟棄信息時具有侵略性。但如果使用得當,則會非常有用。所以在CNN構架中,Pooling圖層通常會跟隨一個或兩個Conv圖層。

通過 TensorFlow 構建您的第一個深度學習分類器(以狗為例)!

在激活圖中,合併圖層應用非線性縮減採樣(來源:https://bit.ly/2Hxhjaw)

Dropout圖層也用於在隨機忽略某些激活函數的情況下,來減少過度擬合。而密集圖層則是完全連接的圖層,並且通常位於神經網絡的末端。

1.2什麼是激活功能?

激活函數用於處理圖層和神經網絡的輸出。激活函數是添加到隱藏圖層和輸出圖層的節點。

您經常會發現ReLu激活函數用於隱藏層,而最後一層通常由SoftMax激活函數組成。作者的想法是通過疊加線性和非線性函數層,進行大量的模式檢測並準確預測給定圖像的標籤。

作為一個標準化器,SoftMax通常被發現在最後一層,併產生一個離散的概率分佈向量。這也符合作者的目的,因為作者想要的CNN輸出是圖像對應於特定類的概率。

最常見的激活功能包括ReLU和Sigmoid激活功能

通過 TensorFlow 構建您的第一個深度學習分類器(以狗為例)!

通過模型評估和性能評估,選擇損失函數。在圖像分類的CNN中,經常選擇分類交叉熵。使用漸變下降來使錯誤最小化 - 在本文中,作者將依靠“rmsprop”(自適應學習速率方法)作為優化器,並將精度作為度量標準。

2.設置算法的構建塊

為了構建算法,作者將使用TensorFlow,Keras(運行在TensorFlow之上的神經網絡API)和OpenCV(計算機視覺庫)。

2.1檢測圖像是否包含人臉

為了檢測提供的圖像是否包含人臉,作者將使用OpenCV的人臉檢測算法(之一)。在使用任何人臉檢測器之前,將圖像轉換為灰度是標準程序。以下是檢測存儲在face_cascade多尺度函數並將灰度圖像作為參數的具體步驟。

通過 TensorFlow 構建您的第一個深度學習分類器(以狗為例)!

2.2檢測圖像是否包含狗

為了檢測所提供的圖像是否包含狗的面部,作者使用了預先訓練中使用的ImageNet數據集的ResNet-50模型。該模型可以對來自1000個類別中的對象進行分類。假如給定一幅圖像,預先訓練的ResNet- 50模型將返回圖像中對包含對象的預測。

使用TensorFlow作為後端時,Keras CNN需要一個4D數組作為輸入。下面的path_to_tensor函數將一個字符串值的文件路徑作為輸入,並將其調整為一個224x224像素的正方形圖像。

通過 TensorFlow 構建您的第一個深度學習分類器(以狗為例)!

此外,所有預先訓練的模型都有額外的標準化步驟。所以必須從每個圖像的每個像素中減去平均像素才行。

通過導入的函數preprocess_input實現。

通過 TensorFlow 構建您的第一個深度學習分類器(以狗為例)!

對於最終預測,如上面的代碼所示。作者通過預測概率向量的argmax來獲得與模型的預測對象類相對應的整。在這裡,您可以通過使用ImageNet標籤字典來識別對象類別。

3.使用轉移學習構建您的CNN分類器

具備了檢測圖像中人和狗的功能後,作者現在需要一種方法來預測圖像中的品種。在本節中,作者將創建一個分類狗品種的CNN。

為了在不犧牲準確性的情況下減少訓練時間,作者將使用轉移學習來培訓CNN--這是一種允許使用並且已經在大型數據集上預先訓練過的網絡的方法。通過保持先前層次和新增加的訓練層,作者可以利用預訓練算法獲得的知識將其用於程序上。

Keras包括幾種預先訓練的深度學習模型,可用於預測,特徵提取和微調。

3.1模型架構

如前所述,ResNet-50模型輸出為輸入層 - 又稱為瓶頸特徵。在下面的代碼塊中,作者通過運行以下內容來提取對應的瓶頸特徵。

通過 TensorFlow 構建您的第一個深度學習分類器(以狗為例)!

作者將建立模型架構,使得ResNet-50的最後卷積輸出作為輸入回到模型中。作者僅添加全局平均池和全連接層,其中後者包含每個狗類別的一個節點並具有Softmax激活功能。

通過 TensorFlow 構建您的第一個深度學習分類器(以狗為例)!

通過 TensorFlow 構建您的第一個深度學習分類器(以狗為例)!

在上面的代碼輸出中看到的,最終得到了一個有272,517個參數的神經網絡!

3.2編譯和測試模型

現在,可以使用CNN來測試在狗圖像測試數據集中品種識別的程度了。為了微調模型,作者通過20個迭代,以減少使用RMS Prop優化後的損失函數(分類交叉熵)。

通過 TensorFlow 構建您的第一個深度學習分類器(以狗為例)!

測試準確度:80.0239%

可以看到該算法的測試準確度達到了80%,完全沒有問題!

3.3用模型預測狗品種

現在已經有了算法,來編寫一個函數,將圖像路徑作為輸入並返回狗品種的預測模型。

通過 TensorFlow 構建您的第一個深度學習分類器(以狗為例)!

4.測試CNN分類器

現在,可以編寫一個函數。除了確定它接受圖像的文件路徑外,還要確定圖像是否包含人類,狗或兩者都不包含。

如果在圖像中檢測到狗,則返回預測的品種。如果在圖像中檢測到人體,則返回類似的狗品種。如果在圖像中均未檢測到,則提供指示錯誤的輸出。

通過 TensorFlow 構建您的第一個深度學習分類器(以狗為例)!

在幾個樣本圖像上進行算法測試:

通過 TensorFlow 構建您的第一個深度學習分類器(以狗為例)!

這些預測看起來很準確!現在看看當作者輸入人臉時會發生什麼!

通過 TensorFlow 構建您的第一個深度學習分類器(以狗為例)!

顯然,根據算法,作者(藍色箭頭)看起來像一隻小獵犬。

最後,我們發現算法很容易出錯。因為它通常不是一個很清晰的鏡頭,有噪點或額外的信息。因此,使用圖像增強可能是一個不錯的選擇。


分享到:


相關文章: