BP神经网络原理分析及c++代码实现(下)

本部分主要是BP神经网络的C++代码部分,在这里简单的介绍下代码的头文件,具体代码的实现以及测试数据,请在csdn资源里下载:

为了方便广大用户的使用,本人将BP神经网络写成了一个BPNNS类,这样用户们可以很方便的将此类潜入到自己的工程当中,此类的具体的使用规则,下面会介绍。

/**************************************************************************** 文件名称:BPNNs.h* 摘 要:BP神经网络* 作 者:黄继昆** 修改记录:*[日期][作者/修改者] [修改原因]*2012.7.14黄继昆添加***************************************************************************/#pragma once#include <stdio.h>#include <math.h>//算法#define traingd0// 基本的梯度下降算法#define traingdm1// 增加动量项的梯度下降算法#define traingdx2// 动量及自适应学习速率的梯度下降算法#define traincgf3// 共轭梯度算法#define trainrp4// 弹性BP算法//使用的传递函数#defineSIGMOID10// sigmoid 函数#definePURLINE11// purelin函数// 神经网络 类型#defineBP12//bp神经网络#defineITEMS13#defineMAXWEIGHT((float)0.3)#defineSCALEWEIGHT((float)32767)typedef float *PFLOAT;typedef PFLOAT VECTOR;typedef PFLOAT *MATRIX;//创建BP神经网络参数结构体typedef struct _NNS_CREACTE{int InputNodes;// 输入层节点数 int HiddenLayers;// 隐层数 int *HiddenNodes;// 各隐层的节点数 int OutputNodes;// 输出层节点数 int Patterns;// 训练实例数}BPNNS_CreateInfo,*pBPNNS_CreateInfo;//训练神经网络参数结构体typedef struct _NNS_TRAIN{int TrainMethod;// 训练中使用的算法int OLTF;// OutputLayerTransferFunc输出层使用的传递函数int HLTF;// HindderLayerTransferFunc隐层使用的传递函数int Iterations;// 训练次数float ErrorLeve;// 误差级别float eta;// 定义学习速率(步长)float alpha;// 定义动量因子(该值在有动量的梯度下降算法当中才有效)}BPNNS_TrainInfo,*pBPNNS_TrainInfo;class CBPNNs{public:CBPNNs(void);public: CBPNNs(BPNNS_CreateInfo CreateInfo);public:~CBPNNs(void);public://构造网络// 为训练数据开辟空间(1)(2)(3)voidVectorAllocate(VECTOR *vector,int nCols);// (1)voidAllocateCols(PFLOAT matrix[],int nRows,int nCols);// (2)voidMatrixAllocate(MATRIX *pmatrix,int nRows,int nCols);// (3)voidMatrixFree(MATRIX matrix,int nRows);// 释放空间boolAlotSize();// 变量分配空间boolFreeMatrix();// 释放开辟好的空间boolInitWeight();// 初始化权值//网络的训练用到的成员函数public:// 计算各层输出boolCaculateLayeoutValue();// 计算每层神经元的输出和计算一般化误差boolCaculateHiddenLayoutValue(int p,int j);// 计算隐层各神经元的输出boolCaculateOutLayerOutputValue(int p,int j);// 计算输出层各神经元的输出public:// 各层权值的确定boolAdjustWeight(int Temp,int q);// 调整权值boolAdjust_BP_OutputWeight(int j);// 调整traingd算法的输出层权值boolAdjust_Bp_HiddenWeight(int j);// 调整traingd算法的隐层权值boolAdjust_IMBP_OutputWeight(int j);// 调整traingdm算法的输出层权值boolAdjust_IMBp_HiddenWeight( int j );// 调整traingdm算法的隐层权值boolAdjust_VLBP_OutputWeight(int j);// 调整traingdx算法的输出层权值boolAdjust_VLBp_HiddenWeight(int j);// 调整traingdx算法的隐层权值boolAdjust_trainrp_OutputWeight(int j,int q);// 调整弹性梯度下降算法的输出层的权值boolAdjust_trainrp_HiddenWeight(int j,int q);// 调整弹性梯度下降算法的yin层的权值boolAdjust_CGBP_OutputWeight(int j,int q);// 调整traincgf算法的输出层权值boolAdjust_CGBp_HiddenWeight(int j,int q);// 调整traincgf算法的隐层权值boolLimitValue_0_1(float *value);// Sigmoid函数输出限幅boolInputTrainData(char* TrainInput);// 输入训练数据boolOutputWeight(char* WeightOutput);// 输出训练权值public://网络的应用用到的成员函数boolGetWeight(char* InputWeight);// 获取权值boolOutputNet(char* NetName);// 输出训练好的网络参数boolGetNet(char* NetName);// 获取训练好的网络参数/*boolTestData();// 开辟空间测试 *///网络的应用public://供外界调用的借口boolCreateBPNNS(BPNNS_CreateInfo CreateInfo);boolTrain(BPNNS_TrainInfo TrainInfo,char* TrainInput,char* WeightOutput,char* NetOutput);boolCalculate(char* TestDate,char* TestResult );// 训练过之后再实际当中应用boolGetNetAndWeight(char* NetName,char* InputWeight);//测试接口boolOutputTrainResult(char* TrainResult);// 输出训练结果public://定义成员变量//网络结构intnInputNodes;// 输入层节点数intnHiddenLayers;// 隐层数int*nHiddenNodes;// 各隐层的节点数intnOutputNodes;// 输出层节//网络训练参数intnPatterns;// 训练实例数intnIterations;// 训练次数float nErrorLevel;// 误差级intnTrainMethod;// 训练算法intnOLTF;// 输出层传递函数intnHLTF;// 隐层使用的传递函数//用来保存网络运行当中所依赖的变量MATRIX out0;// 输入数据 MATRIX *out1;// 隐层输出 MATRIX *delta1;// 输入层->隐层一般化误差 MATRIX *delw1;// 输入层->隐层 前一次训练得到的权值MATRIX *beta1;// 隐层共轭梯度算法因子MATRIX *dk_hidden;// 隐层共轭梯度算法因子MATRIX *deldk_hidden;// 保存上次迭代的算法因子MATRIX *Tempdelw1;// 缓存改变的权值 MATRIX *w1;// 输入层->隐层的权值 MATRIX out2;// 输出层输出 MATRIX delta2;// 隐层->输出层一般化误差MATRIX dk_out;// 共轭梯度下降算法的保存因子MATRIX deldk_out;// 保存上一次算法因子数值MATRIX beta;// 共轭梯度下降算法的保存因子MATRIX delta2Temp;// 记录delta2的前一次的值 MATRIX delw2;// 隐层->输出成前一次训练得到的权值MATRIX Tempdelw2;// 缓存权值 MATRIX w2;// 隐层->输出层的权值 MATRIX target;// 目标函数(BP是有导师的训练)float neta;// 学习速率(步长)float nalpha;// 动量因子intnReportErrors;// 每一百次输出一次误差intJugeError;// 学习速度自适应调节判断过度float errorTemp;// 记录均方误差boolAloatSizeJuge;// 判断是否进行了空间开辟/*本神经网络所有的输入、输出数据都是通过读取二进制文件的形式完成的。*/FILE*fpPattern,// 打开用来训练的txt文件*fpWeightsOut,// 保存训练好的权值*fpNetOut,// 保存构建网络的参数*fpNetInput,// 获取构建好的网络参数*fpNetRead,// 读取之前训练好的网络参数*fpResults,// 保存训练好的结果*fpWeightInput,// 打开训练好的权值*fpTest,// 打开测试数据*fpTestResult;// 输出测试结果};

在这里介绍下供外界调用接口的使用规则,具体实现原理参考本人博客BP神经网络原理分析及c++代码实现(上),同时各个函数都已经有注释。public://供外界调用的借口

bool CreateBPNNS(BPNNS_CreateInfo CreateInfo);

bool Train(BPNNS_TrainInfo TrainInfo,char* TrainInput,char* WeightOutput,char* NetOutput);

bool Calculate(char* TestDate,char* TestResult );

bool GetNetAndWeight(char* NetName,char* InputWeight);

(1) bool CreateBPNNS(BPNNS_CreateInfo CreateInfo);

不要再以任何人说你,因为你不是为任何人而活,你只为自己而活,

BP神经网络原理分析及c++代码实现(下)

相关文章:

你感兴趣的文章:

标签云: