BP神经网络是通过反向传播来逐渐修正层之间的权值和每个节点的阈值,可以通过学习率避免走入局部最优解。
#include <stdio.h>
#include <math.h>
#include <assert.h>
#include <iostream>
#include <string.h>
#include <vector>
#include <math.h>
using namespace std;
#define LAYER 3 //三层神经网络
#define NUM 10 //每层的最多节点数
#define A 30.0
#define B 10.0 //A和B是S型函数的参数
#define ITERS 10000 //最大训练次数
#define LR 0.0013 //学习率
#define ERROR 0.1 //单个样本允许的误差
struct Data {
vector<double> x; //输入数据
vector<double> y; //输出数据
};
class BP{
public:
void GetData(const vector<Data>);
void Train();
vector<double> ForeCast(const vector<double>);
private:
void InitNetWork(); //初始化网络
void GetNums(); //获取输入、输出和隐含层节点数
void ForwardTransfer(); //正向传播子过程
void ReverseTransfer(int); //逆向传播子过程
void CalcDelta(int); //计算w和b的调整量
void UpdateNetWork(); //更新权值和阀值
double GetError(int); //计算单个样本的误差
double GetAccu(); //计算所有样本的精度
double Sigmoid(const double); //计算Sigmoid的值
private:
int in_num; //输入层节点数