使用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:

