先花一分鐘介紹一下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