徐 胤, 袁浩巍, 李 智
上海電氣集團股份有限公司 中央研究院 上海 200070
手寫字符識別可用于識別票據數字、車牌號等,應用廣泛。字符識別可用傳統的機器學習方法實現,如k-近鄰算法、支持向量機、貝葉斯方法等。使用傳統識別方法處理圖像時,首先要對圖像進行預處理,然后由人工設計特征提取方法。現有的特征提取方法有類哈爾特征、方向梯度直方圖特征、尺度不變特征變換[1-2]、加速穩健特征等,這些特征提取方法各有優勢,如類哈爾特征常用于人臉識別,方向梯度直方圖特征常用于行人檢測。特征提取后,將所得的特征導入一個分類器進行訓練,得到分類器的相關參數。使用時,將待識別圖像特征提取后,再輸入經訓練得到的分類器中進行識別。
人工神經網絡的研究在一定程度上受到了生物學的啟發,生物的學習系統是由相互連接的神經元所組成的復雜網絡,人工神經網絡與此大體相似[3]。神經網絡具有廣泛的應用范圍,對于數據具有很好的魯棒性,已成功應用于很多領域,如視覺識別、故障診斷、語音識別、機器人控制[4-5]等。卷積神經網絡是人工神經網絡的一種,其權值共享網絡結構減少了權值的數量,降低了網絡模型的復雜度,在圖像識別應用中,可以將圖像直接作為網絡的輸入。卷積網絡是為了識別二維形狀而設計的一個多層感知器,對平移、旋轉、縮放具有高度不變性[6],能夠通過隱藏層逐層提取出圖像特征。TensorFlow是由谷歌大腦團隊開發的采用數據流圖、用于數值計算的開源軟件,通常用于機器學習和深度學習的研究,也可用于其它計算領域。TensorFlow具有靈活的架構,能夠在多平臺上展開計算,能夠在中央處理器和圖形處理器上運行,支持移動設備、服務器等,并支持Linux、Windows、Mac OS等操作系統,具有很強的可移植性。此外,TensorFlow支持多語言,可以使用C++、Python、R、JAVA等語言實現編程[7]。
筆者首先載入手寫數字數據集,將數據集分為訓練集和驗證集;然后搭建具有兩個隱藏層的卷積神經網絡模型,輸入訓練集,設置模型參數和損失函數后進行訓練,得到卷積神經網絡的因數;最后使用訓練出的卷積神經網絡對驗證集中的手寫數字進行識別。
傳統神經網絡通常采用反向傳播算法進行特征訓練。在隨機給定一組權重因數后,得到網絡的輸出值,然后算出實際輸出與目標輸出之間的誤差,將誤差反饋至前面各層的節點,并更新每個節點的權值。逐步迭代這個過程,直至得到誤差函數的全局最小值。
深度學習是在傳統神經網絡基礎上發展起來的深度神經網絡,其結構層次與神經網絡相同,即包括輸入層、隱藏層、輸出層,且只在相鄰層的節點之間有連接。為了克服傳統神經網絡訓練過程中訓練時間長、參數多等問題,深度學習使用了與傳統神經網絡不同的訓練機制。卷積神經網絡是一種在網絡層中用卷積運算來代替矩陣乘法運算的神經網絡,適合用來處理圖像數據[8]。
前饋型神經網絡的連接方式采用多層結構,其基本結構為輸入層、隱藏層、輸出層。隱藏層也稱中間層,隱藏層的層數大于等于1,包括卷積層、池化層、全連接層。圖1為前饋型神經網絡結構,從左至右依次為輸入層、隱藏層1、隱藏層2、輸出層。前饋型神經網絡具有強大的非線性處理能力和模式識別能力。

圖1 前饋型神經網絡結構圖
卷積神經網絡是一種前饋型神經網絡,圖2為卷積神經網絡結構[6],有八層帶權重因數的層數,第一層是數據輸入層,之后連接的五層是卷積層,最后三層是全連接層,全連接層的最后一層為輸出層。

圖2 卷積神經網絡結構圖
由圖2可以看到,上下層神經元之間都形成了連接,假設隱藏層節點數量為10000,輸入的圖像分辨率為100像素×100像素,則僅一層隱藏層就有108個權值待訓練,權值數量十分龐大。另一方面,圖像具備固有的二維結構特征,如角點、直線、邊緣等,這些局部特征都可以加以利用。卷積神經網絡能夠使一組神經元使用相同的權值,即權值共享,這樣能夠節省訓練計算所占用的資源。
圖像卷積能夠自動提取圖像中的特征,減少多余信息,用于神經網絡中,具有代替人工設計特征的功能。圖像卷積過程也稱特征學習,特征學習能夠自動適配新的任務,只需在新數據上進行訓練,自動找出新的卷積核,可以避免繁重的特征工程。
卷積運算是針對兩個實變函數的一種數學運算,用*號表示,其運算式為:
s(t)=(x*ω)(t)
(1)
式中:t為時間;x為輸入信號;ω為核函數;s(t)為x在ω核函數下經過時間t后的卷積結果。
在處理圖像卷積時,將二維圖像I作為卷積運算的輸入,分別在水平和豎直方向執行卷積操作,卷積規則為[9]:
S(i,j) =(I*K)(i,j)

(2)
式中:K為二維卷積核;(i,j)為像素位置;(m,n)為卷積核尺寸;S(i,j)為卷積后得到的特征圖。
在許多神經網絡庫中有互相關函數,這些函數和卷積運算比較相似,但沒有翻轉,也稱為卷積運算,卷積后的圖像為[9]:
S(i,j) =(I*K)(i,j)

(3)
使用互相關函數的圖像卷積過程如圖3所示,卷積核在原圖像上滑動,與原圖像進行相乘和加權疊加后得到特征映射圖。

圖3 互相關函數圖像卷積過程
卷積核翻轉的唯一目的是實現可交換性,但是這在神經網絡應用中并不是一個重要的性質。而另一方面,互相關運算更簡單,且更容易實現。
池化指對卷積后的圖像進行采樣,以降低卷積圖像的維數,即減少參數。另外,池化還能消除信號的偏移和扭曲,增強網絡的魯棒性。池化的方法一般有兩種,一種是平均值池化,另一種是最大值池化。圖4為最大值池化示意圖,濾波器尺寸取為2×2,最大值池化運算時,在濾波器覆蓋的每個區域中提取該區域內像素的最大值,進而得到主要特征。

圖4 最大值池化示意圖
激活函數的作用是增加神經網絡模型的非線性。如果沒有非線性激活函數,那么神經網絡的每一層輸出就相當于上一層輸入的線性組合。激活函數通常使用雙曲正切函數或修正線性單元函數,作用于隱藏層,將前一層輸入的數據非線性化。筆者使用的激活函數是修正線性單元函數,它不需要對輸入進行歸一化來防止飽和。使用修正線性單元函數時,卷積網絡的訓練速度遠快于使用雙曲正切函數[4]。修正線性單元函數的實現式為[10]:
fReLU=max(0,x)
(4)
修正線性單元函數的可視化圖像如圖5所示,橫軸為變量x,縱軸為輸出fReLU。

圖5 修正線性單元函數可視化圖像
設置卷積網絡的學習率LEARNING_RATE為1×10-4,設置訓練的迭代次數TRAINING_ITERATIONS為3000,設置每次訓練的樣本數量BATCH_SIZE為50,設置驗證集的大小為3000。
載入訓練集數據后,將圖像的像素值由0~255轉換為0~1,代碼為:
images = np.multiply(images, 1.0 / 255.0)
將權值因數、偏置因數初始化,通過隨機數函數生成。隨機數函數生成一組正態分布的隨機數,這組隨機數的值在[mean-2*stddev,mean+2*stddev]范圍內。shape表示張量的維度,mean表示均值,stddev表示標準差,則有:
wei_init = tf.truncated_normal(shape, mean=0, stddev=0.1)
bias_init = tf.constant(0.1, shape)
筆者采用具有兩層隱藏層的卷積網絡。構造第一層卷積神經網絡時,先進行卷積操作,再使用修正線性單元函數進行激活,然后進行最大值池化操作。使用相同的方法構造第二層卷積神經網絡。構造卷積神經網絡的代碼為:
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)
構造全連接層時,用隨機數函數生成全連接層的權值后,使用修正線性單元函數進行激活,并使用dropout函數防止過擬合,構造代價函數,對代價函數進行優化,代碼為:
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)
在理想情況下,應在每次訓練中使用所有的訓練數據,但是這樣一來,計算量將十分大。考慮到計算代價,分小批次隨機選擇數據進行訓練。這一方法稱為隨機訓練法,計算量較小,而且不會對結果造成影響。
獲得手寫數字數據集,將數據集劃分為訓練集和測試集。數據集中的圖像是手寫數字的灰度圖像,每張圖片的分辨率為28像素×28像素,總像素為784,灰度值在0~255之間。訓練集和測試集共有785列,第一列為該圖的標簽值,即該數字的真實值(0~9),之后784列由對應圖像展開得到。訓練集包含42000幅圖像,測試集包含28000幅圖像。圖6為訓練集中隨機抽出的圖像。

圖6 訓練集圖像
從訓練集的42000幅圖像中抽出3000幅圖作為驗證集。將訓練集中剩余的39000幅圖像和驗證集中的3000幅圖像分別輸入訓練得到的卷積神經網絡模型,得到若干次迭代訓練后的訓練集識別率和驗證集識別率,如圖7所示。

圖7 訓練集識別率和驗證集識別率
圖7中的試驗結果顯示,在經過2000次迭代訓練后,驗證集的識別率就已經達到了0.98。相信調整卷積神經網絡參數后,識別率可以更高。
卷積神經網絡已被廣泛應用于學術界和工業界,用來完成圖像識別任務。TensorFlow軟件在網絡構建、參數優化、模型訓練等方面為用戶提供了便利。
試驗以手寫數字集為例,顯示了使用TensorFlow搭建卷積神經網絡完成圖像識別的效果,得到了有較高識別精度的網絡模型,這對使用卷積神經網絡和TensorFlow完成更復雜的圖像識別任務具有參考意義。筆者下一步的工作是在具體應用場景下,深入理解深度神經網絡的工作機制,研究如何更有效地選取網絡參數。
[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. 機器學習[M].曾華軍,張銀奎,譯.北京: 機械工業出版社,2008.
[4] 徐胤,樂珺,袁浩巍.基于不變矩特征和RBF神經網絡的圖像識別[J].上海電氣技術,2015,8(3): 33-36.
[5] 樂治后.基于RBF神經網絡的光伏電池故障診斷[J].上海電氣技術, 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.