神经网络的C语言实现

上传人:小** 文档编号:46848531 上传时间:2021-12-15 格式:DOC 页数:6 大小:57.50KB
返回 下载 相关 举报
神经网络的C语言实现_第1页
第1页 / 共6页
神经网络的C语言实现_第2页
第2页 / 共6页
神经网络的C语言实现_第3页
第3页 / 共6页
点击查看更多>>
资源描述
#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 vIN_COUT50;/隐藏层权矩阵i,隐层节点最大数量为50double w50OUT_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).vij = rand() / (double)(RAND_MAX);for (i = 0; i < (*bp).h; i+)for (j = 0; j < OUT_COUT; j+)(*bp).wij = rand() / (double)(RAND_MAX);return 1;int TrainBp(bp_nn *bp, float xCOUTIN_COUT, int yCOUTOUT_COUT) /训练bp网络,样本为x,理想输出为ydouble f = (*bp).b;/精度控制参数double a = (*bp).a;/ 学习率int h = (*bp).h;/ 隐层节点数double vIN_COUT50, w50OUT_COUT; / 权矩阵double ChgH50, ChgOOUT_COUT; /修改量矩阵double O150, O2OUT_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+)vij = (*bp).vij;for (i = 0; i < h; i+)for (j = 0; j < OUT_COUT; j+) wij = (*bp).wij;double e = f + 1;for (n = 0; e > f && n < LoopCout; n+) / 对每个样本训练网络 e = 0;for (i= 0; i < COUT; i+) for (k= 0; k < h; k+) / 计算隐层输出向量temp = 0;for (j = 0; j < IN_COUT; j+)temp = temp + xij * vjk;O1k = fnet(temp);for (k = 0; k < OUT_COUT; k+) /计算输出层输出向量 temp = 0;for (j = 0; j < h; j+)temp = temp + O1j * wjk;O2k = fnet(temp);for (j = 0; j < OUT_COUT; j+) / 计算输出层的权修改量 ChgOj = O2j * (1 - O2j) * (yij - O2j);for (j = 0; j < OUT_COUT ; j+) / 计算输出误差 e = e + (yij - O2j) * (yij - O2j);for (j = 0; j < h; j+) / 计算隐层权修改量temp = 0;for (k = 0; k < OUT_COUT; k+)temp = temp + wjk * ChgOk;ChgHj = temp * O1j * (1 - O1j);for (j = 0; j < h; j+)/ 修改输出层权矩阵for (k = 0; k < OUT_COUT; k+)wjk = wjk + a * O1j * ChgOk;for (j = 0; j < IN_COUT; j+)for (k = 0; k < h; k+)vjk = vjk + a * xij * ChgHk;if (n % 10 = 0)printf(" 误差 : %fn", e);printf(" 总共循环次数: %dn", n);printf(" 调整后的隐层权矩阵: n");for (i = 0; i < IN_COUT; i+) for (j = 0; j < h; j+)printf("%f ", vij);printf("n");printf(" 调整后的输出层权矩阵: n");for (i = 0; i < h; i+) for (j = 0; j < OUT_COUT; j+)printf("%f ", wij);printf("n");for (i = 0; i < IN_COUT; i+)/ 把结果复制回结构体for (j = 0; j < h; j+)(*bp).vij = vij;for (i = 0; i < h; i+)for (j = 0; j < OUT_COUT; j+)(*bp).wij = wij;printf("bp 网络训练结束! n");return 1;int UseBp(bp_nn *bp) / 使用 bp 网络float InputIN_COUT;double O150;double O2OUT_COUT; 01为隐层输出,02为输出层输出while (1) /持续执行,除非中断程序printf(" 请输入 3 个数: n");int i, j;for (i = 0; i < IN_COUT; i+)scanf("%f", &Inputi);double temp;for (i = 0; i < (*bp).h; i+) temp = 0;for (j = 0; j < IN_COUT; j+)temp += Inputj * (*bp).vji;O1i = fnet(temp);for (i = 0; i < OUT_COUT; i+) temp = 0;for (j = 0; j < (*bp).h; j+)temp += O1j * (*bp).wji;O2i = fnet(temp);printf(" 结果: ");for (i = 0; i < OUT_COUT; i+) printf("%.3f ", O2i);printf("n");return 1;int main()float xCOUTIN_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 yCOUTOUT_COUT = 0,1,0,1,0,1,1,0,1,0,1,0; / 理想输出bp_nn bp;InitBp(&bp);TrainBp(&bp, x, y);UseBp(&bp);/ 初始化 bp 网络结构/ 训练 bp 神经网络/ 测试 bp 神经网络return 1;
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!