BP神经网络实验报告
实验要求
构造一个三层的BP神经网络,完成手写0-9数字的识别
实验步骤
1. 从网上下载MNIST数据集
从官网上得到的数据集有4个,以IDX3-UBYTE的文件类型保存
- train-images.idx3-ubyte 图片训练集,包含6万个数据图片
- train-labels.idx1-ubyte 标签训练集,对应图片训练集的标签
- t10k-images-idx3-ubyte 图片测试集,包含1万个数据图片
- t10k-labels-idx1-ubyte 标签训练集,对应图片测试集的标签
图片集的文件格式如下
magic number表示数据结构,0x00000803表示类型为unsigned byte,一共有3维。
标签集的文件格式如下
magic number为0x00000801,表示数据为unsigned byte,表示1维。
使用python的处理字节模块struct对这个结构进行解析。官网上特别提醒,数据是以大端的形式保存。
2. 设计神经网络的结构
包含3层,输入层,隐层,输出层。
3. 设计网络的输入和输出
输入层的神经元个数为输入信号的维数(784)。输出层的神经元个数为输出信号的维数,我们采用10维的变量,用10000000000表示结果为0,用010000000000表示结果为1,以此类推。
隐层的个数为30个。这是根据经验公式 m + n + a , m 为 输 入 层 个 数 , n 为 输 出 层 个 数 , a ∈ { 0 , 1 , . . . 10 } \sqrt{m + n} + a, m为输入层个数,n为输出层个数,a\in\{0, 1, ... 10\} m+n+a,m为输入层个数,n为输出层个数,a∈{
0,1,...10}
4. 实现BP网络的错误反传算法,完成神经网络的训练和测试。
BP算法的步骤如下:
第一步:设置变量和参量。初始化输入层与隐层、隐层和输出层之间的权值矩阵V和W,学习速率 η \eta η,权值的初始值选为随机的均匀分布 ( − 2.4 / F , 2.4 / F ) (-2.4/F,2.4/F) (−2.4/F,2.4/F)或 ( − 3 / F , 3 / F ) (-3/\sqrt{F},3/\sqrt{F}) (−3/F,3/F),F为输入端维数。
第二步:输入一个数据样本,得到隐层输入,使用激励函数激活,得到输出层的输入,再使用激活函数计算输出层的输出。
第三步:使用反向传播算法,计算各层神经元权值矩阵和偏置的梯度。
第四步:更新各层的权值矩阵和偏置。
重置二到四步,直到样本训练完。
5. 算法的具体公式
对输入预处理
输入的向量input是28 * 28的矩阵,矩阵的值范围是0-256。将其变为1 * 784的向量,同时进行预处理操作,使其大小在0-1之间。
i n p u t [ i ] = i n p u t [ i ] / 256 input[i] = input[i] / 256 input[i]=input[i]/256
计算隐层输入,输出层输入
h i d d e n _ i n = i n p u t ∗ W M I + B M I hidden\_in = input * W_{MI} + B_{MI} hidden_in=input∗WMI+BMI
f i n a l _ i n = h i d d e n _ o u t ∗ W I P + B I P final\_in = hidden\_out * W_{IP} + B_{IP} final_in=hidden_out∗WIP+BIP
计算隐层输出,输出层输出
使用非线性的激活函数sigmod函数
f ( x ) = 1 1 + e − x f(x) = \frac{1}{1 + e^{-x}} f(x)=1+e−x1
可以计算其导数为(计算梯度时要用到)
f ′ ( x ) = f ( x ) ∗ ( 1 − f ( x ) ) f'(x) = f(x) * (1 - f(x)) f′(x)=f(x)∗(1−f(x))
因此隐层输出为
h i d d e n t _ o u t = s i g m o d ( h i d d e n t _ i n ) hiddent\_out = sigmod(hiddent\_in) hiddent_out=sigmod(hiddent_in)
输出层输出为
o u t p u t = s i g m o d ( f i n a l _ i n ) output = sigmod(final\_in) output=sigmod(final_in)
误差函数
有多种误差函数来衡量学习的好坏,比如交叉熵代价函数和二次代价函数。这里使用后者。单个输入样本的误差为
E = 1 2 ( e x p e c t e d − o u t p u t ) 2 E = \frac{1}{2}(expected - output) ^ 2 E=21(expected−output)2
更新输出层权值矩阵和偏置
更新权值矩阵方法是
W I P = W I P − η ∗ ∂ E ∂ W I P W_{IP} = W_{IP} - \eta * \frac{\partial E}{\partial W_{IP}} WIP=WIP