Keras實現簡單的手寫數字識別的學習


使用keras的序貫模型實現單層神經網絡對手寫數字識別的識別,相當於是一個keras的helloworld級別的程序,就當作深度學習之路的開始。

首先導入需要的函數和包

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD
from keras.datasets import mnist
import numpy as np

 

Sequential()是最簡單的模型——序貫模型。通過keras.models導入。

構建模型的網絡結構:

model = Sequential()
model.add(Dense(500,input_shape=(784,))) #輸入層, 28*28=784
model.add(Activation('tanh'))
model.add(Dropout(0.5)) #50% dropout

model.add(Dense(500)) #隱藏層, 500
model.add(Activation('tanh'))
model.add(Dropout(0.5)) #50% dropout

model.add(Dense(10)) #輸出結果, 10
model.add(Activation('softmax'))

通過model.add()增加模型的層數。其中Dense()設定該層的結構,第一個參數表示輸出的個數,第二個參數是接受的輸入數據的格式。第一層中需要指定輸入的格式,在之后的增加的層中輸入層節點數默認是上一層的輸出個數。Actication()指定激活函數,Dropout()指定每層要丟掉的節點信息百分比。輸出層激活函數一般為softmax,不需要丟棄節點。

編譯模型:

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) #設定學習效率等參數
model.compile(loss = 'categorical_crossentropy', optimizer=sgd, class_mode='categorical') #使用交叉熵作為loss

使用優化器sgd來編譯模型,用來指定學習效率等參數。編譯時指定loss函數,這里使用交叉熵函數作為loss函數。

 

讀取數據集作為訓練集和測試集:

(x_train,y_train),(x_test,y_test) = mnist.load_data() #使用mnist讀取數據(第一次需要下載)

X_train = x_train.reshape(x_train.shape[0], x_train.shape[1]*x_train.shape[2])
X_test = x_test.reshape(x_test.shape[0],x_test.shape[1]*x_test.shape[2])

Y_train = (np.arange(10) == y_train[:,None]).astype(int) #將index轉換橙一個one_hot矩陣
Y_test = (np.arange(10) == y_test[:,None]).astype(int)

讀取minst數據集,通過reshape()函數轉換數據的格式。

如果我們打印x_train.shape會發現它是(60000,28,28),即一共60000個數據,每個數據是28*28的圖片。通過reshape轉換為(60000,784)的線性張量。

如果我們打印y_train會發現它是一組表示每張圖片的表示數字的數組,通過numpy的arange()和astype()函數將每個數字轉換為一組長度為10的張量,代表的數字的位置是1,其它位置為0.

 

對使用轉換后的數據對模型進行訓練:

model.fit(X_train,Y_train,batch_size=200,epochs=100,shuffle=True,verbose=1,validation_split=0.3)

其中,batch_size表示每個訓練塊包含的數據個數,epochs表示訓練的次數,shuffle表示是否每次訓練后將batch打亂重排,verbose表示是否輸出進度log,validation_split指定驗證集占比

 

輸出對測試集進行測試的結果:

print("test set")
scores = model.evaluate(X_test,Y_test,batch_size=200,verbose=1)
print("")
print("The test loss is %f" % scores)
result = model.predict(X_test,batch_size=200,verbose=1)

result_max = np.argmax(result, axis = 1)
test_max = np.argmax(Y_test, axis = 1)

result_bool = np.equal(result_max, test_max)
true_num = np.sum(result_bool)
print("")
print("The accuracy of the model is %f" % (true_num/len(result_bool)))

model.evaluate()計算了測試集中的識別的loss值。

通過model.predict(),我們可以得到對於測試集中每個數字的識別結果,每個數字對應一個表示每個數字都是多少概率的長度為10的張量。

通過np.argmax(),我們得到每個數字的識別結果和期望的識別結果

通過np.equal(),我們得到每個數字是否識別正確

通過np.sum()得到識別正確的總的數字個數

計算正確率並打印。

這是最后的結果qAq:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM