徐 胤, 袁浩巍, 李 智
上海電氣集團(tuán)股份有限公司 中央研究院 上海 200070
手寫(xiě)字符識(shí)別可用于識(shí)別票據(jù)數(shù)字、車牌號(hào)等,應(yīng)用廣泛。字符識(shí)別可用傳統(tǒng)的機(jī)器學(xué)習(xí)方法實(shí)現(xiàn),如k-近鄰算法、支持向量機(jī)、貝葉斯方法等。使用傳統(tǒng)識(shí)別方法處理圖像時(shí),首先要對(duì)圖像進(jìn)行預(yù)處理,然后由人工設(shè)計(jì)特征提取方法?,F(xiàn)有的特征提取方法有類哈爾特征、方向梯度直方圖特征、尺度不變特征變換[1-2]、加速穩(wěn)健特征等,這些特征提取方法各有優(yōu)勢(shì),如類哈爾特征常用于人臉識(shí)別,方向梯度直方圖特征常用于行人檢測(cè)。特征提取后,將所得的特征導(dǎo)入一個(gè)分類器進(jìn)行訓(xùn)練,得到分類器的相關(guān)參數(shù)。使用時(shí),將待識(shí)別圖像特征提取后,再輸入經(jīng)訓(xùn)練得到的分類器中進(jìn)行識(shí)別。
人工神經(jīng)網(wǎng)絡(luò)的研究在一定程度上受到了生物學(xué)的啟發(fā),生物的學(xué)習(xí)系統(tǒng)是由相互連接的神經(jīng)元所組成的復(fù)雜網(wǎng)絡(luò),人工神經(jīng)網(wǎng)絡(luò)與此大體相似[3]。神經(jīng)網(wǎng)絡(luò)具有廣泛的應(yīng)用范圍,對(duì)于數(shù)據(jù)具有很好的魯棒性,已成功應(yīng)用于很多領(lǐng)域,如視覺(jué)識(shí)別、故障診斷、語(yǔ)音識(shí)別、機(jī)器人控制[4-5]等。卷積神經(jīng)網(wǎng)絡(luò)是人工神經(jīng)網(wǎng)絡(luò)的一種,其權(quán)值共享網(wǎng)絡(luò)結(jié)構(gòu)減少了權(quán)值的數(shù)量,降低了網(wǎng)絡(luò)模型的復(fù)雜度,在圖像識(shí)別應(yīng)用中,可以將圖像直接作為網(wǎng)絡(luò)的輸入。卷積網(wǎng)絡(luò)是為了識(shí)別二維形狀而設(shè)計(jì)的一個(gè)多層感知器,對(duì)平移、旋轉(zhuǎn)、縮放具有高度不變性[6],能夠通過(guò)隱藏層逐層提取出圖像特征。TensorFlow是由谷歌大腦團(tuán)隊(duì)開(kāi)發(fā)的采用數(shù)據(jù)流圖、用于數(shù)值計(jì)算的開(kāi)源軟件,通常用于機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的研究,也可用于其它計(jì)算領(lǐng)域。TensorFlow具有靈活的架構(gòu),能夠在多平臺(tái)上展開(kāi)計(jì)算,能夠在中央處理器和圖形處理器上運(yùn)行,支持移動(dòng)設(shè)備、服務(wù)器等,并支持Linux、Windows、Mac OS等操作系統(tǒng),具有很強(qiáng)的可移植性。此外,TensorFlow支持多語(yǔ)言,可以使用C++、Python、R、JAVA等語(yǔ)言實(shí)現(xiàn)編程[7]。
筆者首先載入手寫(xiě)數(shù)字?jǐn)?shù)據(jù)集,將數(shù)據(jù)集分為訓(xùn)練集和驗(yàn)證集;然后搭建具有兩個(gè)隱藏層的卷積神經(jīng)網(wǎng)絡(luò)模型,輸入訓(xùn)練集,設(shè)置模型參數(shù)和損失函數(shù)后進(jìn)行訓(xùn)練,得到卷積神經(jīng)網(wǎng)絡(luò)的因數(shù);最后使用訓(xùn)練出的卷積神經(jīng)網(wǎng)絡(luò)對(duì)驗(yàn)證集中的手寫(xiě)數(shù)字進(jìn)行識(shí)別。
傳統(tǒng)神經(jīng)網(wǎng)絡(luò)通常采用反向傳播算法進(jìn)行特征訓(xùn)練。在隨機(jī)給定一組權(quán)重因數(shù)后,得到網(wǎng)絡(luò)的輸出值,然后算出實(shí)際輸出與目標(biāo)輸出之間的誤差,將誤差反饋至前面各層的節(jié)點(diǎn),并更新每個(gè)節(jié)點(diǎn)的權(quán)值。逐步迭代這個(gè)過(guò)程,直至得到誤差函數(shù)的全局最小值。
深度學(xué)習(xí)是在傳統(tǒng)神經(jīng)網(wǎng)絡(luò)基礎(chǔ)上發(fā)展起來(lái)的深度神經(jīng)網(wǎng)絡(luò),其結(jié)構(gòu)層次與神經(jīng)網(wǎng)絡(luò)相同,即包括輸入層、隱藏層、輸出層,且只在相鄰層的節(jié)點(diǎn)之間有連接。為了克服傳統(tǒng)神經(jīng)網(wǎng)絡(luò)訓(xùn)練過(guò)程中訓(xùn)練時(shí)間長(zhǎng)、參數(shù)多等問(wèn)題,深度學(xué)習(xí)使用了與傳統(tǒng)神經(jīng)網(wǎng)絡(luò)不同的訓(xùn)練機(jī)制。卷積神經(jīng)網(wǎng)絡(luò)是一種在網(wǎng)絡(luò)層中用卷積運(yùn)算來(lái)代替矩陣乘法運(yùn)算的神經(jīng)網(wǎng)絡(luò),適合用來(lái)處理圖像數(shù)據(jù)[8]。
前饋型神經(jīng)網(wǎng)絡(luò)的連接方式采用多層結(jié)構(gòu),其基本結(jié)構(gòu)為輸入層、隱藏層、輸出層。隱藏層也稱中間層,隱藏層的層數(shù)大于等于1,包括卷積層、池化層、全連接層。圖1為前饋型神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),從左至右依次為輸入層、隱藏層1、隱藏層2、輸出層。前饋型神經(jīng)網(wǎng)絡(luò)具有強(qiáng)大的非線性處理能力和模式識(shí)別能力。
圖1 前饋型神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)圖
卷積神經(jīng)網(wǎng)絡(luò)是一種前饋型神經(jīng)網(wǎng)絡(luò),圖2為卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)[6],有八層帶權(quán)重因數(shù)的層數(shù),第一層是數(shù)據(jù)輸入層,之后連接的五層是卷積層,最后三層是全連接層,全連接層的最后一層為輸出層。
圖2 卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)圖
由圖2可以看到,上下層神經(jīng)元之間都形成了連接,假設(shè)隱藏層節(jié)點(diǎn)數(shù)量為10000,輸入的圖像分辨率為100像素×100像素,則僅一層隱藏層就有108個(gè)權(quán)值待訓(xùn)練,權(quán)值數(shù)量十分龐大。另一方面,圖像具備固有的二維結(jié)構(gòu)特征,如角點(diǎn)、直線、邊緣等,這些局部特征都可以加以利用。卷積神經(jīng)網(wǎng)絡(luò)能夠使一組神經(jīng)元使用相同的權(quán)值,即權(quán)值共享,這樣能夠節(jié)省訓(xùn)練計(jì)算所占用的資源。
圖像卷積能夠自動(dòng)提取圖像中的特征,減少多余信息,用于神經(jīng)網(wǎng)絡(luò)中,具有代替人工設(shè)計(jì)特征的功能。圖像卷積過(guò)程也稱特征學(xué)習(xí),特征學(xué)習(xí)能夠自動(dòng)適配新的任務(wù),只需在新數(shù)據(jù)上進(jìn)行訓(xùn)練,自動(dòng)找出新的卷積核,可以避免繁重的特征工程。
卷積運(yùn)算是針對(duì)兩個(gè)實(shí)變函數(shù)的一種數(shù)學(xué)運(yùn)算,用*號(hào)表示,其運(yùn)算式為:
s(t)=(x*ω)(t)
(1)
式中:t為時(shí)間;x為輸入信號(hào);ω為核函數(shù);s(t)為x在ω核函數(shù)下經(jīng)過(guò)時(shí)間t后的卷積結(jié)果。
在處理圖像卷積時(shí),將二維圖像I作為卷積運(yùn)算的輸入,分別在水平和豎直方向執(zhí)行卷積操作,卷積規(guī)則為[9]:
S(i,j) =(I*K)(i,j)
(2)
式中:K為二維卷積核;(i,j)為像素位置;(m,n)為卷積核尺寸;S(i,j)為卷積后得到的特征圖。
在許多神經(jīng)網(wǎng)絡(luò)庫(kù)中有互相關(guān)函數(shù),這些函數(shù)和卷積運(yùn)算比較相似,但沒(méi)有翻轉(zhuǎn),也稱為卷積運(yùn)算,卷積后的圖像為[9]:
S(i,j) =(I*K)(i,j)
(3)
使用互相關(guān)函數(shù)的圖像卷積過(guò)程如圖3所示,卷積核在原圖像上滑動(dòng),與原圖像進(jìn)行相乘和加權(quán)疊加后得到特征映射圖。
圖3 互相關(guān)函數(shù)圖像卷積過(guò)程
卷積核翻轉(zhuǎn)的唯一目的是實(shí)現(xiàn)可交換性,但是這在神經(jīng)網(wǎng)絡(luò)應(yīng)用中并不是一個(gè)重要的性質(zhì)。而另一方面,互相關(guān)運(yùn)算更簡(jiǎn)單,且更容易實(shí)現(xiàn)。
池化指對(duì)卷積后的圖像進(jìn)行采樣,以降低卷積圖像的維數(shù),即減少參數(shù)。另外,池化還能消除信號(hào)的偏移和扭曲,增強(qiáng)網(wǎng)絡(luò)的魯棒性。池化的方法一般有兩種,一種是平均值池化,另一種是最大值池化。圖4為最大值池化示意圖,濾波器尺寸取為2×2,最大值池化運(yùn)算時(shí),在濾波器覆蓋的每個(gè)區(qū)域中提取該區(qū)域內(nèi)像素的最大值,進(jìn)而得到主要特征。
圖4 最大值池化示意圖
激活函數(shù)的作用是增加神經(jīng)網(wǎng)絡(luò)模型的非線性。如果沒(méi)有非線性激活函數(shù),那么神經(jīng)網(wǎng)絡(luò)的每一層輸出就相當(dāng)于上一層輸入的線性組合。激活函數(shù)通常使用雙曲正切函數(shù)或修正線性單元函數(shù),作用于隱藏層,將前一層輸入的數(shù)據(jù)非線性化。筆者使用的激活函數(shù)是修正線性單元函數(shù),它不需要對(duì)輸入進(jìn)行歸一化來(lái)防止飽和。使用修正線性單元函數(shù)時(shí),卷積網(wǎng)絡(luò)的訓(xùn)練速度遠(yuǎn)快于使用雙曲正切函數(shù)[4]。修正線性單元函數(shù)的實(shí)現(xiàn)式為[10]:
fReLU=max(0,x)
(4)
修正線性單元函數(shù)的可視化圖像如圖5所示,橫軸為變量x,縱軸為輸出fReLU。
圖5 修正線性單元函數(shù)可視化圖像
設(shè)置卷積網(wǎng)絡(luò)的學(xué)習(xí)率LEARNING_RATE為1×10-4,設(shè)置訓(xùn)練的迭代次數(shù)TRAINING_ITERATIONS為3000,設(shè)置每次訓(xùn)練的樣本數(shù)量BATCH_SIZE為50,設(shè)置驗(yàn)證集的大小為3000。
載入訓(xùn)練集數(shù)據(jù)后,將圖像的像素值由0~255轉(zhuǎn)換為0~1,代碼為:
images = np.multiply(images, 1.0 / 255.0)
將權(quán)值因數(shù)、偏置因數(shù)初始化,通過(guò)隨機(jī)數(shù)函數(shù)生成。隨機(jī)數(shù)函數(shù)生成一組正態(tài)分布的隨機(jī)數(shù),這組隨機(jī)數(shù)的值在[mean-2*stddev,mean+2*stddev]范圍內(nèi)。shape表示張量的維度,mean表示均值,stddev表示標(biāo)準(zhǔn)差,則有:
wei_init = tf.truncated_normal(shape, mean=0, stddev=0.1)
bias_init = tf.constant(0.1, shape)
筆者采用具有兩層隱藏層的卷積網(wǎng)絡(luò)。構(gòu)造第一層卷積神經(jīng)網(wǎng)絡(luò)時(shí),先進(jìn)行卷積操作,再使用修正線性單元函數(shù)進(jìn)行激活,然后進(jìn)行最大值池化操作。使用相同的方法構(gòu)造第二層卷積神經(jīng)網(wǎng)絡(luò)。構(gòu)造卷積神經(jīng)網(wǎng)絡(luò)的代碼為:
conv1 = tf.nn.relu(tf.nn.conv2d(image, wei_init, strides, padding))
pool1 =tf.nn.max_pool(conv1, ksize, strides, padding)
wei_conv2 = tf.truncated_normal(shape2, stddev=0.1)
bias_conv2 = tf.constant(0.1, shape2)
conv2 = tf.nn.relu(tf.nn.conv2d(pool1, wei_conv2) + bias_conv2)
pool2 =tf.nn.max_pool(conv2, ksize, strides, padding)
構(gòu)造全連接層時(shí),用隨機(jī)數(shù)函數(shù)生成全連接層的權(quán)值后,使用修正線性單元函數(shù)進(jìn)行激活,并使用dropout函數(shù)防止過(guò)擬合,構(gòu)造代價(jià)函數(shù),對(duì)代價(jià)函數(shù)進(jìn)行優(yōu)化,代碼為:
pool2_flat = tf.reshape(pool2, [-1, 7*7*64])
fc1 = tf.nn.relu(tf.matmul(pool2_flat, wei_fc1) + bias_fc1)
fc1_drop = tf.nn.dropout(fc1, keep_prob)
y = tf.nn.softmax(tf.matmul(fc1_drop,wei_fc2) + b_fc2)
cost_y = -tf.reduce_sum(y_*tf.log(y))
train = tf.train.AdamOptimizer(1e-4).minimize(cost_y)
在理想情況下,應(yīng)在每次訓(xùn)練中使用所有的訓(xùn)練數(shù)據(jù),但是這樣一來(lái),計(jì)算量將十分大??紤]到計(jì)算代價(jià),分小批次隨機(jī)選擇數(shù)據(jù)進(jìn)行訓(xùn)練。這一方法稱為隨機(jī)訓(xùn)練法,計(jì)算量較小,而且不會(huì)對(duì)結(jié)果造成影響。
獲得手寫(xiě)數(shù)字?jǐn)?shù)據(jù)集,將數(shù)據(jù)集劃分為訓(xùn)練集和測(cè)試集。數(shù)據(jù)集中的圖像是手寫(xiě)數(shù)字的灰度圖像,每張圖片的分辨率為28像素×28像素,總像素為784,灰度值在0~255之間。訓(xùn)練集和測(cè)試集共有785列,第一列為該圖的標(biāo)簽值,即該數(shù)字的真實(shí)值(0~9),之后784列由對(duì)應(yīng)圖像展開(kāi)得到。訓(xùn)練集包含42000幅圖像,測(cè)試集包含28000幅圖像。圖6為訓(xùn)練集中隨機(jī)抽出的圖像。
圖6 訓(xùn)練集圖像
從訓(xùn)練集的42000幅圖像中抽出3000幅圖作為驗(yàn)證集。將訓(xùn)練集中剩余的39000幅圖像和驗(yàn)證集中的3000幅圖像分別輸入訓(xùn)練得到的卷積神經(jīng)網(wǎng)絡(luò)模型,得到若干次迭代訓(xùn)練后的訓(xùn)練集識(shí)別率和驗(yàn)證集識(shí)別率,如圖7所示。
圖7 訓(xùn)練集識(shí)別率和驗(yàn)證集識(shí)別率
圖7中的試驗(yàn)結(jié)果顯示,在經(jīng)過(guò)2000次迭代訓(xùn)練后,驗(yàn)證集的識(shí)別率就已經(jīng)達(dá)到了0.98。相信調(diào)整卷積神經(jīng)網(wǎng)絡(luò)參數(shù)后,識(shí)別率可以更高。
卷積神經(jīng)網(wǎng)絡(luò)已被廣泛應(yīng)用于學(xué)術(shù)界和工業(yè)界,用來(lái)完成圖像識(shí)別任務(wù)。TensorFlow軟件在網(wǎng)絡(luò)構(gòu)建、參數(shù)優(yōu)化、模型訓(xùn)練等方面為用戶提供了便利。
試驗(yàn)以手寫(xiě)數(shù)字集為例,顯示了使用TensorFlow搭建卷積神經(jīng)網(wǎng)絡(luò)完成圖像識(shí)別的效果,得到了有較高識(shí)別精度的網(wǎng)絡(luò)模型,這對(duì)使用卷積神經(jīng)網(wǎng)絡(luò)和TensorFlow完成更復(fù)雜的圖像識(shí)別任務(wù)具有參考意義。筆者下一步的工作是在具體應(yīng)用場(chǎng)景下,深入理解深度神經(jīng)網(wǎng)絡(luò)的工作機(jī)制,研究如何更有效地選取網(wǎng)絡(luò)參數(shù)。
[1] LOWE D G. Object Recognition from Local Scale-invariant Features[C]. Computer Vision, 1999. The Proceedings of the Seventh IEEE International Conference on, Kerkyra,1999.
[2] LOWE D G. Distinctive Image Features from Scale-invariant Keypoints[J]. International Journal of Computer Vision, 2004, 60(2): 91-110.
[3] MITCHELL T M. 機(jī)器學(xué)習(xí)[M].曾華軍,張銀奎,譯.北京: 機(jī)械工業(yè)出版社,2008.
[4] 徐胤,樂(lè)珺,袁浩巍.基于不變矩特征和RBF神經(jīng)網(wǎng)絡(luò)的圖像識(shí)別[J].上海電氣技術(shù),2015,8(3): 33-36.
[5] 樂(lè)治后.基于RBF神經(jīng)網(wǎng)絡(luò)的光伏電池故障診斷[J].上海電氣技術(shù), 2015, 8(3): 28-32.
[6] KRIZHEVSKY A, SUTSKEVER I, HINTON G E, et al. ImageNet Classification with Deep Convolutional Neural Networks[J]. Communications of the ACM,2017,60(6): 84-90.
[7] ABADI M, AGARWAL A, BARHAM P, et al. Ten-sorFlow: Large-Scale Machine Learning on Het-erogeneous Distributed Systems[Z/OL]. http:∥arvix.org/abs/1603.04467.
[8] LECUN Y, BENGIO Y, HINTON G E, et al. Deep Learning[J]. Nature, 2015, 521(7553): 436-444.
[9] GOODFELLOW I, BENGIO Y, COURVILLE A. Deep Learning[M]. Cambridge: MIT Press,2016.
[10] GLOROT X, BORDES A, BENGIO Y. Deep Sparse Rectifier Neural Networks[C]. Proceedings of the Fourteenth International Conference on Artificial Intelligence and Statistics, Fort Lauderdale,2011.