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];
}
}