. .
6.
( 1) 试用 C 语言编程实现多层前向 NN 的 BP 算法。要求:输入、输出结点数目,隐层数目,及各隐层中结点的数目应为任意整数。
( 2) 试用所编出的 BP 算法程序训练出一个实现 XOR 运算的 2 层前向网络。 ( 3) 用所编出的 BP 算法程序训练出输入矢量的维数分别为 n=7和 n=8的两个实现奇偶检验运算(即如题 2.(2)所述)的 2 层前向 NN。 注: 对第 6 题的要求:
(i) 列表给出训练收敛后的 NN 权值和所用的迭代次数;
(ii) 给出训练收敛后的训练误差和检验误差,及用训练集和检验集做输入时所得到的正确输出率;
(iii) 给出 NN 的学习曲线(即 E(W(k))随迭代次数 k 的变化曲线,该结果应是用计算程序计算和打印出来的曲线,而不要是用手画出的曲线)。
(1)用C语言编程实现前向NN的BP算法 解:
解题思路:先用 C语言编程实现前向 NN 的 BP 算法,再将误差保存至文本文件,最后用MATLAB绘制出误差曲线。
(1.1)开发思路
奇偶检验问题可视为 XOR 问题的推广(由 2 输入到 n 输入的推广):若 n 个输入中有奇数个1,则输出为 1;若n个输入中有偶数个1,则输出为 0。一个 2 层的 NN 可实现奇偶检验运算。
本文选用2层神经网络,包括隐含层1层,输出层1层,来设计BP神经网络。
x11w11w121?112w11x2……?122w12?12y……w12nxnw1nn1?n
2层神经网络
本文隐含层和输出层的激活函数选用Sigmoid函数,
d?1??(s)(1??(s)) ,?(s)??sds1?e其函数曲线如下所示:
. . .
. .
由奇偶检验问题的定义: 可定义如下分类函数:
?1 y>=1/2Y(y)??
0 y<1/2?其中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 #define IMPLY_NUM
#define SampleTrain #define SampleTest
1 //输出向量维数 1 //隐含层层数
4 4
//训练样本数量 //测试样本数量 //隐含层节点数 //学习速率
#define NN_ImplyCout 3 #define NN_Rate #define NN_Error #define NN_LOOP
0.5
0.001 //精度控制参数
100000 //最大循环次数
(2.1)程序训练结果
对所有样本进行训练,取隐含层节点数为3,运行结果如下:
BP神经网络的学习曲线如下:
. . .
. .
可以看出BP神经网络的误差很快收敛至0。
为了测试BP神经网络的有效性,取10次运算的平均值,其正确率如下图所示:
. . .
如何用C语言编程实现多层前向BP神经网络,用来解决逻辑 XOR 运算和奇偶检验问题



