來源:深度學習愛好者
簡介
TensorFlow和Keras最常見的用途之一是圖像識別/分類。通過本文,您將了解如何使用Keras達到這一目的。
定義
如果您不了解圖像識別的基本概念,將很難完全理解本文的內容。因此在正文開始之前,讓我們先花點時間來了解一些術語。
TensorFlow是Google Brain團隊創(chuàng)建的一個Python開源庫,它包含許多算法和模型,能夠實現(xiàn)深度神經(jīng)網(wǎng)絡,用于圖像識別/分類和自然語言處理等場景。TensorFlow是一個功能強大的框架,通過實現(xiàn)一系列處理節(jié)點來運行,每個節(jié)點代表一個數(shù)學運算,整個系列節(jié)點被稱為“圖”。Keras是一個高級API(應用程序編程接口),支持TensorFlow(以及像Theano等其他ML庫)。其設計原則旨在用戶友好和模塊化,盡可能地簡化TensorFlow的強大功能,在Python下使用無需過多的修改和配置圖像識別(分類)
圖像識別是指將圖像作為輸入傳入神經(jīng)網(wǎng)絡并輸出該圖像的某類標簽。該標簽對應一個預定義的類。圖像可以標記為多個類或一個類。如果只有一個類,則應使用術語“識別”,而多類識別的任務通常稱為“分類”。
圖像分類的子集是對象檢測,對象的特定實例被識別為某個類如動物,車輛或者人類等。
特征提取
為了實現(xiàn)圖像識別/分類,神經(jīng)網(wǎng)絡必須進行特征提取。特征作為數(shù)據(jù)元素將通過網(wǎng)絡進行反饋。在圖像識別的特定場景下,特征是某個對象的一組像素,如邊緣和角點,網(wǎng)絡將通過分析它們來進行模式識別。
特征識別(或特征提取)是從輸入圖像中拉取相關特征以便分析的過程。許多圖像包含相應的注解和元數(shù)據(jù),有助于神經(jīng)網(wǎng)絡獲取相關特征。
神經(jīng)網(wǎng)絡如何學習識別圖像
直觀地了解神經(jīng)網(wǎng)絡如何識別圖像將有助于實現(xiàn)神經(jīng)網(wǎng)絡模型,因此在接下來的幾節(jié)中將簡要介紹圖像識別過程。
使用濾波器進行特征提取
圖片來源:commons.wikimedia.org
神經(jīng)網(wǎng)絡的第一層接收圖像的所有像素。當所有的數(shù)據(jù)傳入網(wǎng)絡后,將不同的濾波器應用于圖像,構成圖像不同部分的表示。這是特征提取,它創(chuàng)建了“特征映射”。
從圖像中提取特征的過程是通過“卷積層”完成的,并且卷積只是形成圖像的部分表示。由卷積的概念延伸出卷積神經(jīng)網(wǎng)絡(CNN)這一術語,它是圖像分類/識別中最常用的神經(jīng)網(wǎng)絡類型。
如果您無法想象特征映射是如何創(chuàng)建的,可以試想將手電筒照在暗室圖片的景象。當光束滑過圖片時,您正在學習圖像的特征。在這個比喻中,手電筒發(fā)射的光束就是濾波器,它被網(wǎng)絡用于形成圖像的表示。
光束的寬度控制著一次掃過的圖像的區(qū)域大小,神經(jīng)網(wǎng)絡具有類似的參數(shù),即濾波器的大小。它影響一次掃過的圖像的像素數(shù)。CNN中常見的濾波器尺寸為3,這包括高度和寬度,因此所掃描的像素區(qū)域大小為3×3。
圖片來源:commons.wikimedia.org
雖然濾波器的尺寸覆蓋其高度和寬度,同時也需要明確濾波器的深度。
2D圖像如何具有深度?
數(shù)字圖像被渲染為高度、寬度和一些定義像素顏色的RGB值,因此被跟蹤的“深度”是圖像具有的顏色通道的數(shù)量。灰度(非彩色)圖像僅包含1個顏色通道,而彩色圖像包含3個顏色通道。
這意味著對于應用于全彩色圖像的尺寸為3的濾波器,其規(guī)模為3×3×3。對于該濾波器覆蓋的每個像素,神經(jīng)網(wǎng)絡將濾波器的值和像素本身的值相乘以獲取像素的數(shù)值表示。然后,對整個圖像完成上述過程以實現(xiàn)完整的表示。根據(jù)參數(shù)“步幅”,濾波器在圖像的其余部分滑動。該參數(shù)定義了在計算當前位置的值之后,濾波器要滑動的像素數(shù)。CNN的默認步幅取值為2。
通過上述計算,最終將獲取特征映射。此過程通常由多個濾波器完成,這有助于保持圖像的復雜性。
激活函數(shù)
當圖像的特征映射創(chuàng)建完成之后,表示圖像的值將通過激活函數(shù)或激活層進行傳遞。受卷積層的影響,激活函數(shù)獲取的表示圖像的值呈線性,并且由于圖像本身是非線性的,因此也增加了該值的非線性。
盡管偶爾會使用一些其他的激活函數(shù),線性整流函數(shù)(Rectified Linear Unit, ReLU)是最常用的。
池化層
當數(shù)據(jù)被激活之后,它們將被發(fā)送到池化層。池化對圖像進行下采樣,即獲取圖像信息并壓縮,使其變小。池化過程使網(wǎng)絡更加靈活,更擅長基于相關特征來識別對象/圖像。
當觀察圖像時,我們通常不關心背景信息,只關注我們關心的特征,例如人類或動物。
類似地,CNN的池化層將抽象出圖像不必要的部分,僅保留相關部分。這由池化層指定的大小進行控制。
由于池化層需要決定圖像中最相關的部分,所以希望神經(jīng)網(wǎng)絡只學習真正表示所討論對象的部分圖像。這有助于防止過度擬合,即神經(jīng)網(wǎng)絡很好地學習了訓練案例,并無法類推到新數(shù)據(jù)。
池化值的方式有多種,最大池化(max pooling)是最常用的。最大池化獲取單個濾波器中像素的最大值。假設使用卷積核大小為2×2的濾波器,將會丟失3/4的信息。
使用像素的最大值以便考慮可能的圖像失真,并且減小圖像的參數(shù)/尺寸以便控制過度擬合。還有一些其他的池化類型,如均值池化(average pooling)和求和池化(sum pooling),但這些并不常用,因為最大池化往往精確度更高。
壓平(Flattening)
CNN的最后一層,即稠密層,要求數(shù)據(jù)采用要處理的矢量形式。因此,數(shù)據(jù)必須“壓平”。值將被壓縮成向量或按順序排列的列。
全連接層
CNN的最后一層是稠密層,或人工神經(jīng)網(wǎng)絡(ANN)。ANN主要用于分析輸入特征并將其組合成有助于分類的不同屬性。這些層基本上形成了代表所討論對象的不同部分的神經(jīng)元集合,并且這些集合可能代表狗松軟的耳朵或者蘋果的紅色。當足夠的神經(jīng)元被激活用于響應輸入圖像時,該圖像將被分類為某個對象。
圖片來源:commons.wikimedia.org
數(shù)據(jù)集中計算值和期望值之間的誤差由ANN進行計算。然后網(wǎng)絡經(jīng)過反向傳播,計算給定神經(jīng)元對下一層神經(jīng)元的影響并對其進行調整。如此可以優(yōu)化模型的性能,然后一遍又一遍地重復該過程。以上就是神經(jīng)網(wǎng)絡如何訓練數(shù)據(jù)并學習輸入特征和輸出類之間的關聯(lián)。
中間的全連接層的神經(jīng)元將輸出與可能的類相關的二進制值。如果有四個不同的類(例如狗,汽車,房子以及人),神經(jīng)元對于圖像代表的類賦“1”,對其他類賦“0”。最終的全連接層將接收之前層的輸出,并傳遞每個類的概率,總和為1。如果“狗”這一類別的值為0.75,則表示該圖像是狗的確定性為75%。至此圖像分類器已得到訓練,并且可以將圖像傳入CNN,CNN將輸出關于該圖像內容的猜想。
機器學習的工作流
在開始訓練圖像分類器的示例之前,讓我們先來了解一下機器學習的工作流程。訓練神經(jīng)網(wǎng)絡模型的過程是相當標準的,可以分為四個不同的階段。
數(shù)據(jù)準備
首先,需要收集數(shù)據(jù)并將其放入網(wǎng)絡可以訓練的表中。這涉及收集圖像并標記它們。即使下載了其他人準備好的數(shù)據(jù)集,也可能需要進行預處理,然后才能用于訓練。數(shù)據(jù)準備本身就是一門藝術,包括處理缺失值,數(shù)據(jù)損壞,格式錯誤的數(shù)據(jù),不正確的標簽等。
創(chuàng)建模型
創(chuàng)建神經(jīng)網(wǎng)絡模型涉及各種參數(shù)和超參數(shù)的選擇。需要確定所用模型的層數(shù),層輸入和輸出的大小,所用激活函數(shù)的類型,以及是否使用dropout等。
訓練模型
創(chuàng)建模型后,只需創(chuàng)建模型實例并將其與訓練數(shù)據(jù)相匹配即可。訓練模型時,一個重要的因素即訓練所需時間。您可以通過指定訓練的epoch數(shù)目來指定網(wǎng)絡的訓練時長。時間越長,其性能就越高,但是epoch次數(shù)過多將存在過度擬合的風險。
您可以適當?shù)卦O置訓練時的epoch數(shù)目,并且通常會保存訓練周期之間的網(wǎng)絡權重,這樣一旦在訓練網(wǎng)絡方面取得進展時,就無需重新開始了。
模型評估
評估模型有多個步驟。評估模型的第一步是將模型與驗證數(shù)據(jù)集進行比較,該數(shù)據(jù)集未經(jīng)模型訓練過,可以通過不同的指標分析其性能。評估神經(jīng)網(wǎng)絡模型的性能有各種指標,最常見的指標是“準確率”,即正確分類的圖像數(shù)量除以數(shù)據(jù)集中的圖像總和。在了解模型性能在驗證數(shù)據(jù)集上的準確率后,通常會微調參數(shù)并再次進行訓練,因為首次訓練的結果大多不盡人意,重復上述過程直到對準確率感到滿意為止。
最后,您將在測試集上測試網(wǎng)絡的性能。該測試集是模型從未用過的數(shù)據(jù)。
也許您在想:為什么要用測試集呢?如果想了解模型的準確率,采用驗證數(shù)據(jù)集不就可以了嗎?
采用網(wǎng)絡從未訓練過的一批數(shù)據(jù)進行測試是有必要的。因為所有參數(shù)的調整,結合對驗證集的重新測試,都意味著網(wǎng)絡可能已經(jīng)學會了驗證集的某些特征,這將導致無法推廣到樣本外的數(shù)據(jù)。
因此,測試集的目的是為了檢測過度擬合等問題,并且使模型更具實際的應用價值。
-
圖像識別
+關注
關注
9文章
520瀏覽量
38267 -
python
+關注
關注
56文章
4792瀏覽量
84627 -
tensorflow
+關注
關注
13文章
329瀏覽量
60527
發(fā)布評論請先 登錄
相關推薦
評論