您好,登錄后才能下訂單哦!
如何通過TensorFlow構建您的第一個深度學習分類器,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
通過 TensorFlow 構建您的第一個深度學習分類器(以狗為例)!
卷積神經網絡(如上圖所示)是圖像分類的有力工具
下面會向您展示幾種不同的技術。幫助您開發可用于經典圖像分類問題的算法:從圖像中檢測狗品種。
并且在本文末,作者將為用戶提供可以輸入任何圖像的代碼,返回對不同狗品種的估計。此外,如果檢測到人類,算法將提供最相似狗的品種的估計值。
注:這個項目是作為Udacity機器學習Nanodegree(GitHub回購)的一部分完成的。
1.什么是卷積神經網絡?
卷積神經網絡(也稱為CNN或ConvNet)是一類深度神經網絡,它在計算機視覺和視覺圖像應用方面得到廣泛采用。
有關CNN應用的著名案例可以參照斯坦福研究團隊的研究論文。,他們通過單個CNN證明了皮膚損傷的級別。在這里需要注意的是,神經網絡僅需使用像素和疾病標簽作為輸入項來訓練圖像。
卷積神經網絡由多層組成。與其他圖像分類算法相比,它對預處理的要求相對較少。
他們通過使用過濾器將卷積神經網絡應用于圖像來進行學習。算法是采用一個小方塊(或“窗口”)把它應用在圖像上。通過過濾器讓CNN識別圖像中的某些圖案。以達到CNN通過零件濾鏡,尋找與原圖內容匹配的圖像。
用于圖像分類的CNN層體系結構的示例(來源:https://bit.ly/2vwlegO)
網絡的前幾層可以檢測簡單的特征,如線條,圓形,邊緣。在每層中,網絡能夠將這些發現結合起來,不斷深入到神經網絡的各個層面,學習更復雜的概念。
1.1有什么樣的圖層?
CNN的總體結構由輸入層,隱藏層和輸出層組成。它們是類型層,例如,卷積,激活,合并,壓差,密集和SoftMax層。
神經網絡由輸入層,隱藏層和輸出層組成(來源:https://bit.ly/2Hxhjaw)
卷積層(或Conv層)是構成卷積神經網絡的核心。Conv層由一組濾波器組成。每個濾波器可以被認為是一個小的正方形(具有固定的寬度和高度)。
在每次過程中,過濾器會在輸入體積的寬度和高度上“卷積”。這個過程會產生一個二維激活圖。這個圖會給出在每個空間位置上該濾波器的響應。
為了避免過度擬合。在激活圖中,Pooling圖層應用于非線性下采樣。換句話說,Pooling圖層在丟棄信息時具有侵略性。但如果使用得當,則會非常有用。所以在CNN構架中,Pooling圖層通常會跟隨一個或兩個Conv圖層。
在激活圖中,合并圖層應用非線性縮減采樣(來源:https://bit.ly/2Hxhjaw)
Dropout圖層也用于在隨機忽略某些激活函數的情況下,來減少過度擬合。而密集圖層則是完全連接的圖層,并且通常位于神經網絡的末端。
1.2什么是激活功能?
激活函數用于處理圖層和神經網絡的輸出。激活函數是添加到隱藏圖層和輸出圖層的節點。
您經常會發現ReLu激活函數用于隱藏層,而最后一層通常由SoftMax激活函數組成。作者的想法是通過疊加線性和非線性函數層,進行大量的模式檢測并準確預測給定圖像的標簽。
作為一個標準化器,SoftMax通常被發現在最后一層,并產生一個離散的概率分布向量。這也符合作者的目的,因為作者想要的CNN輸出是圖像對應于特定類的概率。
最常見的激活功能包括ReLU和Sigmoid激活功能
通過模型評估和性能評估,選擇損失函數。在圖像分類的CNN中,經常選擇分類交叉熵。使用漸變下降來使錯誤最小化 - 在本文中,作者將依靠“rmsprop”(自適應學習速率方法)作為優化器,并將精度作為度量標準。
2.設置算法的構建塊
為了構建算法,作者將使用TensorFlow,Keras(運行在TensorFlow之上的神經網絡API)和OpenCV(計算機視覺庫)。
2.1檢測圖像是否包含人臉
為了檢測提供的圖像是否包含人臉,作者將使用OpenCV的人臉檢測算法(之一)。在使用任何人臉檢測器之前,將圖像轉換為灰度是標準程序。以下是檢測存儲在face_cascade多尺度函數并將灰度圖像作為參數的具體步驟。
2.2檢測圖像是否包含狗
為了檢測所提供的圖像是否包含狗的面部,作者使用了預先訓練中使用的ImageNet數據集的ResNet-50模型。該模型可以對來自1000個類別中的對象進行分類。假如給定一幅圖像,預先訓練的ResNet- 50模型將返回圖像中對包含對象的預測。
使用TensorFlow作為后端時,Keras CNN需要一個4D數組作為輸入。下面的path_to_tensor函數將一個字符串值的文件路徑作為輸入,并將其調整為一個224x224像素的正方形圖像。
此外,所有預先訓練的模型都有額外的標準化步驟。所以必須從每個圖像的每個像素中減去平均像素才行。
通過導入的函數preprocess_input實現。
對于最終預測,如上面的代碼所示。作者通過預測概率向量的argmax來獲得與模型的預測對象類相對應的整。在這里,您可以通過使用ImageNet標簽字典來識別對象類別。
3.使用轉移學習構建您的CNN分類器
具備了檢測圖像中人和狗的功能后,作者現在需要一種方法來預測圖像中的品種。在本節中,作者將創建一個分類狗品種的CNN。
為了在不犧牲準確性的情況下減少訓練時間,作者將使用轉移學習來培訓CNN--這是一種允許使用并且已經在大型數據集上預先訓練過的網絡的方法。通過保持先前層次和新增加的訓練層,作者可以利用預訓練算法獲得的知識將其用于程序上。
Keras包括幾種預先訓練的深度學習模型,可用于預測,特征提取和微調。
3.1模型架構
如前所述,ResNet-50模型輸出為輸入層 - 又稱為瓶頸特征。在下面的代碼塊中,作者通過運行以下內容來提取對應的瓶頸特征。
作者將建立模型架構,使得ResNet-50的最后卷積輸出作為輸入回到模型中。作者僅添加全局平均池和全連接層,其中后者包含每個狗類別的一個節點并具有Softmax激活功能。
在上面的代碼輸出中看到的,最終得到了一個有272,517個參數的神經網絡!
3.2編譯和測試模型
現在,可以使用CNN來測試在狗圖像測試數據集中品種識別的程度了。為了微調模型,作者通過20個迭代,以減少使用RMS Prop優化后的損失函數(分類交叉熵)。
測試準確度:80.0239%
可以看到該算法的測試準確度達到了80%,完全沒有問題!
3.3用模型預測狗品種
現在已經有了算法,來編寫一個函數,將圖像路徑作為輸入并返回狗品種的預測模型。
4.測試CNN分類器
現在,可以編寫一個函數。除了確定它接受圖像的文件路徑外,還要確定圖像是否包含人類,狗或兩者都不包含。
如果在圖像中檢測到狗,則返回預測的品種。如果在圖像中檢測到人體,則返回類似的狗品種。如果在圖像中均未檢測到,則提供指示錯誤的輸出。
在幾個樣本圖像上進行算法測試:
這些預測看起來很準確!現在看看當作者輸入人臉時會發生什么!
顯然,根據算法,作者(藍色箭頭)看起來像一只小獵犬。
看完上述內容,你們掌握如何通過TensorFlow構建您的第一個深度學習分類器的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。