资源简介
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语言代码,简单易懂。
相关资源
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
- c++ 画图(14Qt-XPS)
- c++多边形交并差运算
- VC++基于OpenGL模拟的一个3维空间模型
- c++ 虚拟摄像头
- hook,捕获所有案件,查找所有窗口,
- C语言课设计算器
- c++ 简易贪吃蛇源码
- 高精度加法(c++代码)
- C++调用百度地图案例
- 北京化工大学计算方法(C/C++)讲义
- 基于VC++的SolidWorks二次开发SolidWorks
- c++ 模拟鼠标按键
- OFD编辑器
- Beginning C++17 From Novice to Professional
- C++ STL实现
- opencv手部轮廓识别以及轨迹识别
- 百度C++编码规范
- C++ sql2008 WebServer通讯.docx
- c++ 定时关机程序源码
- 基于VSCode和CMake实现C++开发
- c++语法查询工具
- c++ 账务系统源码
- GBT 28169-2011 嵌入式软件 C语言编码规范
- c++ 猜拳小游戏
- XUnZip Zip解压缩.rar
评论
共有 条评论