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("误差 : %f\n", e);
printf("循环次数:%d\n", n);
}
}
printf("总共循环次数:%d\n", 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语言
来源:互联网 发布日期:2011-12-04 19:30:57 浏览:25488次
导读:BP网络接受样本的顺序会对训练结果有较大的影响,基本算法比较“偏爱”较后出现的样本,因此,改进算法为对整个样本集的训练,用“总效果”去实施对权矩阵的修改,这就能比较好的解决因样本顺序引起的精度问题和训练的抖动。改进后的算法如下:...
相关内容
- 能说会看会行动,OpenAI机器人,一出手就是王炸
- 小i机器人创始人袁辉谈中美AI领域差距
- 英伟达发布新的机器人制造平台,添加生成式AI功能
- 我用AI机器人,20分钟写了份调研报告
- 机器人行业的调研(一)
- AI大模型时代,如何用RAG技术重塑传统智能客服问答机器人?
- 估值26亿美元!人形机器人公司获英伟达、微软、亚马逊投资 与OpenAI合作
- 一大波爆款AI机器人频繁亮相背后:A股人形机器人“四大天王”雏形已现,优必选合作伙伴年报大幅预亏
- 马斯克:AI发展速度前所未见,希望人形机器人“善待”人类
- OpenAI机器人惊艳面世!能对话、能思考、会学习
- OpenAI机器人来了!可与人类全面对话
- Figure首发OpenAI机器人,人形机器人产业进入快速发展期,科技巨头纷纷加速布局
- 炸裂更新!这个最像人类的机器人又进化了,还能模仿马斯克
- 机器人行业多个会议即将举行 人形机器人板块有望迎来催化
- 机器人行业调研-投资篇
- 特斯拉招聘人形机器人 Optimus 用户手册撰写员,明年开始交付
- 全球首个OpenAI机器人诞生!Figure 01碾压马斯克擎天柱,10亿机器人大军正式启动
- 英伟达进军人形机器人产业 发布多模态人工智能Project GR00T
- 特斯拉正开发“私有5G”基站,为电动汽车及人形机器人提供支持
- 基于生成式 AI 技术,汤姆猫正在研发一款语音交互陪伴机器人
AiLab云推荐
最新资讯
本月热点
- 斯坦福家政机器人火了但又翻车了!多数是真人操控编排的
- 斯坦福团队发布新机器人Mobile Aloha,人形机器人将迎来产业元年?
- 我的同事是 GPT-4 机器人,我们在 Slack 上一起工作
- 谷歌起草“机器人宪法”,以确保 AI 机器人不会伤害人类
- 长江电力申请机器人巡检方法及系统专利,提高效率的同时也避免过多机器人参与到任务中造成碰撞风险
- 均普智能:公司会持续对人形机器人领域进行研发投入,当前没有交付丝杠终端产品
- 特斯拉“擎天柱”机器人视频涉嫌造假 马斯克“承认”
- 国际最新研发出人工智能机器人平台 改造蛋白质速度超过人类
- 国盛证券:未来大模型将会赋予机器人更强的能力
- 人形机器人“进厂”颠覆汽车制造?
热门排行
-
斯坦福家政机器人火了但又翻车了!多数是真人操控编排的
阅读量:152042
-
斯坦福团队发布新机器人Mobile Aloha,人形机器人将迎来产业元年?
阅读量:149895
-
我的同事是 GPT-4 机器人,我们在 Slack 上一起工作
阅读量:146367
-
谷歌起草“机器人宪法”,以确保 AI 机器人不会伤害人类
阅读量:142408
-
人形机器人崛起:OpenAI、微软洽谈投资Figure AI,望募资5亿美元
阅读量:86916
-
大疆回应停售青少年教育产品:将资源聚焦在大学生高校机器人赛事
阅读量:52234
推荐内容
- 2024第25届中国兰州国际医疗器械博览会
- 2024第九届中国西安丝绸之路国际旅游博览会
- 2024第27届重庆都市文化旅游节暨城际旅游交易会
- 2024年第25届广西广告展览会
- 2024宁夏(银川)国际广告节
- 2024中国(青岛)国际户外用品暨房车露营装备博览会、2024中国(青岛)国际体育用品、健身器材暨泳池设施装备博览会、第五届新电商产业博览会
- 2024第二十三届中国西部国际广告节
- IBS 2024第十二届生物质能源与有机固废资源化利用高峰论坛
- 2024第二届中国(西安)国际消防技术装备展览会
- 2024长三角国际环保产业展览会
- FEC2024第17届广州国际服装供应链博览会
- 2024第60届沈阳医疗器械展3月28日盛大召开!!!
- 2024第二届成渝经济圈表面工程博览会
- 2024南京充电桩展览会
- 2024第十四届中国(郑州)塑料产业博览会
- 2024HOTELEX第32届上海国际酒店及餐饮业博览会 HOTELEX上海展
- 海名·2024上海火锅食材及用品展览会
- 2024第29届中国(北京)国际美博会
- 2024宁波国际文具展
- 第二十届中国(重庆)国际润滑油、脂、添加剂、养护用品及技术设备展览会
- 2024上海国际酒店工程设计与用品博览会