爱吧机器人网 » 技术 > 神经网络 > 正文

BP人工神经网络改进算法C语言

BP人工 神经网络 改进 算法 C语言

BP网络接受样本的顺序会对训练结果有较大的影响,基本 算法 比较“偏爱”较后出现的样本,因此,改进 算法 为对整个样本集的训练,用“总效果”去实施对权矩阵的修改,这就能比较好的解决因样本顺序引起的精度问题和训练的抖动。改进后的 算法 如下:

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

#define OUT_COUT 2 //输出向量维数
#define IN_COUT 3 //输入向量维数
#define COUT 6 //样本数量

typedef struct { //bp人工 神经网络 结构
int h; //实际使用隐层数量
double v[IN_COUT][50]; //隐藏层权矩阵i,隐层节点最大数量为100
double w[50][OUT_COUT]; //输出层权矩阵
double a; //学习率
double b; //精度控制参数
int LoopCout; //最大循环次数
} bp_nn;

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

int InitBp(bp_nn *bp) { //初始化bp网络

printf("请输入隐层节点数,最大数为100:n");
scanf("%d", &(*bp).h);

printf("请输入学习率:n");
scanf("%lf", &(*bp).a); //(*bp).a为double型数据,所以必须是lf

printf("请输入精度控制参数:n");
scanf("%lf", &(*bp).b);

printf("请输入最大循环次数:n");
scanf("%d", &(*bp).LoopCout);

int i, 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);
for (i = 0; i < (*bp).h; i++)
for (j = 0; j < OUT_COUT; j++)
(*bp).w[i][j] = rand() / (double)(RAND_MAX);

return 1;
}

int TrainBp(bp_nn *bp, float x[COUT][IN_COUT], int y[COUT][OUT_COUT]) {
//训练bp网络,样本为x,理想输出为y
double f = (*bp).b; //精度控制参数
double a = (*bp).a; //学习率
int h = (*bp).h; //隐层节点数
double v[IN_COUT][50], w[50][OUT_COUT]; //权矩阵
double Ch_v[IN_COUT][50], Ch_w[50][OUT_COUT]; //权矩阵修改量
double ChgH[50], ChgO[OUT_COUT]; //修改量矩阵
double O1[50], O2[OUT_COUT]; //隐层和输出层输出量
int LoopCout = (*bp).LoopCout; //最大循环次数
int i, j, k, n;
double temp;

for (i = 0; i < IN_COUT; i++) // 复制结构体中的权矩阵
for (j = 0; j < h; j++)
v[i][j] = (*bp).v[i][j];
for (i = 0; i < h; i++)
for (j = 0; j < OUT_COUT; j++)
w[i][j] = (*bp).w[i][j];

double e = f + 1;
for (n = 0; e > f && n < LoopCout; n++) { //对每个样本训练网络
e = 0;
for (j = 0; j < OUT_COUT; j++)
ChgO[j] = 0;
for (j = 0; j < h; j++)
ChgH[j] = 0;
for (j = 0; j < h; j++)
for (k = 0; k < OUT_COUT; k++)
Ch_w[j][k] = 0;
for (j = 0; j < IN_COUT; j++)
for (k = 0; k < h; k++)
Ch_v[j][k] = 0;
for (i= 0; i < COUT; i++) {
for (k= 0; k < h; k++) { //计算隐层输出向量
temp = 0;
for (j = 0; j < IN_COUT; j++)
temp = temp + x[i][j] * v[j][k];
O1[k] = fnet(temp);
}
for (k = 0; k < OUT_COUT; k++) { //计算输出层输出向量
temp = 0;
for (j = 0; j < h; j++)
temp = temp + O1[j] * w[j][k];
O2[k] = fnet(temp);
}
for (j = 0; j < OUT_COUT ; j++) //计算输出误差
e = e + (y[i][j] - O2[j]) * (y[i][j] - O2[j]);
for (j = 0; j < OUT_COUT; j++)
ChgO[j] = O2[j] * (1 - O2[j]) * (y[i][j] - O2[j]);
for (j = 0; j < h; j++)
for (k = 0; k < OUT_COUT; k++)
Ch_w[j][k] += a * O1[j] * ChgO[k]; //累加所有样本训练后的改变量
for (j = 0; j < h; j++) {
temp = 0;
for (k = 0; k < OUT_COUT; k++)
temp = temp + w[j][k] * ChgO[k];
ChgH[j] = temp * O1[j] * (1 - O1[j]);
}
for (j = 0; j < IN_COUT; j++)
for (k = 0; k < h; k++)
Ch_v[j][k] += a * x[i][j] * ChgH[k]; //累加所有样本训练后的改变量,消除样本顺序影响
}
for (j = 0; j < h; j++) //修改输出层权矩阵
for (k = 0; k < OUT_COUT; k++)
w[j][k] = w[j][k] + Ch_w[j][k];
for (j = 0; j < IN_COUT; j++) //修改隐藏层权矩阵
for (k = 0; k < h; k++)
v[j][k] = v[j][k] + Ch_v[j][k];
if (n % 10 == 0) {
printf("误差 : %fn", e);
printf("循环次数:%dn", n);
}
}
printf("总共循环次数:%dn", n);
printf("调整后的隐层权矩阵:n");
for (i = 0; i < IN_COUT; i++) {
for (j = 0; j < h; j++)
printf("%f ", v[i][j]);
printf("n");
}
printf("调整后的输出层权矩阵:n");
for (i = 0; i < h; i++) {
for (j = 0; j < OUT_COUT; j++)
printf("%f ", w[i][j]);
printf("n");
}
for (i = 0; i < IN_COUT; i++) //把结果复制回结构体
for (j = 0; j < h; j++)
(*bp).v[i][j] = v[i][j];
for (i = 0; i < h; i++)
for (j = 0; j < OUT_COUT; j++)
(*bp).w[i][j] = w[i][j];
printf("bp网络训练结束!n");

return 1;
}

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

int main()
{
float x[COUT][IN_COUT] = {{0.8,0.5,0},
{0.9,0.7,0.3},
{1,0.8,0.5},
{0,0.2,0.3},
{0.2,0.1,1.3},
{0.2,0.7,0.8}}; //训练样本
int y[COUT][OUT_COUT] = {{0,1},
{0,1},
{0,1},
{1,0},
{1,0},
{1,0}}; //理想输出
bp_nn bp;

InitBp(&bp); //初始化bp网络结构
TrainBp(&bp, x, y); //训练bp 神经网络
UseBp(&bp); //测试bp 神经网络

return 1;
}


上一篇:改进的BP神经网络算法(C语言源码)
下一篇:遗传算法优化BP神经网络权值和阈值的通用MATLAB源码
精选推荐
麻省理工学院最新研究:优化软体机器人的控制和设计
麻省理工学院最新研究:优化软体机器人的控制和设计

[2019-11-24]  软体机器人属于一个新的领域,它可能在诸如外科手术等领域发挥重要作用(手术时的纳米机器人需要在人体内部移动而不损伤软组织)。软体机器 ...

南加州大学机器人学家:机器人更适合粗暴的爱
南加州大学机器人学家:机器人更适合粗暴的爱

[2019-11-07]  图片来自JOHN MADERE GETTY IMAGES打是疼骂是爱,当人类粗暴的将物体从机器人手中敲掉,看似残忍,实际上却能帮助机器人找到最好的握持物 ...

麻省理工又秀神技:推出如魔法般跳跃的方块机器人集群
麻省理工又秀神技:推出如魔法般跳跃的方块机器人集群

[2019-10-31]  几天前,小编向大家介绍过麻省理工(MIT)研发的一种自组装机器人集群(点此阅览),它们可以用统一标准的小单元自动组装出各种大型结构。 ...

哈佛大学《自然》发表新驱动技术,让飞行机器人悬停且不受损伤
哈佛大学《自然》发表新驱动技术,让飞行机器人悬停且不受损伤

[2019-11-06]  哈佛大学研究人员发表在《自然》杂志上的一项最新研究,他们开发了一种由柔软的人造肌肉驱动的机器人蜜蜂(RoboBee),这种机器人在撞墙、 ...

CES 2018:英特尔推出49量子位芯片争夺量子霸权
CES 2018:英特尔推出49量子位芯片争夺量子霸权

[2018-01-10]  在与Google、IBM的一场关于建立量子计算系统的马拉松比赛中,英特尔通过了一个关键的里程碑。近日,这个科技巨头已经推出了一个49个量子位 ...

一个让深度学习惨败的通用人工智能领域——语境处理
一个让深度学习惨败的通用人工智能领域——语境处理

[2019-11-04]  Context是指用来解释一段给定文本或语句的来源框架,我们可以翻译为上下文或语境。维基百科将context定义为:*在符号学、语言学、社会学和 ...

可编辑神经网络,有望简化深度学习?
可编辑神经网络,有望简化深度学习?

[2019-10-04]  深度学习是一个计算繁重的过程。 降低成本一直是 Data curation 的一大挑战。 关于深度学习神经网络大功耗的训练过程,已经有研究人员 ...

瑞士研发出微型机器人集群 可像蚂蚁一样互相交流并协同工作
瑞士研发出微型机器人集群 可像蚂蚁一样互相交流并协同工作

[2019-07-12]  EPFL(瑞士联邦理工学院)的研究人员受到了蚂蚁的启发,开发了一款仅有10克重的小型机器人:他们可以相互交流,分配角色并完成复杂的任务。 ...

本周栏目热点

神经网络:人工智能以及我们的未来

[2016-11-20]   作者:James Crowder翻译:王益军审校:心原文链接:techcrunch把自己想象成在一辆未来的自动驾驶汽车的乘客。这辆汽车与你以一种 ...

[2016-11-20]   include "stdio h" include "stdlib h" include "time h" include "math h" *********************************************i ...

OpenAI开辟全新AI音乐领域,发布Jukebox神经网络生产歌曲

[2020-05-19]  日前,外媒报道,人工智能(AI)技术生成的音乐会给人们带来非常奇妙体验。其中有两大原因,第一,这是一个非常吸引人的全新领域;第二,这 ...

50行代码玩转生成对抗网络GAN模型!(附源码)

[2018-07-30]  本文为大家介绍了生成对抗网络(Generate Adversarial Network,GAN),以最直白的语言来讲解它,最后实现一个简单的 GAN 程序来帮助大家加深理解。...

深度神经网络揭示了大脑喜欢看什么

[2019-11-06]  爱吧机器人网编者按:近日,《自然-神经科学》发表了一篇论文,研究人员创建了一种深度人工神经网络,能够准确预测生物大脑对视觉刺激所产 ...