基于python的BP神经网络算法对mnist数据集的识别--批量处理版

基于python的BP神经网络算法对mnist数据集的识别
目录:

1. mnist数据集

1.1 mnist数据集是什么

1.2 mnist数据集的读取

2. 神经网络

2.1 批处理数据

2.2 前向传播

2.2.1 sigmoid和softmax函数

2.2.2 损失函数

2.2.3 识别精度

2.3 反向传播

2.4 构建神经网络

3.训练神经网络

1.mnist数据集

在使用机器学习以及深度学习做神经网络算法时,常用的示例是使用mnist数据集的train_img 和 test_img 作为神经网络的输入,以mnist数据集的 train_label 和 test_label
本节简要的介绍mnist数据集和mnis数据集的导入以及处理

1.1 mnist数据集是什么
mnist是一个包含各种手写数字图片的数据集:其中有60000个训练数据和10000个测试时局,即60000个 train_img 和与之对应的 train_label,10000个 test_img 和 与之对应的test_label。
mnist中 train_img 和 test_img 的图片
其中的 train_img 和 test_img 就是这种图片的形式,train_img 是为了训练神经网络算法的训练数据,test_img 是为了测试神经网络算法的测试数据,每一张图片为2828,将图片转换为2828=784个像素点,每个像素点的值为0到255,像素点值的大小代表灰度,从而构成一个1784的矩阵,作为神经网络的输入,而神经网络的输出形式为110的矩阵,个:eg:[0.01,0.01,0.01,0.04,0.8,0.01,0.1,0.01,0.01,0.01],矩阵里的数字代表神经网络预测值的概率,比如0.8代表第五个数的预测值概率。

其中 train_label 和 test_label 是 对应训练数据和测试数据的标签,可以理解为一个1*10的矩阵,用one-hot-vectors(只有正确解表示为1)表示,one_hot_label为True的情况下,标签作为one-hot数组返回,one-hot数组 例:[0,0,0,0,1,0,0,0,0,0],即矩阵里的数字1代表第五个数为True,也就是这个标签代表数字5。

1.2 mnist数据集的读取
load_mnist(normalize=True, flatten=True, one_hot_label=False):中,
normalize : 是否将图像的像素值正规化为0.0~1.0(将像素值正规化有利于提高精度)flatten : 是否将图像展开为一维数组
one_hot_label:是否采用one-hot表示。
源码在 https://gitee.com/ldy1118/netural-network 中的mnist.py中,可直接调用(需要提前下载mnist数据集,mnist官网下载地址:http://yann.lecun.com/exdb/mnist/,四个红色文件,并将文件放在mnist同级目录下):

from mnist import load_mnist

(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=True)
print(x_train.shape, t_train.shape, x_test.shape, t_test.shape)

输出结果为:(60000, 784) (60000, 10) (10000, 784) (10000, 10)

2. 神经网络

2.1批处理数据

现在已经获得数据集,然后搭建一个两层(两个权重矩阵,一个隐藏层)的神经网络,其中输入节点和输出节点的个数是确定的,分别为 784 和 10。而隐藏层节点的个数还未确定,并没有明确要求隐藏层的节点个数,所以在这里取50个。现在神经网络的结构已经确定了,再看一下里面是怎么样的,这里画出了对一个数据的运算过程:
在这里插入图片描述

数学公式推导为:
在这里插入图片描述
在实际过程中,如果每次对一个数据训练n次神经网络,一共60000个数据,这个运算可想而知还是很庞大的,所以在这里介绍一种mini-batch的方法批量选取数据:

from mnist import load_mnist
  #读取数据:
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=True)
epoch = 20000  #对一批数据的迭代次数
for i in range(epoch):
    batch_mask = np.random.choice(train_size, batch_size)  # 从0到60000 随机选100个数
    x_batch = x_train[batch_mask]  # 索引x_train中随机选出的行数,构成一批数据
    y_batch = net.predict(x_batch)  # 计算这批数据的预测值
    t_batch = t_train[batch_mask]  # 同x_batch

2.2 前向传播
前向传播时,我们可以构造一个函数,输入数据,输出预测值

def predict(x,t):
	    a1 = np.dot(x, w1) + b1
        z1 = sigmoid(a1)
        a2 = np.dot(z1, w2) + b2
        y = softmax(a2)

2.2.1 sigmoid和softmax函数

在神经网络中,输入数据经过前向传播得到预测值
需要用到激活函数得出各节点的输出值,这里用到sigmoid和softmax函数

  • 14
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值