python语言实现多层前向nn的bp算法_多层BP神经网络的C语言实现

问题描述:

( 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神经网络所训练出来的参数是正确的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值