C++实现简单BP神经网络

  • 格式:pdf
  • 大小:100.11 KB
  • 文档页数:6

C++实现简单BP神经⽹络

本⽂实例为⼤家分享了C++实现简单BP神经⽹络的具体代码,供⼤家参考,具体内容如下

实现了⼀个简单的BP神经⽹络

使⽤EasyX图形化显⽰训练过程和训练结果

使⽤了25个样本,⼀共训练了1万次。

该神经⽹络有两个输⼊,⼀个输出端

下图是训练效果,data是训练的输⼊数据,temp代表所在层的输出,target是训练⽬标,右边的⼤图是BP神经⽹络的测试结果。

以下是详细的代码实现,主要还是基本的矩阵运算。

#include

#include

#include

#include

#include

#define uint unsigned short

#define real double

#define threshold (real)(rand() % 99998 + 1) / 100000

// 神经⽹络的层

class layer{

private:

char name[20];

uint row, col;

uint x, y;

real **data;

real *bias;

public:

layer(){

strcpy_s(name, "temp");

row = 1;

col = 3;

x = y = 0;

data = new real*[row];

bias = new real[row];

for (uint i = 0; i < row; i++){

data[i] = new real[col];

bias[i] = threshold;

for (uint j = 0; j < col; j++){

data[i][j] = 1;

}

}

}

layer(FILE *fp){ fscanf_s(fp, "%d %d %d %d %s", &row, &col, &x, &y, name);

data = new real*[row];

bias = new real[row];

for (uint i = 0; i < row; i++){

data[i] = new real[col];

bias[i] = threshold;

for (uint j = 0; j < col; j++){

fscanf_s(fp, "%lf", &data[i][j]);

}

}

}

layer(uint row, uint col){

strcpy_s(name, "temp");

this->row = row;

this->col = col;

this->x = 0;

this->y = 0;

this->data = new real*[row];

this->bias = new real[row];

for (uint i = 0; i < row; i++){

data[i] = new real[col];

bias[i] = threshold;

for (uint j = 0; j < col; j++){

data[i][j] = 1.0f;

}

}

}

layer(const layer &a){

strcpy_s(name, a.name);

row = a.row, col = a.col;

x = a.x, y = a.y;

data = new real*[row];

bias = new real[row];

for (uint i = 0; i < row; i++){

data[i] = new real[col];

bias[i] = a.bias[i];

for (uint j = 0; j < col; j++){

data[i][j] = a.data[i][j];

}

}

}

~layer(){

// 删除原有数据

for (uint i = 0; i < row; i++){

delete[]data[i];

}

delete[]data;

}

layer& operator =(const layer &a){

// 删除原有数据

for (uint i = 0; i < row; i++){

delete[]data[i];

}

delete[]data;

delete[]bias;

// 重新分配空间

strcpy_s(name, a.name);

row = a.row, col = a.col;

x = a.x, y = a.y;

data = new real*[row];

bias = new real[row];

for (uint i = 0; i < row; i++){

data[i] = new real[col];

bias[i] = a.bias[i];

for (uint j = 0; j < col; j++){

data[i][j] = a.data[i][j];

}

}

return *this;

}

layer Transpose() const {

layer arr(col, row);

arr.x = x, arr.y = y;

for (uint i = 0; i < row; i++){

for (uint j = 0; j < col; j++){

arr.data[j][i] = data[i][j]; }

}

return arr;

}

layer sigmoid(){

layer arr(col, row);

arr.x = x, arr.y = y;

for (uint i = 0; i < x.row; i++){

for (uint j = 0; j < x.col; j++){

arr.data[i][j] = 1 / (1 + exp(-data[i][j]));// 1/(1+exp(-z))

}

}

return arr;

}

layer operator *(const layer &b){

layer arr(row, col);

arr.x = x, arr.y = y;

for (uint i = 0; i < row; i++){

for (uint j = 0; j < col; j++){

arr.data[i][j] = data[i][j] * b.data[i][j];

}

}

return arr;

}

layer operator *(const int b){

layer arr(row, col);

arr.x = x, arr.y = y;

for (uint i = 0; i < row; i++){

for (uint j = 0; j < col; j++){

arr.data[i][j] = b * data[i][j];

}

}

return arr;

}

layer matmul(const layer &b){

layer arr(row, b.col);

arr.x = x, arr.y = y;

for (uint k = 0; k < b.col; k++){

for (uint i = 0; i < row; i++){

arr.bias[i] = bias[i];

arr.data[i][k] = 0;

for (uint j = 0; j < col; j++){

arr.data[i][k] += data[i][j] * b.data[j][k];

}

}

}

return arr;

}

layer operator -(const layer &b){

layer arr(row, col);

arr.x = x, arr.y = y;

for (uint i = 0; i < row; i++){

for (uint j = 0; j < col; j++){

arr.data[i][j] = data[i][j] - b.data[i][j];

}

}

return arr;

}

layer operator +(const layer &b){

layer arr(row, col);

arr.x = x, arr.y = y;

for (uint i = 0; i < row; i++){

for (uint j = 0; j < col; j++){

arr.data[i][j] = data[i][j] + b.data[i][j];

}

}

return arr;

}

layer neg(){

layer arr(row, col);

arr.x = x, arr.y = y;

for (uint i = 0; i < row; i++){

for (uint j = 0; j < col; j++){

arr.data[i][j] = -data[i][j];

}

}