Keras入門之一: Hello Keras on MNIST 第一個例子-手寫數字識別

先花一分鐘介紹一下Keras
Keras的好處很多人已經說過,純Python寫成的,而且支持CPU/GPU的切換,能方便的使用 CNN/RNN 搞你想要的東東。
下圖是Keras的功能模塊結構圖,十分清晰。

下面我們看一下我學習的第一個Keras 用於創建網絡的學習例子。
這是採用了 mnist 手寫數字識別數據集
原來的例子中有的地方對小白來說還不太明白,所以我又多加了一些註釋,稍微修改了一下結構(比如多建了中間層)。
#=================== Test 1    Hello Keras for mnist==============================================================================
# 這是一個簡單的全連接神經網絡的例子。
from keras.models import Sequential  # 採用貫序模型
from keras.layers import Input, Dense, Dropout, Activation
from keras.models import Model
from keras.optimizers import SGD
from keras.datasets import mnist
import numpy as np

tBatchSize = 128
'''第一步:選擇模型'''
model = Sequential() # 採用貫序模型

'''第二步:構建網絡層'''
'''構建網絡只是構建了一個網絡結構,並定義網絡的參數,此時還沒有輸入的數據集'''
#構建的第一個層作爲輸入層
# Dense 這是第一個隱藏層,並附帶定義了輸入層,該隱含層有500個神經元。輸入則是 784個節點
model.add(Dense(500,input_shape=(784,))) # 輸入層,28*28=784 輸入層將二維矩陣換成了一維向量輸入
model.add(Activation('tanh')) # 激活函數是tanh 爲雙曲正切  tanh(x) = sinh(x)/cosh(x) = (e^x - e^(-x))/(e^x + e^(-x))
model.add(Dropout(0.5)) # 採用50%的dropout  隨機取一半進行訓練

#構建的第2個層作爲隱藏層2, (如果加上輸入層,實際上是第三層)
model.add(Dense(500)) # 隱藏層節點500個
model.add(Activation('tanh'))
model.add(Dropout(0.5))

model.add(Dense(500)) # 隱藏層3,節點500個
model.add(Activation('tanh'))
#model.add(Dropout(0.5))

#構建的第3個層作爲輸出層
model.add(Dense(10)) # 輸出結果是10個類別,所以維度是10
# softmax介紹可以參考https://blog.csdn.net/haolexiao/article/details/72757796
model.add(Activation('softmax')) # 最後一層用softmax作爲激活函數

'''第三步:網絡優化和編譯'''
#   lr:大於0的浮點數,學習率
#   momentum:大於0的浮點數,動量參數
#   decay:大於0的浮點數,每次更新後的學習率衰減值
#   nesterov:布爾值,確定是否使用Nesterov動量
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) # 優化函數,設定學習率(lr)等參數

# 只有通過了編譯,model才真正的建立起來,這時候才能夠被使用
#model.compile(loss='categorical_crossentropy', optimizer=sgd, class_mode='categorical') # 使用交叉熵作爲loss函數 這是原例子,但是執行出錯
model.compile(loss='categorical_crossentropy', optimizer=sgd) # 使用交叉熵作爲loss函數    # 去掉 class_mode 即可。可能是版本不同導致的???

'''
   第四步:訓練
'''

# 數據集獲取 mnist 數據集的介紹可以參考 https://blog.csdn.net/simple_the_best/article/details/75267863
(X_train, y_train), (X_test, y_test) = mnist.load_data() # 使用Keras自帶的mnist工具讀取數據(第一次需要聯網)

# 由於mist的輸入數據維度是(num, 28, 28),這裏需要把後面的維度直接拼起來變成784維
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])

#這個能生成一個OneHot的10維向量,作爲Y_train的一行,這樣Y_train就有60000行OneHot作爲輸出
Y_train = (np.arange(10) == y_train[:, None]).astype(int)  # 整理輸出
Y_test = (np.arange(10) == y_test[:, None]).astype(int)    #np.arange(5) = array([0,1,2,3,4])

'''
   .fit的一些參數
   batch_size:對總的樣本數進行分組,每組包含的樣本數量
   epochs :訓練次數
   shuffle:是否把數據隨機打亂之後再進行訓練
   validation_split:拿出百分之多少用來做交叉驗證
   verbose:屏顯模式 0:不輸出  1:輸出進度  2:輸出每次的訓練結果
'''
model.fit(X_train, Y_train, batch_size=tBatchSize, epochs=50, shuffle=True, verbose=2, validation_split=0.3)
#model.evaluate(X_test, Y_test, batch_size=200, verbose=0)


'''第五步:輸出'''
print("test set")
# 誤差評價 :按batch計算在batch用到的輸入數據上模型的誤差
scores = model.evaluate(X_test,Y_test, batch_size=tBatchSize, verbose=0)
print("")
print("The test loss is %f" % scores)

# 根據模型獲取預測結果  爲了節約計算內存,也是分組(batch)load到內存中的,
result = model.predict(X_test,batch_size=tBatchSize,verbose=1)

# 找到每行最大的序號
result_max = np.argmax(result, axis = 1) #axis=1表示按行 取最大值   如果axis=0表示按列 取最大值 axis=None表示全部
test_max = np.argmax(Y_test, axis = 1) # 這是結果的真實序號

result_bool = np.equal(result_max, test_max) # 預測結果和真實結果一致的爲真(按元素比較)
true_num = np.sum(result_bool) #正確結果的數量
print("The accuracy of the model is %f" % (true_num/len(result_bool))) # 驗證結果的準確率



看完上面的例子以後,再回過頭來看看程序是怎麼建立的:
這一個例子可以算是最簡單的,之後我學完一些複雜的網絡繼續放上來。

原文地址 http://www.cnblogs.com/lc1217/p/7132364.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章