⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bp.h

📁 BP神经网络控件1.0 测试版 欢迎使用和下载
💻 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 + -