keras多層感知器對手寫數字識別

Keras學習總結

  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)]