输出结果
核心代码
#DL之NN:基于sklearn自带手写数字图片识别数据集+自定义NN类(三层64→100→10)实现97.5%准确率
#输入64+1(偏置)个神经元,隐藏层神经元个数可以自定义,输出层10个神经元
import numpy as np
from sklearn.datasets import load_digits #sklearn自带数据集
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.preprocessing import LabelBinarizer #标签二值化
from sklearn.cross_validation import train_test_split #将数据切分分训练数据和测试数据
import matplotlib.pyplot as plt
def sigmoid(x):
return 1/(1+np.exp(-x))
def dsigmoid(x):
return x*(1-x)
……
def predict(self,x): #预测函数,也需要先添加偏置
#添加偏置,最初的数据64上需额外加入偏置列
temp=np.ones(x.shape[0]+1) #
temp[0:-1]=x #该矩阵的0列到-1列
x=temp #通过转换行没有变,但是多了一列
x=np.atleast_2d(x) #转为2维数据
L1=sigmoid(np.dot(x,self.V)) #隐藏层输出
L2=sigmoid(np.dot(L1,self.W)) #输出层输出
return L2
digits = load_digits() #下载数据集
X = digits.data #输入数据
y = digits.target #标签
#输入数据归一化:把最初的数据都变为[0~1]之间的数据
X -= X.min()
X /= X.max()
nn = NeuralNetwork([64, 100, 10]) #构建神经网络,神经元个数
X_train, X_test, y_train, y_test = train_test_split(X, y) #分割数据,75%为训练25%为测试
#对标签二值化,将输出变为神经网络的风格:比如若输出3→0001000000
labels_train = LabelBinarizer().fit_transform(y_train)
labels_test = LabelBinarizer().fit_transform(y_test)
print ("start")
nn.train(X_train, labels_train, epochs=30000)
print ("over")