背景介紹見:深度學習:識別圖片中的電話號碼(1)html
識別電話號碼最終採用的是:循環卷積網絡。先看下網絡的結構,有幾處比較trick的地方,後面會講到。git
1. 上圖中的網絡是訓練網絡的結構,訓練的輸入有三個:image圖片;seq是時序的標識,若是時序長度爲5則爲[0,1,1,1,1],0表示序列的開始,1表示序列繼續(當前時刻有信號輸入),上一時刻的細胞狀態會傳遞給當前時刻。label表示序列的真實結果,如「123」應該表示爲[1,2,3,-1,-1],長度和seq一致。github
在batchsize中,多個樣本的seq大小若是不一樣,短序列的seq=[0,1,1,…1,0,0..0],表示短序列提早結束了。固然電話識別中,把圖片特徵按列等分了n份,你們的序列長度是一致的。網絡
2. 序列的分割學習
輸入image的大小是:batch_size*3*h*wspa
輸入seq的大小是:batch_size*n ,n表示序列的長度=圖片特徵要切割的份數code
輸入label的大小是:batch_size*nhtm
通過ZF特徵提取網絡,relu5的輸出爲:batch_size*num_output*height*width,num_output表示featureMap的數據,width/height特徵層的寬高。blog
trans1轉置層,參數爲:圖片
transpose_param {
dim: 0
dim: 3
dim: 2
dim: 1
}
輸出的維度爲:batch_size*width*num_output*height。trick的作法是:n的大小能夠設置爲width,即把特徵層的每一列做爲一個時刻的輸入。
conv5_trans爲全鏈接層,固然它的全鏈接只針對某一列在num_output個featureMap上的節點進行,參數爲:
inner_product_param {
num_output: 4096
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
axis: 2
}
輸出爲:batch_size*width(n)*4096。
3. 構建序列,主要是構建LSTM的輸入格式,注意LSTM的輸入是:T*batch_size*C,T就是時序長度n,C是特徵的維度即4096。
4. LSTM的輸出爲:T*batch_size*lstm_c,lstm_c表示LSTM中特徵維度的大小,這裏取256。
通過fc-final,全鏈接爲字符的種類數目+1(背景)。好比數字,輸出爲T*batch_size*11。
5. 最終輸入CTC網絡,CTC網絡會對T時刻的數據作後處理計算與真實label的差別,返回loss。正如上節說的,T的大小應該大於label的長度,由於CTC的後處理會把結果中的空格(背景)和連續相同字符去除(重複識別)去除,若是T<len(label),後處理後獲得的字符必定和label不一樣了,這樣就沒意義了。
好比T=20,序列爲:「1_88_8_1_1_66_10_16_8」,處理後獲得「18811610168」。
檢測網絡和訓練相似,只是CTCLoss層替換爲CTCDecoder便可。
因爲新加了一些層的依賴,基於的caffe爲:https://github.com/houkai/caffe