keras是基於TensorFlow的深度學習框架,在編寫keras代碼時,我們不必去管keras的底層運行內容(矩陣運算),我們只需建立模型,處理好輸入參數的數據類型就可以。我寫的博客主要是類似於做筆記,寫得不好,僅供參考。
keras多層感知器對手寫數字識別的步驟
1、數據預處理(處理好輸入的數據類型)
2、建立模型
3、訓練模型(利用訓練數據和驗證數據對模型進行訓練)
4、評估模型準確率(用測試數據對模型進行評估)
5、進行預測(預測測試數據的標籤)
6、結果分析
在學習keras時發現理解keras 框架的原理並不難,主要的是keras內置函數的輸入參數,以及輸入參數的數據類型需要注意的, 下面通過解釋代碼來了解keras,紅字部分需要記
1、數據預處理
import numpy as np import pandas as pd from keras.utils import np_utils a=np.random.seed(10) from keras.datasets import mnist (X_train_image,y_train_label),(X_test_image,y_test_label)=mnist.load_data()#下載數據集 x_train=X_train_image.reshape(60000,784).astype('float32') #轉換爲1維向量 x_test=X_test_image.reshape(10000,784).astype('float32') x_train_normalize=x_train/255#標準化 x_test_normalize=x_test/255 #把0~9的數字轉換爲10個1或0的組合 y_trainOneHot=np_utils.to_categorical(y_train_label) y_testOneHot=np_utils.to_categorical(y_test_label)
調用包和下載數據集沒什麼好說的。因爲下載完的數據類型是28*28維的數據,而輸入層爲1*784的數據,所以利用x_train=X_train_image.reshape(60000,784).astype('float32') 把多維數據轉換爲一維數據,把一維數據標準化,可以提高模型的準確率。數據的標籤爲0到9的數字,需要經過數獨熱編碼轉換爲10個0或1的組合,正好對應輸出層的10個神經元(有多少種標籤就要有多少個輸出神經元),y_trainOneHot=np_utils.to_categorical(y_train_label)。轉換完的y_trainOneHot類型爲float,n行10列。
2、模型建立
from keras.models import Sequential from keras.layers import Dense from keras.layers import Dropout model=Sequential()#建立Sequential模型 model.add(Dense(units=256, input_dim=784, kernel_initializer='normal', activation='relu')) #建立輸入層,隱藏層 model.add(Dropout(0.5))#加入Dropout功能防止過擬合 model.add(Dense(units=10, kernel_initializer='normal', activation='softmax'))#建立輸出層 model.summary()#查看模型摘要
主要要記住這些參數代表什麼,輸入層裏:units爲隱藏層神經元個數,input_dim爲輸入神經元的個數(輸入神經元主要看數據有多少個屬性),kernel_initializer爲使用正態分佈的隨機數 來初始化weight權重和偏差,activation爲激活函數,一般輸入層和隱藏層用relu,輸出層用softmax,softmax適用於多分類。
3、模型訓練
model.compile(loss='categorical_crossentropy', optimizer='adam',metrics=['accuracy'])##定義訓練方式 train_history=model.fit(x=x_train_normalize, y=y_trainOneHot,validation_split=0.2, epochs=10,batch_size=200,verbose=2)#訓練模型
首先設置訓練方式,loss爲設置損失函數categorical_crossentropy(交叉熵)的訓練效果比較好,一般使用這個(損失函數就是幫我我們計算真實值和預測值之間的誤差)。optimizer爲設置優化器,使用使用adam優化器可以讓模型更快收斂(優化器的作用爲在不斷的批次訓練中不斷更新權重和偏差,是損失函數最小化)。metrics爲設置評估模型的方式爲準確率。開始訓練的參數裏面輸入訓練數據,訓練標籤,劃分0.2爲驗證集,epochs爲訓練週期,batch_size爲每一訓練批次要輸入多少個數據(訓練批次=總數據/一批次訓練的數據量)verbose爲顯示訓練過程。
接下來寫一個顯示訓練過程的可視化函數
#建立顯示訓練過程的函數 import matplotlib.pyplot as plt def show_train_history(train_history,train,validation): plt.plot(train_history.history[train]) plt.plot(train_history.history[validation]) plt.title('Train History') plt.ylabel(train) plt.xlabel('Epoch') plt.legend(['train','validation'],loc='upper left') plt.show() show_train_history(train_history,'acc','val_acc')#畫出準確率執行結果
結果可以看出訓練數據的準確率和驗證數據的準確率
4評估模型準確率
scores=model.evaluate(x_test_normalize,y_testOneHot)#評估測試集 print('準確率爲:',scores[1])
輸入測試數據和測試標籤
5、進行預測
prediction=model.predict_classes(x_test)#預測測試集
輸入測試數據,標準化前後都行
編寫一個方便查看數字圖像、真實的數字與預測結果的函數
def plot_images_labels_prediction(images,labels,prediction,idx,num=10): fig=plt.gcf()#設置顯示圖形大小 fig.set_size_inches(12,14) if num>25:num=25 for i in range(0,num): ax=plt.subplot(5,5,1+i)#建立子圖5行5列 ax.imshow(images[idx],cmap='binary') title='lablel='+str(labels[idx]) if len(prediction)>0: title+=',predict='+str(prediction[idx]) ax.set_title(title,fontsize=10) ax.set_xticks([]);ax.set_yticks([]) idx+=1 plt.show() plot_images_labels_prediction(X_test_image,y_test_label,prediction,idx=340)
運行結果
6、結果分析
pd.crosstab(y_test_label,prediction, rownames=['label'],colnames=['predict'])#混淆矩陣 df=pd.DataFrame({'label':y_test_label,'predict':prediction})#找出真實值是‘5’,預測爲‘3’ df[(df.label==5)&(df.predict==3)]