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