机器学习:BP神经网络实现手写数字识别

BP神经网络-手写数字识别

导入相关的包

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

在这里插入图片描述

定义神经网络

def sigmoid(x):
    return 1/(1+np.exp(-x))
def dsigmoid(x):
    return x*(1-x)

class NeuralNetwork:
    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-1
    def train(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 in range(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 in range(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)
                
    def predict(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

训练模型

nm = NeuralNetwork([64,100,10]) #创建网络
X_train,X_test,y_train,y_test = train_test_split(X,y)

labels_train = LabelBinarizer().fit_transform(y_train)  #标签二值化 0,8,6  3->0001000000
labels_test = LabelBinarizer().fit_transform(y_test)  #标签二值化

print('start')
nm.train(X_train,labels_train,epochs=20000)
print('end')

在这里插入图片描述

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值