📄 bp.h
字号:
#pragma once
#include <math.h>
#include <stdlib.h>
#define BIGRND 0x7fffffff
#define ABS(x) (((x) > 0.0) ? (x) : (-(x)))
class AFX_EXT_CLASS CBP
{
private: // 内部变量
int input_n; /* 输入层的神经元个数 */
int hidden_n; /* 隐含层的神经元个数 */
int output_n; /* 输出层的神经元个数 */
double eta; /* 系统参数 */
double momentum; /* 系统参数 */
double *input_units; /* 输入层的神经元 */
double *hidden_units; /* 隐藏层的神经元 */
double *output_units; /* 输出曾的神经元 */
double *target_units; /* 目标向量 */
double *hidden_delta; /* 隐藏层的误差 */
double *output_delta; /* 输出层的误差 */
double **input_weights; /* 输入层到隐藏层的连接权 */
double **hidden_weights; /* 隐藏层到输出曾的连接权 */
double **input_prev_weights; /* 前次输入层导隐藏层权值的改变 */
double **hidden_prev_weights; /* 前次隐藏层导输出层权值的改变 */
private: // 内部函数
/*** 返回0-1的双精度随机数 ***/
double drnd();
/*** 返回-1.0到1.0之间的双精度随机数 ***/
double dpn1();
/*** 作用函数,目前是S型函数 ***/
double squash(double x);
/*** 申请1维双精度实数数组 ***/
double *alloc_1d_dbl(int n);
/*** 申请2维双精度实数数组 ***/
double **alloc_2d_dbl(int m, int n);
/*** 随机初始化权值 ***/
void randomize_weights(double **w, int m, int n);
/*** 0初始化权值 ***/
void zero_weights(double **w, int m, int n);
/*** 设置随机数种子 ***/
void initialize(int seed);
/*** 创建BP网络 ***/
CBP *internal_create(int n_in, int n_hidden, int n_out);
/*** 前向运算 ***/
void layerforward(double *l1, double *l2, double **conn, int n1, int n2);
/*** 输出误差 ***/
void output_error(double *delta, double *target_units, double *output, int nj, double *err);
/*** 隐含层误差 ***/
void hidden_error(double* delta_h, int nh, double *delta_o, int no, double **who, double *hidden, double *err);
/*** 调整权值 ***/
void adjust_weights(double *delta, int ndelta, double *ly, int nly, double** w, double **oldw, double eta, double momentum);
public: // 公共接口
/*** 创建一个BP网络,并初始化权值 ***/
void create(int n_in, int n_hidden, int n_out);
/*** 向神经网络输入输入变量 ***/
void read_input(float * input);
/*** 向神经网络输入目标变量 ***/
void read_target(float * target);
/*** 从神经网络得到结果变量 ***/
void get_output(float * output);
/*** 进行前向运算 ***/
void feedforward(void);
/*** 训练BP网络 ***/
void train(double *eo, double *eh);
/*** 保存BP网络 (二进制)***/
void save_net(char *filename);
/*** 从文件中读取BP网络 (二进制) ***/
void load_net(char *filename);
/*** 输出网络详细信息 ***/
void detail(char * filename);
/*** 释放BP网络所占地内存空间 ***/
void free(void);
public:
CBP(void);
public:
~CBP(void);
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -