资源简介
BP三层神经网络实现C++代码注释详细
代码片段和文件信息
//BP
//1.计算各层输出
//2.计算纠偏责任
//3.反向调整权值和偏置值
#include
#include
#include
#define N 100100 //训练数据数+测试数据数
using namespace std;
double outputErr(double o double t) { //计算输出层神经元纠偏职责
double e1 = o*(1 - o)*(t - o);
return e1;
}
double hideErr(double r1 double r2 double w1 double w2 double h) { //计算隐藏层神经元纠偏职责
double temp = (r1*w1 + r2 * w2)*(1 - h)*h;
return temp;
}
double updateWeight(double w double lr double h double responsibility) { //更新权值
double temp = (w + lr * responsibility * h);
return temp;
}
double sigmoid(double x) { //激活函数sigmoid
x = -x;
double temp = (1 / (1 + exp(x)));
return temp;
}
double calculation(double h1 double h2 double w1 double w2 double b1 double b2) { //计算神经元实际输出
double temp = sigmoid(h1*w1 + h2*w2 + b1 + b2);
return temp;
}
int main() {
static double x[N - 100][2]; //训练集
static double y[N - 100]; //训练集
//初始化训练数据
for (int i = 0; i < N - 100; i++) {
x[i][0] = rand() % 100 / (double)101;
x[i][1] = rand() % 100 / (double)101;
if ((x[i][0] + x[i][1]) > 1) { //x1+x2>1将预期输出置为1
y[i] = 1;
}
else
y[i] = 0;
}
double lr = 0.1; // 学习效率(步长)
//权重
double w1[6] = { 1-1-1110.5 }; //第一层的4个权重
double w2[6] = { -11-1110.5 }; //第二层的4个权重
double w3[3] = { 1-1 1 }; //输出层2个权重
//责任
double r1[2]; //第一层神经元纠偏职责
double r2[2]; //第二层神经元纠偏职责
double r3; //输出层神经元纠偏职责
//实际输出
double o1[2]; //第一层神经元实际输出
double o2[2]; //第二层神经元实际输出
double o3; //输出层神经元实际输出
double trueNumber = 0; //统计训练后,准确率
for (int i = 0; i < N - 100; i++) {
//计算隐藏层第一层实际输出
o1[0] = calculation(x[i][0] x[i][1] w1[0] w1[2] w1[4] 0);
o1[1] = calculation(x[i][0] x[i][1] w1[1] w1[3] 0 w1[5]);
//计算隐藏层第二层实际输出
o2[0] = calculation(o1[0] o1[1] w2[0] w2[2] w2[4] 0);
o2[1] = calculation(o1[0] o1[1] w2[1] w2[3] 0 w2[5]);
//计算输出层实际输出
o3 = calculation(o2[0] o2[1] w3[0] w3[1] w3[2] 0);
//计算输出层纠偏责任
r3 = outputErr(o3 y[i]);
//计算隐藏层纠偏责任
r2[0] = hideErr(r3 0 w3[0] 0 o2[0]);
r2[1] = hideErr(r3 0 w3[1] 0 o2[1]);
r1[0] = hideErr(r2[0] r2[1] w2[0] w2[1] o1[0]);
r1[1] = hideErr(r2[0] r2[1] w2[2] w2[3] o1[1]);
//更新权值
w3[0] = updateWeight(w3[0] lr o2[0] r3);
w3[1] = updateWeight(w
- 上一篇:多线程的鼠标连点器.cpp
- 下一篇:简单日历c语言代码,简单易懂。
相关资源
- Forstner点特征提取源文件,C++版本
- C 语言编译器源码
- 《信息学奥赛课课通C++》49375-00配套资
- UE4C++写入CSV文件.docx
- 学生选修课系统设计.rar
- 模拟ATM机存取款管理设计.rar
- 用C++写的简单的表白小程序.zip
- C++内存泄漏演示程序
- C++实现Jacbio和SOR迭代
- c++常用库函数速查手册(中文)
- 数据结构课设——作业管理系统
- c++图书管理系统286223
- c++小区物业管理系统
- c++ point 类
- libpng资源包
- 主存资源的分配与回收
- C++实现文件系统模拟器
- 多聚焦图像融合C++实现
- C++帮助文档
- C++实现数据结构算法
- vc++编写的聊天程序
- 用C++实现简单的扫雷游戏,内含源代
- c++return返回二维数组
- 高质量C C++编程指南
- 基于C++的手写数字识别系统
- C++控制台游戏之--斗地主
- C++遗传算法 解决01背包问题 注释全
- 遗传算法解决TSP问题C++版
- 基于PCL的对点云的排序
- VC++ 网络对战五子棋游戏(服务端+用
评论
共有 条评论