如何用C语言编程实现多层前向BP神经网络用来解决逻辑XOR运算和奇偶检验问题Word文件下载.docx
- 文档编号:21221317
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:19
- 大小:331.14KB
如何用C语言编程实现多层前向BP神经网络用来解决逻辑XOR运算和奇偶检验问题Word文件下载.docx
《如何用C语言编程实现多层前向BP神经网络用来解决逻辑XOR运算和奇偶检验问题Word文件下载.docx》由会员分享,可在线阅读,更多相关《如何用C语言编程实现多层前向BP神经网络用来解决逻辑XOR运算和奇偶检验问题Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
(2.1)参数设定
首先进入《NeuralNetBP.h》文件通过宏定义改变相应的值,包括输入、输出结点数目,隐层数目,及各隐层中结点的数目。
//XOR2
#defineIN_COUT2//输入向量维数
#defineOUT_COUT1//输出向量维数
#defineIMPLY_NUM1//隐含层层数
#defineSampleTrain4//训练样本数量
#defineSampleTest4//测试样本数量
#defineNN_ImplyCout3//隐含层节点数
#defineNN_Rate0.5//学习速率
#defineNN_Error0.001//精度控制参数
#defineNN_LOOP100000//最大循环次数
(2.1)程序训练结果
对所有样本进行训练,取隐含层节点数为3,运行结果如下:
BP神经网络的学习曲线如下:
可以看出BP神经网络的误差很快收敛至0。
为了测试BP神经网络的有效性,取10次运算的平均值,其正确率如下图所示:
定义正确率:
其中,A为正确率,n=测试值和真实值相等的数量,N为参与测试的样本数量。
由上图可以看出,10次测试的正确率都是A=1,有理由相信,BP神经网络所训练出来的参数是正确的。
(2.3)XOR运算
使用2层BP神经网络,NN的取隐含层节点数为3,示意图如下所示:
两层神经网络实现逻辑异或运算(XOR)的真值表如下所示:
x1
x2
y
1
计算公式如下:
经过28582次迭代后,可求得其权值取值如下:
n=7和n=8的两个实现奇偶检验运算的2层前向NN,完全相同,本文以n=7为例进行说明。
(3.1)参数设定
//XOR7
#defineIN_COUT7//输入向量维数
#defineOUT_COUT1//输出向量维数
#defineIMPLY_NUM1//隐含层层数
#defineSampleTrain128//训练样本数量用0-127共128组数据全部参加训练
#defineSampleTest128//测试样本数量用0-127共128组数据全部参加测试
#defineNN_ImplyCout25//隐含层节点数
#defineNN_Rate0.4//学习速率
#defineNN_Error0.001//精度控制参数
(3.2)程序训练结果
7位2进制数数,共有128个样本,对所有样本进行训练,取隐含层节点数为25,运行结果如下:
经过85857次迭代学习后,收敛至指定误差范围内。
全部样本参加测试,所有的样本的输出值都能完全和真值吻合,正确率为1。
由上图可以看出,10次测试的正确率均值为0.967,有理由相信,BP神经网络所训练出来的参数是正确的。
附录
一、《"
NeuralNetBP.h"
》
/*
参数定义
*/
#pragmaonce
#ifndef_NEURALNETBP_H
#define_NEURALNETBP_H
////XOR2
//#defineIN_COUT2//输入向量维数
//#defineOUT_COUT1//输出向量维数
//#defineIMPLY_NUM1//隐含层层数
//
//#defineSampleTrain4//训练样本数量用0-127共128组数据全部参加训练
//#defineSampleTest4//测试样本数量用0-127共128组数据全部参加测试
//#defineNN_ImplyCout4//隐含层节点数
//#defineNN_Rate0.5//学习速率
//#defineNN_Error0.001//精度控制参数
//#defineNN_LOOP100000//最大循环次数
/*参数该变量
输入维数改变时,改变IN_COUT的值即可
同时需要修改SampleTrain、SampleTest、NN_ImplyCout的值;
本程序取:
SampleTrain=2^IN_COUT
SampleTest=2^IN_COUT
NN_ImplyCout=(2-4)*IN_COUT
typedefstruct{//bp人工神经网络结构
inth;
//实际使用隐层节点数
doublev[IN_COUT][50];
//隐藏层权矩阵i,隐层节点最大数量为50
doublew[50][OUT_COUT];
//输出层权矩阵
doublea;
//学习率
doubleb;
//精度控制参数
intLoopCout;
//最大循环次数
intLoopItera;
//实际循环次数
doubleError[NN_LOOP];
//误差
}bp_nn;
intInitBp(bp_nn*bp);
//初始化bp网络
intTrainBp(bp_nn*bp,intx[SampleTrain][IN_COUT],inty[SampleTrain][OUT_COUT]);
//训练bp网络,样本为x,理想输出为y
intUseBp(bp_nn*bp,intInput[IN_COUT],doubleOutput[OUT_COUT]);
//使用bp网络
doubleTestBp(bp_nn*bp,intx[SampleTest][IN_COUT],inty[SampleTest][OUT_COUT]);
//测试bp网络
#endif
二、《"
NeuralNetBP.cpp"
BP人工神经网络基本算法C语言实现
#include<
stdlib.h>
math.h>
stdio.h>
time.h>
#include"
//神经网络激活函数
doublefnet(doublenet){
doubletemp=0;
//Sigmoid函数
temp=1.0/(1+exp(-net));
returntemp;
}
intInitBp(bp_nn*bp){//初始化bp网络
//请输入隐层节点数,最大数为50
(*bp).h=NN_ImplyCout;
//请输入学习率
(*bp).a=NN_Rate;
//(*bp).a为double型数据,所以必须是lf
//请输入精度控制参数
(*bp).b=NN_Error;
//请输入最大循环次数
(*bp).LoopCout=NN_LOOP;
//产生随机数初始化权值矩阵
inti,j;
srand((unsigned)time(NULL));
for(i=0;
i<
IN_COUT;
i++)
for(j=0;
j<
(*bp).h;
j++)
(*bp).v[i][j]=rand()/(double)(RAND_MAX);
OUT_COUT;
(*bp).w[i][j]=rand()/(double)(RAND_MAX);
return1;
intTrainBp(bp_nn*bp,intx[SampleTrain][IN_COUT],inty[SampleTrain][OUT_COUT])
{
doublef=(*bp).b;
doublea=(*bp).a;
inth=(*bp).h;
//隐层节点数
doublev[IN_COUT][50],w[50][OUT_COUT];
//权矩阵
doubleChgH[50],ChgO[OUT_COUT];
//修改量矩阵
doubleO1[50],O2[OUT_COUT];
//隐层和输出层输出量
intLoopCout=(*bp).LoopCout;
inti,j,k,n;
doubletemp;
i++)//复制结构体中的权矩阵
h;
v[i][j]=(*bp).v[i][j];
w[i][j]=(*bp).w[i][j];
doublee=f+1;
for(n=0;
e>
f&
&
n<
LoopCout;
n++)
{//对每个样本训练网络
e=0;
for(i=0;
SampleTrain;
{
for(k=0;
k<
k++){//计算隐层输出向量
temp=0;
for(j=0;
temp=temp+x[i][j]*v[j][k];
O1[k]=fnet(temp);
}
k++){//计算输出层输出向量
temp=temp+O1[j]*w[j][k];
O2[k]=fnet(temp);
for(j=0;
j++)//计算输出层的权修改量
ChgO[j]=O2[j]*(1-O2[j])*(y[i][j]-O2[j]);
j++)//计算输出误差
e=e+(y[i][j]-O2[j])*(y[i][j]-O2[j]);
j++){//计算隐层权修改量
for(k=0;
k++)
temp=temp+w[j][k]*ChgO[k];
ChgH[j]=temp*O1[j]*(1-O1[j]);
j++)//修改输出层权矩阵
w[j][k]=w[j][k]+a*O1[j]*ChgO[k];
j++)//修改隐含层权矩阵
v[j][k]=v[j][k]+a*x[i][j]*ChgH[k];
}
(*bp).Error[n]=e;
//记录误差
if(n%10==0)
printf("
循环次数:
%d,误差:
%f\n"
n,e);
}
(*bp).LoopItera=n;
//实际循环次数
printf("
总共循环次数:
%d\n"
n);
调整后的隐层权矩阵:
\n"
);
i++){
%f"
v[i][j]);
printf("
调整后的输出层权矩阵:
w[i][j]);
i++)//把结果复制回结构体
(*bp).v[i][j]=v[i][j];
(*bp).w[i][j]=w[i][j];
bp网络训练结束!
\n\n"
intUseBp(bp_nn*bp,intInput[IN_COUT],doubleOutput[OUT_COUT]){//使用bp网络
doubleO1[50];
doubleO2[OUT_COUT];
//O1为隐层输出,O2为输出层输出
temp=0;
temp+=Input[j]*(*bp).v[j][i];
O1[i]=fnet(temp);
temp+=O1[j]*(*bp).w[j][i];
O2[i]=fnet(temp);
//输出值
{
Output[i]=O2[i];
doubleTestBp(bp_nn*bp,intx[SampleTest][IN_COUT],inty[SampleTest][OUT_COUT])
{//使用bp网络
intInput[IN_COUT];
doubleOutput[OUT_COUT];
//此处的输出是实际计算输出所以为double型
intyMeasure[SampleTest];
intCorrectN=0;
doubleAccuracy=0;
//正确率
SampleTest;
Input[j]=x[i][j];
UseBp(bp,Input,Output);
//测试bp神经网络子函数
//结果分类
if(Output[OUT_COUT-1]>
=0.5)
yMeasure[i]=1;
else
yMeasure[i]=0;
if(y[i][OUT_COUT-1]==yMeasure[i])//真值=测量值
CorrectN++;
Accuracy=CorrectN*1.0/SampleTest;
//计算正确率
//显示测试结果
n=7时,BPNN测试结果为:
测试样本数:
SampleTest);
正确样本数:
CorrectN);
正确率为:
%f\n"
Accuracy);
returnAccuracy;
三、《"
main.cpp"
memory.h>
HandleFile.h"
Sample.h"
/*奇偶性判断
若n个输入中有奇数个1,则输出为1;
若n个输入中有偶数个1,则输出为0。
intmain()
intTrainX[SampleTrain][IN_COUT];
intTrainY[SampleTrain][OUT_COUT];
intTestX[SampleTest][IN_COUT];
intTestY[SampleTest][OUT_COUT];
bp_nnbp;
constintTrainTimes=1;
//训练次数
doubleAccuracy[TrainTimes];
//正确率
SampleTrain_Init(TrainX,TrainY);
SampleTest_Init(TestX,TestY);
//InitBp(&
bp);
//初始化bp网络结构
//TrainBp(&
bp,TrainX,TrainY);
//训练bp神经网络
//TestBp(&
bp,TestX,TestY);
//测试bp神经网络
//多次训练取平均值
for(inti=0;
TrainTimes;
i++)
InitBp(&
TrainBp(&
Accuracy[i]=TestBp(&
//保存数据
WriteToFile_Error(&
bp,"
Data\\XOR7_Error.txt"
//保存最后一次的误差
WriteToFile_Accuracy("
Data\\XOR7_Result.txt"
Accuracy,TrainTimes);
//保存所有的运行结果
system("
pause"
(注:
可编辑下载,若有不当之处,请指正,谢谢!
)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 何用 语言 编程 实现 多层 BP 神经网络 用来 解决 逻辑 XOR 运算 奇偶 检验 问题
链接地址:https://www.bdocx.com/doc/21221317.html