[1]機(jī)器學(xué)習(xí),keras訓(xùn)練銀行卡數(shù)字

本文主要記錄個(gè)人學(xué)習(xí)機(jī)器模型的一些個(gè)人心得。
起初本來是用google的tensorflow來實(shí)現(xiàn)模型的訓(xùn)練的,tensorflow里面包含手寫數(shù)字識(shí)別的例子。也就是fully_connected_feed.py那個(gè)例子,例子中用到的數(shù)據(jù)是從網(wǎng)上下載的,我直接把數(shù)據(jù)改成了自己的銀行卡數(shù)據(jù)(8000多張銀行卡數(shù)字樣本),用這個(gè)例子跑了下,效果還挺不錯(cuò)的。


1.png

這個(gè)例子實(shí)際上是用到了兩層神經(jīng)網(wǎng)絡(luò)再加一個(gè)softmax 激活函數(shù)來實(shí)現(xiàn)樣本的分類


code.png

第一個(gè)隱含層參數(shù) weights1是一個(gè)784*128的矩陣(784是圖片的大小,mnist數(shù)據(jù)集每張圖片是28*28的 也就是784)。進(jìn)過第一層的計(jì)算,可以將1*784的矩陣轉(zhuǎn)換成1*128的矩陣。
第二個(gè)隱含層參數(shù)weights2是一個(gè)128*32的矩陣,第二層的輸入是第一層的到的1*128的矩陣。經(jīng)過第二層的矩陣計(jì)算后,得到的是一個(gè)1*32的矩陣。
第三步,使用softmax 激活函數(shù)來實(shí)現(xiàn)圖片的分類。第三部的參數(shù)[hidden2_units, NUM_CLASSES],即32*10, 32是上一步得到的結(jié)果,10是樣本類別一共有十種(數(shù)字0~9)。使用softmax激活函數(shù)計(jì)算得到的結(jié)果是一個(gè)1*10的矩陣。里面的每一個(gè)數(shù)據(jù)代表對(duì)應(yīng)下標(biāo)的數(shù)字的概率。取最大概率對(duì)應(yīng)的數(shù)組下標(biāo)就是最終的預(yù)測結(jié)果。

機(jī)器學(xué)習(xí)的實(shí)質(zhì)也就是訓(xùn)練這三步中每一步的參數(shù)。得到這三步的參數(shù)后,預(yù)測心的圖片數(shù)字樣本只需要進(jìn)行相應(yīng)的矩陣計(jì)算即可(輸入的圖片矩陣乘以weight1,得到的結(jié)果再乘以weight2,再乘以weight3,得到一個(gè)十分類的結(jié)果)。
中間隱含層的個(gè)數(shù)多少實(shí)際上也是一個(gè)研究方向,不同隱含層的個(gè)數(shù)會(huì)直接影響模型的準(zhǔn)確率。

上面的例子是機(jī)器學(xué)習(xí)中一個(gè)比較簡單的mlp(多層感知器)神經(jīng)網(wǎng)絡(luò)。而且是采用全連接的形式,全連接的一個(gè)比較大的缺點(diǎn)是如果圖片比較大,比如1000*1000的,那么第一層的參數(shù)就是1000000*128的,這就有點(diǎn)大了,這只是一張圖,如果是1000張圖,那么第一層的參數(shù)就是1000000*128*1000了。這樣的計(jì)算量顯然就有點(diǎn)大了。 比較好的一種解決方法就是采用局部連接的方式。一般認(rèn)為人對(duì)外界的認(rèn)知是從局部到全局的,而圖像的空間聯(lián)系也是局部的像素聯(lián)系較為緊密,而距離較遠(yuǎn)的像素相關(guān)性則較弱。因而,每個(gè)神經(jīng)元其實(shí)沒有必要對(duì)全局圖像進(jìn)行感知,只需要對(duì)局部進(jìn)行感知,然后在更高層將局部的信息綜合起來就得到了全局的信息。網(wǎng)絡(luò)部分連通的思想,也是受啟發(fā)于生物學(xué)里面的視覺系統(tǒng)結(jié)構(gòu)。視覺皮層的神經(jīng)元就是局部接受信息的(即這些神經(jīng)元只響應(yīng)某些特定區(qū)域的刺激)。如下圖所示:左圖為全連接,右圖為局部連接。


fullyconnectedAndLocalConnected.jpg

在上右圖中,假如每個(gè)神經(jīng)元只和10×10個(gè)像素值相連,那么權(quán)值數(shù)據(jù)為1000000×100個(gè)參數(shù),減少為原來的萬分之一。而那10×10個(gè)像素值對(duì)應(yīng)的10×10個(gè)參數(shù),其實(shí)就相當(dāng)于卷積操作。

深度學(xué)習(xí)這段時(shí)間被炒的很火,下面我們將使用keras中的cnn(卷積神經(jīng)網(wǎng)絡(luò))來訓(xùn)練我們的銀行卡數(shù)字。樣本數(shù)字從0~9一共8500多張。我們?nèi)?000張拿來訓(xùn)練,剩下的500張哪來做測試集。


data1.png

每張圖片的大小是27*19的矩陣,首先構(gòu)造keras能夠讀取的數(shù)據(jù)集,代碼比較簡單,就不寫了,直接截圖看下數(shù)據(jù)格式。


data2.png

data里面包含兩個(gè)元組,第一個(gè)是訓(xùn)練集8000張圖片,第二個(gè)是測試集500張。每個(gè)元組下面又包含兩個(gè)元組,第一個(gè)是圖片數(shù)據(jù),第二個(gè)是標(biāo)簽數(shù)據(jù)。

batch_size = 128
nb_classes = 10
nb_epoch = 8#迭代次數(shù)
(X_train, y_train), (X_test, y_test) = load_data()
X_train = X_train.reshape(X_train.shape[0], 1, 27, 19)
X_test = X_test.reshape(X_test.shape[0], 1, 27, 19)
X_train = X_train.astype("float32")
X_test = X_test.astype("float32")
X_train /= 255
X_test /= 255
print('X_train shape:', X_train.shape)
print(X_train.shape[0], 'train samples')
print(X_test.shape[0], 'test samples')

Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)

model = Sequential()

model.add(Convolution2D(32, 1, 3, 3, border_mode='full'))
model.add(Activation('relu'))
model.add(Convolution2D(32, 32, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(poolsize=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(32*(27//2)*(19//2), 128)) #下采樣
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Dense(128, nb_classes))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adadelta')

model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch, show_accuracy=True, verbose=1, validation_data=(X_test, Y_test))
score = model.evaluate(X_test, Y_test, show_accuracy=True, verbose=0)
print('Test score:', score[0])
print('Test accuracy:', score[1])
#保存模型,下次可以直接用這個(gè)模型預(yù)測數(shù)字
model_json_str = json.dumps(model.get_config())
open('my_cnn_model_json_str.json','w').write(model_json_str)
model.save_weights("my_cnn_model_weights.h5",True)

運(yùn)行程序,迭代8次,大概需要四五十分鐘。
訓(xùn)練結(jié)果:

result1.png

訓(xùn)練完成后將保存下模型和參數(shù)
my_cnn_model_json_str.json
my_cnn_model_weights.h5。
下次測試其它圖片直接加載本次的訓(xùn)練模型來預(yù)測即可。

from __future__ import absolute_import
from __future__ import print_function
from keras.models import Sequential
import numpy as np
np.random.seed(1337)  # for reproducibility
import keras
model = keras.models.model_from_json(open('my_cnn_model_json_str.json').read())
model.load_weights('my_cnn_model_weights.h5')

def pridict(image):
    ll = list()
    ll.append(image)
    xx = np.array(ll)
    ll2 = list()
    ll2.append(xx)
    xx2 = np.array(ll2)
    predict = model.predict(xx2, batch_size=1, verbose=1)
    return predict

再來弄一堆測試數(shù)據(jù),用上次訓(xùn)練完的模型來預(yù)測


test2.png

運(yùn)行我們的程序:

pre1.png

pre2.png

pre3.png

pre4.png

pre6.png

第四個(gè)錯(cuò)了,把6識(shí)別成9了。

后續(xù)計(jì)劃:
遷移模型到手機(jī)客戶端
下一篇地址,mlp模型參數(shù)提取:http://www.itdecent.cn/p/2e5b2ff068eb

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容