因为课程要求需要做个神经网络的大作业,就顺便记录下来
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