pythonBP神经网络识别数字

本文记录了使用Python实现BP神经网络识别MNIST手写数字的过程,包括网络结构建立、训练数据预处理、模型训练及测试,详细解析了BP神经网络的工作原理和权重修正公式。
摘要由CSDN通过智能技术生成

因为课程要求需要做个神经网络的大作业,就顺便记录下来

BP神经网络原理

BP神经网络是一种按误差反向传播(简称误差反传)训练的多层前馈网络,它的基本思想是梯度下降法,利用梯度搜索技术,以期使网络的实际输出值和期望输出值的误差均方差为最小。
BP神经网络的计算过程由正向计算过程和反向计算过程组成。正向传播过程,输入模式从输入层经隐单元层逐层处理,并转向输出层,每~层神经元的状态只影响下一层神经元的状态。如果在输出层不能得到期望的输出,则转入反向传播,将误差信号沿原来的连接通路返回,通过修改各神经元的权值,使得误差信号最小。
(以上来自百度百科)

参考

这次主要学习了《Python神经网络编程》塔里克·拉希德 著,林赐 翻译这本书,这本书写得非常不错,讲得很简单很好理解,对初学者非常友好。下面的代码也是根据书中给的源码略作修改的。
话不多说下面正式开始。

获取测试训练集

MNIST 是一个有名计算机视觉数据库,我们就用它来做我们的数据集。
MNIST 的官网是 http://yann.lecun.com/exdb/mnist/ 。
在这里插入图片描述
这几个文件分别是
测试集图像:train-images.idx3-ubyte
测试集标签:train-labels.idx1-ubyte
训练集图像:t10k-images.idx3-ubyte
训练集标签:t10k-labels.idx1-ubyte

图像集里面的其实并不是一张张图片,而是一大堆数组,每一行有784个0~255像素值组成的数组,代表一个数字图像。所以使用的时候需要读取图像集中的一行数组,对应的标签集里面同一行的数字就是这图像所代表的数字。

我是参考这位老哥的博客的代码(https://blog.csdn.net/weixin_40522523/article/details/82823812 ),具体如下,如果有不明白的,他的博客中已经解释得非常清楚,就不赘述了。

import numpy as np
#读取图片文件
def read_image(path):
    with open(path, 'rb') as f:
        magic, num, rows, cols = unpack('>4I', f.read(16))
        img = np.fromfile(f, dtype=np.uint8).reshape(num, 784)
    return img

#读取标签文件
def read_label(path):
    with open(path, 'rb') as f:
        magic, num = unpack('>2I', f.read(8))
        lab = np.fromfile(f, dtype=np.uint8)
    return lab

#调用例子  
img=read_image(
        "C:\\t10k-images-idx3-ubyte\\"
        "t10k-images.idx3-ubyte")
label = read_label(
        "C:\\t10k-labels-idx1-ubyte\\"
        "t10k-labels.idx1-ubyte")

建立网络

接下来我们建立一个三层的bp神经网络用于训练我们的数据,当然这个网络也可以用于其他地方,只要修改隐藏层数、节点数等参数就可以了。
首先需要给出初始权重,我用的是均值为0,标准方差为输入节点数目的开方的正态分布,然后就是一个根据误差不断修正链接权重的过程。
修正j,k节点之间权重公式:
Δ w j , k = α ∗ E k ∗ s i g m o i d ( O k ) ∗ ( 1 − s i g m o i d ( O k ) ) ⋅ O j T

评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值