基于感知机的手写体识别
生活随笔
收集整理的這篇文章主要介紹了
基于感知机的手写体识别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
對于手寫體的識別,我采用的是keras來實現的,首先搭建一個單層感知機的模型來訓練,來觀察其模型的預測效果。
學習步驟如下:
源碼:
from keras.datasets import mnist import matplotlib.pyplot as plt import numpy as np from keras.utils import np_utils from keras.layers.core import Dense,Activation,Dropout #從keras中導入layers模塊,為搭建全連接層做好準備 from keras.models import Sequential #從keras中導入sequential模塊(X_train,Y_train),(X_test,Y_test)=mnist.load_data() print(X_train.shape) print(Y_train.shape) print(X_test.shape) print(Y_test.shape) def plot_image(image): #輸入參數為imagefig=plt.gcf() #獲取當前圖像fig.set_size_inches(2, 2) #設置圖片大小plt.imshow(image,cmap="binary") #使用plt_imshow顯示圖片plt.show()#開始繪圖 #plot_image(X_train[0]) X_test1=X_test #備注未經處理的測試數據 Y_test1=Y_test #備注未經處理的測試標簽 X_train=X_train.reshape(60000,784)#將28*28的二維數據轉化成784的一維向量 X_test=X_test.reshape(10000,784) #將28*28的二維數據轉化為784的一維向量 ##轉化成浮點型,該一維向量由784個0——255的浮點數組成,大部分為0,少部分有數字,數字大小代表圖形每個點灰度深淺、 #接下來對一維向量的數字進行歸一化,使每個數值范圍都在0-1內 X_train=X_train.astype("float") X_test=X_test.astype("float") #print(X_train[0]) X_train=X_train/255 X_test=X_test/255 #print(X_train[0])#①接下來一步搞定圖形數據的預處理 #X_train=X_train.reshape(60000,784).astype("float")/255 #X_test=X_test.reshape(10000,784).astype("float")/255#②標簽數據的預處理 print(Y_train[:3]) #對數據進行一位有效編碼 #編碼位數為十位,對應分類的類別數目 N_classses=10 Y_train=np_utils.to_categorical(Y_train,N_classses) Y_test=np_utils.to_categorical(Y_test,N_classses) #print(Y_train[:3])#③搭建單層感知機網絡 model=Sequential() model.add(Dense(N_classses,input_dim=784)) model.add(Activation("softmax")) model.summary()#④編譯和訓練,選擇損失函數,優(yōu)化算法,設置評估模型標準 model.compile(loss="categorical_crossentropy",#損失函數選擇交叉熵函數optimizer ="adam", #優(yōu)化選擇器adam或者sgdmetrics=["accuracy"] #以準確率(accura)評估模型訓練結果 )#⑤訓練網絡 N_epoch=20 Batch_size=128 Validation_split=0.2 training=model.fit(X_train,Y_train, #輸入訓練集和標簽batch_size=Batch_size, #設置每次處理數據集的個數epochs=N_epoch, #設置迭代次數validation_split=Validation_split, #設置驗證集的比率0.2verbose=2 #日志顯示,0代表不在標準輸入輸出日志信息,1代表輸出進度記錄,2代表每次迭代輸出一行記錄且無進度條記錄)#⑥訓練好的網絡進行測試集評估 Test =model.evaluate(X_test,Y_test,verbose=1) print("測試誤差:",Test[0]) print("準確度:",Test[1])#⑦預測 prediction=model.predict_classes(X_test) #X_test已經進行編碼處理了 def pre_result(i):plot_image(X_test1[i])print("Y_test:",Y_test1[i])print("預測結果:",prediction[i]) pre_result(0)運行結果:
?
下面是多層感知機的手寫體識別
該模型有一個輸入層有784個神經元,兩個隱藏層都有1000個神經元,一個輸出層有10個神經元,使用了dropout()函數減少過擬合現象。
學習過程如上一樣。
源碼如下:
from keras.models import Sequential from keras.datasets import mnist from keras.layers.core import Dense,Dropout,Activation import numpy as np from keras.utils import np_utils import matplotlib.pyplot as plt (X_train,Y_train),(X_test,Y_test)=mnist.load_data() def plot_image(image):fig=plt.gcf()fig.set_size_inches(2,2)plt.imshow(image,cmap="binary")plt.show()N_classses=10 X_test1=X_test Y_test1=Y_test X_train=X_train.reshape(60000,784).astype("float32")/255 X_test=X_test.reshape(10000,784).astype("float32")/255 Y_test=np_utils.to_categorical(Y_test,N_classses) Y_train=np_utils.to_categorical(Y_train,N_classses)#print(Y_train[0]) model=Sequential() model.add(Dense(1000,input_dim=784)) #輸入層為784個神經元,輸入層所連接的第一個隱藏層有1000個神經元 model.add(Activation("relu")) model.add(Dropout(0.5))model.add(Dense(1000)) #第二個隱藏層 model.add(Activation("relu")) model.add(Dropout(0.5))model.add(Dense(10)) #輸出層有10個神經元,激活函數softmax model.add(Activation("softmax"))model.summary()#網絡編譯 model.compile(loss="categorical_crossentropy", #損失函數optimizer="adam", #優(yōu)化器選擇adammetrics=["accuracy"] #以準確率評估模型訓練結果) #網絡訓練 N_epochs=20 Batch_size = 128 Validation = 0.2 training =model.fit(X_test,Y_train,batch_size=Batch_size,epochs=N_epochs,validation_split=Validation,verbose=2 )#評估 Test =model.evaluate(X_test,Y_test,verbose=1) print("誤差:",Test[0]) print("準確率:",Test[1])#預測 prediction=model.predict_classes(X_test) #預測所有的數據 def pre_result(i):plot_image(X_test1[i])print("Y_test:",Y_test1[i])print("預測值:",prediction[i]) #預測值 pre_result(0) pre_result(1)綜上多層感知機的對于手寫體識別預測不是很好,單層感知機對于手寫體識別的預測較好。
?
總結
以上是生活随笔為你收集整理的基于感知机的手写体识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 逻辑斯谛回归(Logistic回归)最详
- 下一篇: 卷积神经网络的详解