加入收藏 | 设为首页 | 会员中心 | 我要投稿 南通站长网 (https://www.0513zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

分析神经网络:QT下建立BP网络模型

发布时间:2021-11-23 18:08:19 所属栏目:教程 来源:互联网
导读:环境: 主机:WIN7 开发环境:Qt 实现功能: 建立了细胞类以及BP网络类.BP神经网络为3层结构:输入层,隐藏层,输出层. 说明: 1.细胞模型 2.BP网络模型 3.输入层细胞阈值为0,输出层细胞权值为1. 4.隐藏层传递函数为f(x) = 1 / (1 + e(-x)) 5.需要载入的权文件名

环境:
 
主机: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  

(编辑:南通站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读