问题描述:
( 1)已知用一个 2 层的 NN 可实现逻辑 XOR 运算(异或运算)。试构造一个实现
XOR 运算的 NN,给出模型结构和各个权值与阀值。
(2)奇偶检验问题可视为 XOR 问题的推广(由 2 输入到 n 输入的推广):若 n 个输入中有奇数个1,则输出为 1;若n个输入中有偶数个1,则输出为 0。一个 2 层的 NN 可实现奇偶检验运算。
( 3) 试用 C 语言编程实现多层前向 NN 的 BP 算法。要求:输入、输出结点数目,隐层数目,及各隐层中结点的数目应为任意整数。
( 4) 试用所编出的 BP 算法程序训练出一个实现 XOR 运算的 2 层前向网络。
( 5) 用所编出的 BP 算法程序训练出输入矢量的维数分别为 n=7和 n=8的两个实现奇偶检验运算的 2 层前向 NN。
求解思路:
先用 C语言编程实现多层前向 NN 的 BP 算法,再将误差保存至文本文件,最后用MATLAB绘图显示。其源代码已提交至github。
问题求解:
(1)用C语言编程实现前向NN的BP算法
解:
(1.1)开发思路
本文选用2层神经网络,包括隐含层1层,输出层1层,来设计BP神经网络。
本文隐含层和输出层的激活函数选用Sigmoid函数,
其函数曲线如下所示:
由奇偶检验问题的定义:
可定义如下分类函数:
其中y为BP神经网络的输出值,Y为分类结果。
(1.2)运行流程
本文的多层前向 NN 的 BP 算法用C 语言编程实现,最后将运行结果保存成数据文件,通过MATLAB绘图显示,其运行流程图如上图所示。。
(1.3)参数设定
输入、输出结点数目,隐层数目,及各隐层中结点的数目应为任意整数,通过宏定义改变相应的值,具体修改方式见《NeuralNetBP.h》文件,在程序运行之前,需要跳转到该文件修改具体的取值。
(
2)用所编出的
BP 算法程序训练出一个实现
XOR 运算的 2 层前向网络。
解:
利用(1)中BP 算法程序训练出XOR 运算的 2 层前向网络。
(2.1)参数设定
首先进入《NeuralNetBP.h》文件通过宏定义改变相应的值,包括输入、输出结点数目,隐层数目,及各隐层中结点的数目。
//XOR2#define IN_COUT 2//输入向量维数#define OUT_COUT 1//输出向量维数#define IMPLY_NUM1//隐含层层数
#define SampleTrain4//训练样本数量#define SampleTest4//测试样本数量
#define NN_ImplyCout3//隐含层节点数#define NN_Rate0.4//学习速率#define NN_Error0.001//精度控制参数#define NN_LOOP100000//最大循环次数
(2.1)程序训练结果
对所有样本进行训练,取隐含层节点数为3,运行结果如下:
BP神经网络的学习曲线如下:
可以看出BP神经网络的误差很快收敛至0。
为了测试BP神经网络的有效性,取10次运算的平均值,其正确率如下图所示:
定义正确率:
其中,A为正确率,n=测试值和真实值相等的数量,N为参与测试的样本数量。
由上图可以看出,10次测试的正确率都是A=1,有理由相信,BP神经网络所训练出来的参数是正确的。
(2.3)XOR运算
使用2层BP神经网络,NN的取隐含层节点数为3,示意图如下所示:
两层神经网络实现逻辑异或运算(XOR)的真值表如下所示:
计算公式如下:
经过28582次迭代后,可求得其权值取值如下:
(
3)用所编出的
BP 算法程序训练出输入矢量的维数分别为
n=7和 n=8的两个实现奇偶检验运算(即如题
2.(2)所述)的 2 层前向 NN。
解:
n=7和 n=8的两个实现奇偶检验运算的
2 层前向 NN,完全相同,本文以n=7为例进行说明。
(3.1)参数设定
首先进入《NeuralNetBP.h》文件通过宏定义改变相应的值,包括输入、输出结点数目,隐层数目,及各隐层中结点的数目。
//XOR7#define IN_COUT7//输入向量维数#define OUT_COUT1//输出向量维数#define IMPLY_NUM1//隐含层层数
#define SampleTrain128//训练样本数量 用0-127共128组数据全部参加训练#define SampleTest128//测试样本数量 用0-127共128组数据全部参加测试
#define NN_ImplyCout25//隐含层节点数#define NN_Rate0.4//学习速率#define NN_Error0.001//精度控制参数#define NN_LOOP100000//最大循环次数
(3.2)程序训练结果
7位2进制数数,共有128个样本,对所有样本进行训练,取隐含层节点数为25,运行结果如下:
经过85857次迭代学习后,收敛至指定误差范围内。
全部样本参加测试,所有的样本的输出值都能完全和真值吻合,正确率为1。
BP神经网络的学习曲线如下:
可以看出BP神经网络的误差很快收敛至0。
为了测试BP神经网络的有效性,取10次运算的平均值,其正确率如下图所示:
由上图可以看出,10次测试的正确率均值为0.967,有理由相信,BP神经网络所训练出来的参数是正确的。