资源简介

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

评论

共有 条评论