手寫數(shù)字識(shí)別算法
import pandas as pd
import numpy as np
from sklearn.neural_network import MLPRegressor #從sklearn的神經(jīng)網(wǎng)絡(luò)中引入多層感知器
data_tr = pd.read_csv('BPdata_tr.txt') # 訓(xùn)練集樣本
data_te = pd.read_csv('BPdata_te.txt') # 測(cè)試集樣本
X=np.array([[0.568928884039633],[0.379569493792951]]).reshape(1, -1)#預(yù)測(cè)單個(gè)樣本
#參數(shù):hidden_layer_sizes中間層的個(gè)數(shù) activation激活函數(shù)默認(rèn)relu f(x)= max(0,x)負(fù)值全部舍去,信號(hào)相應(yīng)正向傳播效果好
#random_state隨機(jī)種子,max_iter最大迭代次數(shù),即結(jié)束,learning_rate_init學(xué)習(xí)率,學(xué)習(xí)速度,步長(zhǎng)
model = MLPRegressor(hidden_layer_sizes=(10,), activation='relu',random_state=10, max_iter=8000, learning_rate_init=0.3) # 構(gòu)建模型,調(diào)用sklearn實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)算法
model.fit(data_tr.iloc[:, :2], data_tr.iloc[:, 2]) # 模型訓(xùn)練(將輸入數(shù)據(jù)x,結(jié)果y放入多層感知器擬合建立模型) .iloc是按位置取數(shù)據(jù)
pre = model.predict(data_te.iloc[:, :2]) # 模型預(yù)測(cè)(測(cè)試集數(shù)據(jù)預(yù)測(cè),將實(shí)際結(jié)果與預(yù)測(cè)結(jié)果對(duì)比)
pre1 = model.predict(X)#預(yù)測(cè)單個(gè)樣本,實(shí)際值0.467753075712819
err = np.abs(pre - data_te.iloc[:, 2]).mean()# 模型預(yù)測(cè)誤差(|預(yù)測(cè)值-實(shí)際值|再求平均)
print("模型預(yù)測(cè)值:",pre,end='\n______________________________\n')
print('模型預(yù)測(cè)誤差:',err,end='\n++++++++++++++++++++++++++++++++\n')
print("單個(gè)樣本預(yù)測(cè)值:",pre1,end='\n++++++++++++++++++++++++++++++++\n')
#查看相關(guān)參數(shù)。
print('權(quán)重矩陣:','\n',model.coefs_) #list,length n_layers - 1,列表中的第i個(gè)元素表示對(duì)應(yīng)于層i的權(quán)重矩陣。
print('偏置矩陣:','\n',model.intercepts_) #list,length n_layers - 1,列表中的第i個(gè)元素表示對(duì)應(yīng)于層i + 1的偏置矢量。
數(shù)字手寫識(shí)別系統(tǒng)
#數(shù)字手寫識(shí)別系統(tǒng),DBRHD和MNIST是數(shù)字手寫識(shí)別的數(shù)據(jù)集
import numpy as np # 導(dǎo)入numpy工具包
from os import listdir # 使用listdir模塊,用于訪問(wèn)本地文件
from sklearn.neural_network import MLPClassifier #從sklearn的神經(jīng)網(wǎng)絡(luò)中引入多層感知器
#自定義函數(shù),將圖片轉(zhuǎn)換成向量
def img2vector(fileName):
retMat = np.zeros([1024], int) # 定義返回的矩陣,大小為1*1024
fr = open(fileName) # 打開包含32*32大小的數(shù)字文件
lines = fr.readlines() # 讀取文件的所有行
for i in range(32): # 遍歷文件所有行
for j in range(32): # 并將01數(shù)字存放在retMat中
retMat[i * 32 + j] = lines[i][j]
return retMat
#自定義函數(shù),獲取數(shù)據(jù)集
def readDataSet(path):
fileList = listdir(path) # 獲取文件夾下的所有文件
numFiles = len(fileList) # 統(tǒng)計(jì)需要讀取的文件的數(shù)目
dataSet = np.zeros([numFiles, 1024], int) # 用于存放所有的數(shù)字文件juzheng
hwLabels = np.zeros([numFiles, 10]) # 用于存放對(duì)應(yīng)的one-hot標(biāo)簽(每個(gè)文件都對(duì)應(yīng)一個(gè)10列的矩陣)
for i in range(numFiles): # 遍歷所有的文件
filePath = fileList[i] # 獲取文件名稱/路徑
digit = int(filePath.split('_')[0]) # 通過(guò)文件名獲取標(biāo)簽,split返回分割后的字符串列表
hwLabels[i][digit] = 1.0 # 將對(duì)應(yīng)的one-hot標(biāo)簽置1 .one-hot編碼,又稱獨(dú)熱編碼、一位有效編碼.one-hot向量將類別變量轉(zhuǎn)換為機(jī)器學(xué)習(xí)算法易于利用的一種形式的過(guò)程,這個(gè)向量的表示為一項(xiàng)屬性的特征向量,也就是同一時(shí)間只有一個(gè)激活點(diǎn)(不為0),這個(gè)向量只有一個(gè)特征是不為0的,其他都是0,特別稀疏。
dataSet[i] = img2vector(path + '/' + filePath) # 讀取文件內(nèi)容
return dataSet, hwLabels
#讀取訓(xùn)練數(shù)據(jù),并訓(xùn)練模型
train_dataSet, train_hwLabels = readDataSet('trainingDigits')
#參數(shù):hidden_layer_sizes中間層的個(gè)數(shù),activation激活函數(shù) logistic:f(x)=1/(1+exp(-x))將值映射在一個(gè)0~1的范圍內(nèi)。
#solver權(quán)重優(yōu)化的求解器adam默認(rèn),用于較大的數(shù)據(jù)集,lbfgs用于小型的數(shù)據(jù)集收斂的更快效果更好。max_iter迭代次數(shù)越多越準(zhǔn)確
clf = MLPClassifier(hidden_layer_sizes=(50,),activation='logistic', solver='adam',learning_rate_init=0.001, max_iter=700)
clf.fit(train_dataSet, train_hwLabels)#數(shù)據(jù)集,標(biāo)簽,擬合
# 讀取測(cè)試數(shù)據(jù)對(duì)測(cè)試集進(jìn)行預(yù)測(cè)
dataSet, hwLabels = readDataSet('testDigits')
res = clf.predict(dataSet) #預(yù)測(cè)結(jié)果是標(biāo)簽([numFiles, 10]的矩陣)
print("測(cè)試數(shù)據(jù)",dataSet,'\n___________________________________\n')
print("測(cè)試標(biāo)簽",hwLabels,'\n++++++++++++++++++++++++++++++++++++++++\n')
print("測(cè)試結(jié)果",res)
error_num = 0 # 統(tǒng)計(jì)預(yù)測(cè)錯(cuò)誤的數(shù)目
num = len(dataSet) # 測(cè)試集的數(shù)目
for i in range(num): # 遍歷預(yù)測(cè)結(jié)果
# 比較長(zhǎng)度為10的數(shù)組,返回包含01的數(shù)組,0為不同,1為相同
# 若預(yù)測(cè)結(jié)果與真實(shí)結(jié)果相同,則10個(gè)數(shù)字全為1,否則不全為1
if np.sum(res[i] == hwLabels[i]) 10:
error_num += 1
print("Total num:", num, " Wrong num:",error_num, " WrongRate:", error_num / float(num))
可視化MNIST是數(shù)字手寫識(shí)別的數(shù)據(jù)集
from keras.datasets import mnist#導(dǎo)入數(shù)字手寫識(shí)別系統(tǒng)的數(shù)據(jù)集
import matplotlib.pyplot as plt
(X_train, y_train), (X_test, y_test) = mnist.load_data()
#以2*2(2行2列)圖的方式展現(xiàn)
plt.subplot(221)
plt.imshow(X_train[1], cmap=plt.get_cmap('gray_r'))#白底黑字
plt.subplot(222)
plt.imshow(X_train[2], cmap=plt.get_cmap('gray'))#黑底白字
plt.subplot(223)
plt.imshow(X_train[3], cmap=plt.get_cmap('gray'))
plt.subplot(224)
plt.imshow(X_train[4], cmap=plt.get_cmap('gray'))
# show the plot
plt.show()
到此這篇關(guān)于python機(jī)器學(xué)習(xí)之神經(jīng)網(wǎng)絡(luò)的文章就介紹到這了,更多相關(guān)python神經(jīng)網(wǎng)絡(luò)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- numpy創(chuàng)建神經(jīng)網(wǎng)絡(luò)框架
- 教你使用Python建立任意層數(shù)的深度神經(jīng)網(wǎng)絡(luò)
- python神經(jīng)網(wǎng)絡(luò)編程之手寫數(shù)字識(shí)別
- pytorch動(dòng)態(tài)神經(jīng)網(wǎng)絡(luò)(擬合)實(shí)現(xiàn)
- Python如何使用神經(jīng)網(wǎng)絡(luò)進(jìn)行簡(jiǎn)單文本分類
- pytorch之深度神經(jīng)網(wǎng)絡(luò)概念全面整理