from sklearn.datasets import load_digits
import pylab as pl
import numpy as np
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
数据处理
digits = load_digits()#载入数据集
X = digits.data #数据
y = digits.target #标签print(digits.data.shape)
pl.gray()#灰度化图片
pl.matshow(digits.images[0])
pl.show()#输入数据归一化 0~1
X -= X.min()
X /= X.max()
定义神经网络
defsigmoid(x):return1/(1+np.exp(-x))defdsigmoid(x):return x*(1-x)classNeuralNetwork:def__init__(self,layers):#(64,100,10)#权值初始化,范围从-1到1
self.V = np.random.random((layers[0]+1,layers[1]+1))*2-1#+1偏置值
self.W = np.random.random((layers[1]+1,layers[2]))*2-1deftrain(self,X,y,lr=0.11,epochs=10000):#添加偏置
temp = np.ones([X.shape[0],X.shape[1]+1])
temp[:,0:-1]= X
X = temp #代表偏置的输入for n inrange(epochs+1):
i = np.random.randint(X.shape[0])#随机选取一个数据
x =[X[i]]
x = np.atleast_2d(x)#转为2维数据
L1 = sigmoid(np.dot(x,self.V))#隐藏层输出
L2 = sigmoid(np.dot(L1,self.W))#输出层输出
L2_delta =(y[i]-L2)*dsigmoid(L2)
L1_delta = L2_delta.dot(self.W.T)*dsigmoid(L1)
self.W += lr*L1.T.dot(L2_delta)
self.V += lr*x.T.dot(L1_delta)if n%1000==0:
predictions =[]for j inrange(X_test.shape[0]):
o = self.predict(X_test[j])
predictions.append(np.argmax(o))#获取预测结果#print(predictions)
accuracy = np.mean(np.equal(predictions,y_test))print('epoch:',n,'accuracy:',accuracy)defpredict(self,x):#添加偏置
temp = np.ones(x.shape[0]+1)
temp[0:-1]= x
x = temp #代表偏置的输入
x = np.atleast_2d(x)#转为2维数据
L1 = sigmoid(np.dot(x,self.V))#隐藏层输出
L2 = sigmoid(np.dot(L1,self.W))#输出层输出return L2