初探神经网络:QT下建立BP网络模型
环境:
主机:WIN7
开发环境:Qt
实现功能:
建立了细胞类以及BP网络类.BP神经网络为3层结构:输入层,隐藏层,输出层.
说明:
1.细胞模型
2.BP网络模型
3.输入层细胞阈值为0,输出层细胞权值为1.
4.隐藏层传递函数为f(x) = 1 / (1 + e(-x))
5.需要载入的权文件名为w.txt,放在运行目录下,格式为每个数字一行.输入顺序为输入层细胞所有权,隐藏层细胞所有权.
6.需要载入的权阈值文件名为threshold.txt,放在运行目录下,格式为每个数字一行.输入顺序为隐藏层细胞所有阈值,输出层细胞所有阈值.
7.供BP网络学习的文件名为study.txt,放在运行目录下,格式为每个数字一行.输入顺序为第1次所有输入层细胞的输入,第1次所有输出层细胞的输出,第2次...
8.权值和阈值可以用提供的随机函数生成,范围是-1至1
源代码:
public.h:细胞及BP网络类头文件
- #ifndef PUBLIC_H
- #define PUBLIC_H
- //头文件
- #include <QWidget>
- #include "qdebug.h"
- #include "QFile"
- #include "math.h"
- #include <time.h>
- //宏定义
- //全局变量
- //数据结构
- //细胞
- class _Cell
- {
- private:
- //输入数
- int num_in;
- //输出数
- int num_out;
- //输入
- double *pt_in;
- //输出
- double *pt_out;
- //输出,不加权
- double out_no_w;
- //权
- double *pt_w;
- //阈值
- double threshold;
- //传递函数类型
- int type_fun;
- //传递函数
- double fun(double x);
- public:
- //初始化
- //num1:输入数
- //num2:输出数
- _Cell(int num1 = 0,int num2 = 0);
- //设置输入数
- void set_in_num(int num);
- //设置输出数
- void set_out_num(int num);
- //返回输入数
- int return_in_num();
- //返回输出数
- int return_out_num();
- //返回权值
- //num:指向的目标细胞
- double return_w(int num);
- //返回当前阈值
- double return_threshold();
- //返回输入
- //num为第num个输入
- double return_in(int num);
- //设置输入
- void set_in(double a,int num);
- //设置阈值
- void set_threshold(double a);
- //设置权
- void set_w(double a,int num);
- //设置传递函数类型
- void set_fun(int num);
- //计算输出
- void calc();
- //返回输出
- double output(int num);
- //返回输出不加权
- double output_no_w();
- };
- //BP网络
- class _BP_Net
- {
- private:
- //输入层细胞数
- int num_in_layer;
- //隐藏层细胞数
- int num_hide_layer;
- //输出层细胞数
- int num_out_layer;
- //输入层细胞指针
- _Cell *pt_in_layer_cell;
- //隐藏层细胞指针
- _Cell *pt_hide_layer_cell;
- //输出层细胞指针
- _Cell *pt_out_layer_cell;
- //学习速率
- double g;
- public:
- //初始化
- _BP_Net(int num_in = 0,int num_hide = 0,int num_out = 0);
- //设置输入层细胞数
- void set_num_in_layer(int num);
- //设置隐藏层细胞数
- void set_num_hide_layer(int num);
- //设置输出层细胞数
- void set_num_out_layer(int num);
- //返回输入层细胞数
- int return_num_in_layer();
- //返回隐藏层细胞数
- int return_num_hide_layer();
- //返回输出层细胞数
- int return_num_out_layer();
- //返回权值
- //i:层号,0输入层,1隐藏层,2输出层
- //j:本层细胞号
- //k:下一层细胞号
- //失败返回-1
- double return_w(int i,int j,int k);
- //返回阈值
- //i:层号,0输入层,1隐藏层,2输出层
- //j:本层细胞号
- //失败返回-1
- double return_threshold(int i,int j);
- //产生随机的权值,-1-1之间
- void set_rand_w();
- //产生随机的阈值,-1-1之间
- void set_rand_threshold();
- //设置输入层权值
- //a:权值,i:细胞号,j:细胞对应输出
- void set_in_layer_w(double a,int i,int j);
- //设置隐藏层权值
- //a:权值,i:细胞号,j:细胞对应输出
- void set_hide_layer_w(double a,int i,int j);
- //设置隐藏层阈值
- //a:阈值,num:细胞号
- void set_hide_layer_threshold(double a,int num);
- //设置输出层阈值
- //a:阈值,num:细胞号
- void set_out_layer_threshold(double a,int num);
- //设置学习速率
- void set_g(double a);
- //学习
- //right为正确的值数组
- void study(double *right);
- //计算输出
- void calc();
- //返回输出
- double output(int num);
- //设置���入层细胞输入
- void set_in(double a,int num);
- };
- //全局函数
- //初始化
- //归一化函数
- //dst:目标数据
- //min:最小值
- //max:最大值
- double mapminmax(double dst,double min,double max);
- //反归一化
- //dst:目标数据
- //min:最小值
- //max:最大值
- double premapminmax(double dst,double min,double max);
- //加载权值
- //dir:目录,bp_net:神经网络
- //成功返回1,失败返回-1
- int load_w(QString dir,_BP_Net *bp_net);
- //加载阈值
- //dir:目录,bp_net:神经网络
- //成功返回1,失败返回-1
- int load_threshold(QString dir,_BP_Net *bp_net);
- //写入权值
- //dir:目录,bp_net:神经网络
- //成功返回1,失败返回-1
- int write_w(QString dir,_BP_Net *bp_net);
- //写入阈值
- //dir:目录,bp_net:神经网络
- //成功返回1,失败返回-1
- int write_threshold(QString dir,_BP_Net *bp_net);
- //读取正确的值,并且学习
- //dir:目录,bp_net:神经网络
- //成功返回1,失败返回-1
- int study(QString dir,_BP_Net *bp_net);
- #endif // PUBLIC_H
相关推荐
IT之家 2020-03-11
graseed 2020-10-28
zbkyumlei 2020-10-12
SXIAOYI 2020-09-16
jinhao 2020-09-07
impress 2020-08-26
liuqipao 2020-07-07
淡风wisdon大大 2020-06-06
yoohsummer 2020-06-01
chenjia00 2020-05-29
baike 2020-05-19
扭来不叫牛奶 2020-05-08
hxmilyy 2020-05-11
黎豆子 2020-05-07
xiongweiwei00 2020-04-29
Cypress 2020-04-25
冰蝶 2020-04-20