楊子賢
(,河南 鄭州 450000)
圖像識(shí)別技術(shù)屬于計(jì)算機(jī)視覺領(lǐng)域,在人臉識(shí)別、自動(dòng)駕駛等方面已卓有成效,在醫(yī)學(xué)、安防、通訊等領(lǐng)域仍有巨大的發(fā)展空間。圖像識(shí)別技術(shù)的實(shí)現(xiàn),簡(jiǎn)言之相當(dāng)于尋找一個(gè)適當(dāng)?shù)暮瘮?shù),使得輸入的是被識(shí)別的圖片或圖片的一部分,而輸出的是我們需要的圖片的語(yǔ)義概念。我們的目的是通過對(duì)模型的訓(xùn)練,找到這個(gè)合適的函數(shù)。在深度學(xué)習(xí)提出之前,傳統(tǒng)的機(jī)器學(xué)習(xí)方式,通常是用人類的經(jīng)驗(yàn)知識(shí),把原始數(shù)據(jù)預(yù)處理成各種特征,然后對(duì)特征進(jìn)行分類。這些科學(xué)家們把大部分時(shí)間花在尋找合適的特征上,所以它也叫“特征工程”。然而特征的繁多以及一些特征難以表示,都要求機(jī)器學(xué)習(xí)方式的革新。直到Hinton等人提出深度學(xué)習(xí),圖像識(shí)別技術(shù)才有了新的生機(jī)。深度學(xué)習(xí)即讓機(jī)器自己進(jìn)行特征學(xué)習(xí),將原始數(shù)據(jù)作為輸入,通過層層抽象將原始數(shù)據(jù)抽象為自身任務(wù)所需的特征標(biāo)識(shí),以特征到目標(biāo)的映射結(jié)束。從原始數(shù)據(jù)到最終任務(wù)目標(biāo),中間沒有人為操作(端到端的思想)。CNN作為深度學(xué)習(xí)的一種代表算法,本論文將重點(diǎn)介紹。
CNN是一種層次網(wǎng)絡(luò)結(jié)構(gòu),可分為輸入層、卷積層、激活函數(shù)層、池化層、全連接層及輸出等部分(如圖1所示)。輸入原始數(shù)據(jù)(例如圖像的原始像素值),經(jīng)過卷積、激活函數(shù)及池化等層層操作,最終將原始數(shù)據(jù)中的高層語(yǔ)義概念剝離出來,這就是前饋運(yùn)算。通過誤差函數(shù)通過計(jì)算真實(shí)值和輸出值之間的誤差值,反向逐層反饋,更新每層參數(shù),這是反饋運(yùn)算。通過前饋運(yùn)算與反饋運(yùn)算,最終使模型收斂,實(shí)現(xiàn)完成訓(xùn)練的目的。
圖1
卷積層。首先應(yīng)了解什么是卷積操作,如圖2,畫面中間一個(gè)3×3大小的矩陣,將矩陣中的參數(shù)與對(duì)應(yīng)圖像(畫面左)位置像素所對(duì)應(yīng)的參數(shù)分別相乘并相加,此即為卷積操作。將所得數(shù)值作為一次卷積操作的輸出,之后選擇將卷積核往某個(gè)方向平移一個(gè)單位長(zhǎng)度,再次進(jìn)行卷積操作,直到得到新的一層,這一層同時(shí)也作為下一層的輸入。這個(gè)含有一定大小的矩陣(這里是3×3)叫做卷積核(濾波器),每次平移的距離(這里是1)叫做步長(zhǎng)。進(jìn)行卷積操作的一層即是卷積層。
圖2
卷積層的作用。卷積層通過卷積核完成對(duì)圖像信息的提取,故卷積核上的參數(shù)決定了該卷積層的作用。例如有一種邊緣濾波器,當(dāng)該濾波器作用于圖片中物體的邊緣時(shí),那么邊緣和其四周的像素值差異應(yīng)比較大。如果作用該濾波器,那么邊緣四周像素值差異小的部分就會(huì)被消除,而差異較大的部分就被凸顯,從而實(shí)現(xiàn)提取邊緣特征的作用。應(yīng)該指出的是,卷積核里的參數(shù)是通過網(wǎng)絡(luò)訓(xùn)練得出的,可以構(gòu)建任意方向的濾波器。用卷積的方式處理的數(shù)據(jù),即對(duì)每一個(gè)像素?cái)?shù)據(jù)賦予一定的權(quán)值,該過程是線性的。但因?yàn)橛?xùn)練的模型不一定是線性可分的,所以引入激活函數(shù)以增加網(wǎng)絡(luò)的非線性因素表現(xiàn)力,否則無法形成復(fù)雜的函數(shù)。
激活函數(shù)。激活函數(shù)模擬了神經(jīng)元的特性,當(dāng)輸入信號(hào)超過該神經(jīng)元的閾值后,該神經(jīng)元就處于激活的狀態(tài),否則為抑制。下面介紹兩種常見的激活函數(shù)。
圖3
圖4
但是通過觀察函數(shù)圖像可以發(fā)現(xiàn)一個(gè)問題,當(dāng)輸入數(shù)據(jù)較大或較小時(shí),都會(huì)被壓縮到1或0。當(dāng)輸入值大于5或小于-5時(shí),函數(shù)的梯度會(huì)接近于0(如圖4),梯度在反向傳播的時(shí)候因?yàn)樾枰松弦粋€(gè)sigmoid的導(dǎo)數(shù),所以會(huì)使得梯度越來越小,導(dǎo)致誤差在反向傳播的過程中無法更新參數(shù)繼而導(dǎo)致網(wǎng)絡(luò)無法進(jìn)行訓(xùn)練。這就是函數(shù)的梯度飽和效應(yīng)對(duì)網(wǎng)絡(luò)訓(xùn)練的不利影響。
(2)ReLU函數(shù)。為了避免梯度飽和效應(yīng)的發(fā)生,我們引入了ReLU函數(shù)(Rectified linear unit):
函數(shù)圖像如圖5所示,其梯度圖像如圖6所示。
對(duì)于x≥false0的部分梯度為1,反之為0。對(duì)于x≥false0的部分可以完全消除梯度飽和的現(xiàn)象。同時(shí)實(shí)驗(yàn)結(jié)果也表示,采用ReLU函數(shù)比使用sigmoid函數(shù)網(wǎng)絡(luò)訓(xùn)練速度快6倍左右。ReLU函數(shù)成為卷積神經(jīng)網(wǎng)絡(luò)和其他深度學(xué)習(xí)網(wǎng)絡(luò)模型的首選激活函數(shù)。
圖5
圖6
池化層。先介紹池化(也叫匯合)操作。在完成卷積之后,它提取的特征圖看做一個(gè)矩陣,并在這個(gè)矩陣上劃分出幾個(gè)不重合的區(qū)域,在每個(gè)區(qū)域上計(jì)算該區(qū)域內(nèi)特征的均值或最大值,然后用這些均值或最大值參與后續(xù)的訓(xùn)練,這個(gè)過程就是池化。如圖7,采用的是最大值池化,即取該部分最大的值作為池化的結(jié)果。池化操作可分為平均值池化,最大值池化和隨機(jī)池化,在此不再一一介紹。進(jìn)行池化的結(jié)構(gòu)層即池化層。
圖7
池化的作用。①減少了參數(shù)含量,保留了主要特征。數(shù)據(jù)的減少即減少下一層的輸出大小,減輕運(yùn)算負(fù)擔(dān)。②增加了特征不變性。池化操作使網(wǎng)絡(luò)更加關(guān)注圖像的征稱而不是圖像的位置。假設(shè)在連續(xù)的池化區(qū)域內(nèi),將圖像輕微平移或旋轉(zhuǎn),池化的結(jié)果是相同的。③由于減少了參數(shù),所以也可以預(yù)防過擬合的發(fā)生。上述介紹的卷積層,激活函數(shù)和池化操作,在CNN中都是起特征提取的作用,因此還需要全連接層將特征進(jìn)行分類,最終輸出我們需要的結(jié)果。
全連接層。全連接層相當(dāng)于“分類器”的作用。即將卷積層,激活函數(shù)和池化層學(xué)到的“分布式特征表示”映射到樣本標(biāo)記空間。但由于全連接層參數(shù)冗雜(占整個(gè)網(wǎng)絡(luò)參數(shù)的80%左右)目前也提出了代替全連接層的方法,如GoogLeNet采用全局平均池化的方法。實(shí)際操作過程中,全連接層可以通過卷積操作來實(shí)現(xiàn),即使用卷積核大小為1×1的卷積。
下面介紹兩種經(jīng)典CNN模型:LeNet和AlexNet,它們?cè)贑NN的發(fā)展歷史上都占據(jù)重要地位。了解它們的結(jié)構(gòu),不但是欣賞前輩的智慧,也可以為以后CNN發(fā)展提供思路。
(1)LeNet如圖8,它是較早提出的CNN模型(1994年),有三個(gè)卷積層(C1、C3、C5),兩個(gè)池化層(S2、S4)和一個(gè)全連接層(F6),輸入時(shí)32×32的圖像,輸出的是0~9十個(gè)數(shù)字的概率。該網(wǎng)絡(luò)模型在那時(shí)取得了低于1%的錯(cuò)誤率。LeNet可以說是第一個(gè)具有商業(yè)價(jià)值的CNN模型,因?yàn)楫?dāng)時(shí)它被成功用于識(shí)別郵件編碼。
圖8
(2)AlexNet。作為2012年ImageNet大賽第一名,AlexNet(如圖9)在CNN發(fā)展史上有里程碑的地位。共有5個(gè)卷積層和3個(gè)全連接層,可采用兩個(gè)GPU并行訓(xùn)練,且在第三次卷積層和全連接層處可以互相交互??梢娤啾扔贚eNet網(wǎng)絡(luò),其結(jié)構(gòu)上改進(jìn)并不大,但在網(wǎng)絡(luò)深度和復(fù)雜度上有較大的優(yōu)勢(shì)。AlexNet的意義主要有以下方面。①揭示了CNN強(qiáng)大的學(xué)習(xí)能力和表示能力,引發(fā)了對(duì)于CNN研究的熱潮。②采用GPU進(jìn)行運(yùn)算,縮短了訓(xùn)練所需時(shí)間和成本。③引入了ReLU激活函數(shù),數(shù)據(jù)增廣和隨機(jī)失活等訓(xùn)練技巧,為后續(xù)CNN提供了標(biāo)本。
圖9
我們這次的實(shí)驗(yàn)內(nèi)容是用編程識(shí)別mnist手寫數(shù)字集,分別以普通神經(jīng)網(wǎng)絡(luò)和CNN來實(shí)現(xiàn),并且對(duì)比兩種方式來討論CNN對(duì)此類問題的表現(xiàn)如何。
(1)用普通神經(jīng)網(wǎng)絡(luò)進(jìn)行試驗(yàn)。BaseLine版本用的是MultiLayer Percepton(多層感知機(jī))。這個(gè)網(wǎng)絡(luò)結(jié)構(gòu)較簡(jiǎn)單,輸入—隱含—輸出。隱含層采用的rectifier linear unit,輸出則直接選取的softmax進(jìn)行多分類。第一次錯(cuò)誤率為1.81%,經(jīng)過100次迭代錯(cuò)誤率減少至1.46%,但未減少到1%以下。
(2)用CNN進(jìn)行試驗(yàn)。采用keras的CNN模塊,包含卷積層,匯合層等基本結(jié)構(gòu),是一個(gè)簡(jiǎn)單的CNN網(wǎng)絡(luò)結(jié)構(gòu)。
經(jīng)測(cè)試,錯(cuò)誤率為1.07%。添加一些卷積層后,錯(cuò)誤率可降至1%以下,最好測(cè)試結(jié)果可降至0.22%實(shí)驗(yàn)結(jié)論:實(shí)驗(yàn)中我們通過對(duì)比兩種網(wǎng)絡(luò),相比于普通的神經(jīng)網(wǎng)絡(luò),CNN在識(shí)別圖像準(zhǔn)確率方面表現(xiàn)更好。由此可見,在對(duì)于圖像識(shí)別的開發(fā)與應(yīng)用上,盡量使用CNN,并加快對(duì)CNN的改進(jìn)提高。
卷積神經(jīng)網(wǎng)絡(luò)的特征結(jié)構(gòu)有卷積層、激活函數(shù)、池化層和全連接層等。卷積層用以提取圖像結(jié)構(gòu)特征,激活函數(shù)增加網(wǎng)絡(luò)的復(fù)雜度和表現(xiàn)力,池化層提取主要特征,減少參數(shù)個(gè)數(shù)。全連接層將學(xué)到的特征進(jìn)行分類。這些結(jié)構(gòu)組成了優(yōu)秀的卷積神經(jīng)網(wǎng)絡(luò)。通過進(jìn)行卷積神經(jīng)網(wǎng)絡(luò)與普通網(wǎng)絡(luò)對(duì)比實(shí)驗(yàn),可以發(fā)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)在圖像識(shí)別方面有較大優(yōu)勢(shì)。在準(zhǔn)確率方面與普通網(wǎng)絡(luò)拉開了較大差距。但CNN仍有不足之處,如何優(yōu)化算法,在減少參數(shù)量的同時(shí)提高運(yùn)算效率,在訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)模型的過程中,如何選擇合適的卷積核大小,如何設(shè)計(jì)網(wǎng)絡(luò)結(jié)構(gòu)等等,這都是在未來CNN網(wǎng)絡(luò)發(fā)展中不得不面對(duì)的問題。近來,科學(xué)家擬準(zhǔn)備實(shí)現(xiàn)自動(dòng)化構(gòu)建CNN網(wǎng)絡(luò),非常期待這一技術(shù)能盡快實(shí)現(xiàn),也激勵(lì)著我繼續(xù)研究和學(xué)習(xí)。本文介紹了CNN的發(fā)展,結(jié)構(gòu),以及編程測(cè)試的結(jié)果??梢奀NN在圖像識(shí)別方面的作用。此外,對(duì)CNN的進(jìn)一步優(yōu)化方案也在不停的研究中,應(yīng)用于圖像識(shí)別領(lǐng)域的CNN終將改變我們的生活。