BP神经网络C代码实现

网络结构:2个输入神经元,5个隐层,1个输出神经元

输入和输出:一共6组数据,input1和input2为输入,output1为输出

学习率:0.5

精度控制:0.00001

最大循环次数:1000000

代码如下:

#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <time.h>
#include <windows.h>

#define COUT     6     //样本数量
#define IN_COUT  2      //输入层数量
#define Hid_COUT 5		//隐层数量
#define OUT_COUT 1     //输出层数量

//int Hid_COUT=Hid_COUT;             //隐层节点数
float weight_hidden[IN_COUT*Hid_COUT];    //隐藏层权矩阵,隐层节点最大数量为50
float weight_output[Hid_COUT*OUT_COUT];   //输出层权矩阵
float learnRate=0.5;         //学习率
float accuracy=0.00001;          //精度控制参数
int maxLoopCout=1000000;      //最大循环次数
float ChgH[Hid_COUT], ChgO[OUT_COUT];         //修改量矩阵
float O1[Hid_COUT], O2[OUT_COUT];             //隐层和输出层输出量
int i, j, k;
float temp;
float e=0;
int n;

float fnet(float net) //Sigmoid函数,神经网络激活函数
{
    return 1/(1+exp(-net));
}

int InitBp() //初始化bp网络
{
	int i, j;
    srand((unsigned)time(NULL));		//获得随机数,赋值给各层权值
    for (i = 0; i < IN_COUT; i++) 		//IN_COUT--输入维数(3)
        for (j = 0; j < Hid_COUT; j++)
            weight_hidden[j+10*i] = rand() / (float)(RAND_MAX);
    for (i = 0; i < Hid_COUT; i++)
        for (j = 0; j < OUT_COUT; j++)	//OUT_COUT--输出维数(2)
            weight_output[j+i*10] = rand() / (float)(RAND_MAX);
    return 1;
}

void TrainBp( float input0,float input1, float output0)	//训练bp网络,样本为x,理想输出为y。COUNT-样本数量
{
	for (k= 0; k < Hid_COUT; k++) //计算隐层输出向量
	{
		temp = 0;
		//for (j = 0; j < IN_COUT; j++)		//第i组个样本中的第j个
		//	temp += x[j] * weight_hidden[k+10*j];
		temp += input0 * weight_hidden[k+10*0] + input1 * weight_hidden[k+10*1];
			O1[k] = fnet(temp);			//经过传递函数计算后的隐层输出向量
	}
	for (k = 0; k < OUT_COUT; k++) //计算输出层输出向量
	{
		temp = 0;
		for (j = 0; j < Hid_COUT; j++)
			temp += O1[j] * weight_output[k+j*10];
			O2[k] = fnet(temp);			//经过传递函数计算后的出层输出向量
	}
	for (j = 0; j < OUT_COUT; j++)    //计算输出层的权修改量
		ChgO[j] = O2[j] * (1 - O2[j]) * (output0 - O2[j]);
	for (j = 0; j < OUT_COUT ; j++)   //计算输出误差
	//	e += (y[j] - O2[j]) * (y[j] - O2[j]);
		e += (output0 - O2[j]) * (output0 - O2[j]);
	for (j = 0; j < Hid_COUT; j++)  //计算隐层权修改量
	{
		temp = 0;
		for (k = 0; k < OUT_COUT; k++)
			temp += weight_output[k+j*10] * ChgO[k];
		ChgH[j] = temp * O1[j] * (1 - O1[j]);
	}
	for (j = 0; j < Hid_COUT; j++)           //修改输出层权矩阵
		for (k = 0; k < OUT_COUT; k++)
			weight_output[k+j*10] += learnRate * O1[j] * ChgO[k]; 	//输出层权矩阵
	for (k = 0; k < Hid_COUT; k++)
		{
			//for (j = 0; j < IN_COUT; j++)
			//	weight_hidden[k+10*j] += learnRate * x[j] * ChgH[k]; //隐藏层权矩阵
			weight_hidden[k+10*0] += learnRate * input0 * ChgH[k];
			weight_hidden[k+10*1] += learnRate * input1 * ChgH[k];
		}
}

int UseBp() //使用bp网络
{
    float Input[IN_COUT];
    float O1[50]; //隐层输出
    float O2[OUT_COUT]; //输出层输出
    while (1)  //持续执行,除非中断程序
	{
        printf("请输入%d个数:\n",IN_COUT);
        int i, j;
        for (i = 0; i < IN_COUT; i++)
            scanf("%f", &Input[i]);
        float temp;
        for (i = 0; i < Hid_COUT; i++)
		{
            temp = 0;
            for (j = 0; j < IN_COUT; j++)
                temp += Input[j] * weight_hidden[i+10*j];
            O1[i] = fnet(temp);
        }
        for (i = 0; i < OUT_COUT; i++)
		{
            temp = 0;
            for (j = 0; j < Hid_COUT; j++)
                temp += O1[j] * weight_output[i+j*10];
            O2[i] = fnet(temp);
        }
        printf("结果:   ");
        for (i = 0; i < OUT_COUT; i++)
            printf("%.3f ", O2[i]);
        printf("\n");
    }
    return 1;
}

int main()
{
	float input1[6]= {0.1,0.5,0.9,0.7,  0,0.3};
	float input2[6]= {0.2,0.3,0.6,0.8,0.1,0.2};
	float output1[6]={  0,  1,  1,  1,  0,  1};
	/*float input1[6]= {0.1,0.8,0.3};
	float input2[6]= {0.2,0.5,0.8};
	float output1[6]={  0,  1,  1};*/
	DWORD start,end;
	InitBp(); 

	/****TrainBp******/
	e=accuracy + 1;	//目的是为了让e大于f,能进行下面的循环,并无算法上的意义
	start= GetTickCount();
	for (n = 0; e > accuracy && n < maxLoopCout; n++)  //对每个样本训练网络,当精度符合要求并且n小于最大循环次数时停止
	{
		e = 0;
		for(int ms=0;ms<COUT;ms++)
			TrainBp(input1[ms],input2[ms],output1[ms]);
		if (n % 10 == 0)
			printf("误差 : %f\n", e);			//每训练10次输出一次误差结果
	}
	end= GetTickCount();
	printf("训练时间:%d\n",end-start);
	printf("总共循环次数:%d\n", n);
    printf("bp网络训练结束!\n");
	UseBp();
    return 1;
	/****TrainBp******/
}
时间: 2024-10-03 19:02:42

BP神经网络C代码实现的相关文章

学习日记(2.19 BP神经网络完整代码解读)

BP网络实现手写数字识别代码解读 1.添加偏置 #添加偏置 temp=np.ones([X.shape[0],X.shape[1]+1]) temp[:,0:-1]=X X=temp np.ones()函数 numpy.ones()函数的功能是返回一个全都是1的N维数组,其中shape(用来指定返回数组的大小).dtype(数组元素的类型).order(是否以内存中的C或Fortran连续(行或列)顺序存储多维数据).后两个参数都是可选的,一般只需设定第一个参数. shape[]的功能是: 0查

BP神经网络识别手写数字项目解析及代码

这两天在学习人工神经网络,用传统神经网络结构做了一个识别手写数字的小项目作为练手.点滴收获与思考,想跟大家分享一下,欢迎指教,共同进步. 平常说的BP神经网络指传统的人工神经网络,相比于卷积神经网络(CNN)来说要简单些. 人工神经网络具有复杂模式和进行联想.推理记忆的功能, 它是解决某些传统方法所无法解决的问题的有力工具.目前, 它日益受到重视, 同时其他学科的发展, 为其提供了更大的机会.1986 年, Romelhart 和Mcclelland提出了误差反向传播算法(Error Back

C#实现的bp神经网络并应用于综合评价

由于课程设计选的题目是基于神经网络的综合评价,利用暑假时间用C#实现的bp神经网络.其中用到的_Matrix类是C#实现的矩阵类http://blog.csdn.net/lanqiuchaoren/article/details/37738665.此bp神经网络包含1个隐藏层,其中输入层,隐藏层,输出层个数都可以根据需要更改. 具体bp神经网络代码如下 BP类: using Matrix_Mul; using Excel = Microsoft.Office.Interop.Excel; usi

【机器学习】BP神经网络实现手写数字识别

最近用python写了一个实现手写数字识别的BP神经网络,BP的推导到处都是,但是一动手才知道,会理论推导跟实现它是两回事.关于BP神经网络的实现网上有一些代码,可惜或多或少都有各种问题,在下手写了一份,连带着一些关于性能的分析也写在下面,希望对大家有所帮助. 本博文不含理论推导,如对BP的理论推导感兴趣百度即可,或参考<模式识别>. 一.数据库 程序使用的数据库是mnist手写数字数据库,这个数据库我有两个版本,一个是别人做好的.mat格式,训练数据有60000条,每条是一个784维的向量,

基于BP神经网络的简单字符识别算法自小结(C语言版)

本文均属自己阅读源码的点滴总结,转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email:[email protected] 写在前面的闲话: 自我感觉自己应该不是一个很擅长学习算法的人,过去的一个月时间里因为需要去接触了BP神经网络.在此之前一直都认为算法界的神经网络.蚁群算法.鲁棒控制什么的都是特别高大上的东西,自己也就听听好了,未曾去触碰与了解过.这次和BP神经网络的邂逅,让我初步掌握到,理解透彻算法的基本原理与公式,转为计算机所能识别的代码流,这应该就是所谓的数学和计

BP神经网络原理及C++实战

前一段时间做了一个数字识别的小系统,基于BP神经网络算法的,用MFC做的交互.在实现过程中也试着去找一些源码,总体上来讲,这些源码的可移植性都不好,多数将交互部分和核心算法代码杂糅在一起,这样不仅代码阅读困难,而且重要的是核心算法不具备可移植性.设计模式,设计模式的重要性啊!于是自己将BP神经网络的核心算法用标准C++实现,这样可移植性就有保证的,然后在核心算法上实现基于不同GUI库的交互(MFC,QT)是能很快的搭建好系统的.下面边介绍BP算法的原理(请看<数字图像处理与机器视觉>非常适合做

ECG信号读取,检测QRS,P,T 波(基于小波去噪与检测),基于BP神经网络的身份识别

这学期选了神经网络的课程,最后作业是处理ECG信号,并利用神经网络进行识别. 1  ECG介绍与读取ECG信号 1)ECG介绍  具体ECG背景应用就不介绍了,大家可以参考百度 谷歌.只是简单说下ECG的结构: 一个完整周期的ECG信号有 QRS P T 波组成,不同的人对应不用的波形,同一个人在不同的阶段波形也不同.我们需要根据各个波形的特点,提取出相应的特征,对不同的人进行身份识别. 2)ECG信号读取 首先需要到MIT-BIH数据库中下载ECG信号,具体的下载地址与程序读取内容介绍可以参考

BP神经网络及matlab实现

本文主要内容包括: (1) 介绍神经网络基本原理,(2) AForge.NET实现前向神经网络的方法,(3) Matlab实现前向神经网络的方法 . 第0节.引例  本文以Fisher的Iris数据集作为神经网络程序的测试数据集.Iris数据集可以在http://en.wikipedia.org/wiki/Iris_flower_data_set  找到.这里简要介绍一下Iris数据集: 有一批Iris花,已知这批Iris花可分为3个品种,现需要对其进行分类.不同品种的Iris花的花萼长度.花萼

字符识别OCR研究一(模板匹配&amp;amp;BP神经网络训练)

摘 要 在MATLAB环境下利用USB摄像头採集字符图像.读取一帧保存为图像.然后对读取保存的字符图像,灰度化.二值化,在此基础上做倾斜矫正.对矫正的图像进行滤波平滑处理,然后对字符区域进行提取切割出单个字符.识别方法一是採用模板匹配的方法逐个对字符与预先制作好的字符模板比較,假设结果小于某一阈值则结果就是模板上的字符:二是採用BP神经网络训练.通过训练好的net对待识别字符进行识别.最然后将识别结果通过MATLAB下的串口工具输出51单片机上用液晶显示出来. keyword: 倾斜矫正.字符切