初探神经网络:QT下建立BP网络模型

zhennang 2012-03-11

环境:

主机:WIN7

开发环境:Qt

实现功能:

建立了细胞类以及BP网络类.BP神经网络为3层结构:输入层,隐藏层,输出层.

说明:

1.细胞模型

初探神经网络:QT下建立BP网络模型

2.BP网络模型

初探神经网络:QT下建立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网络类头文件

  1. #ifndef PUBLIC_H   
  2. #define PUBLIC_H   
  3.   
  4. //头文件   
  5. #include <QWidget>   
  6. #include "qdebug.h"   
  7. #include "QFile"   
  8.   
  9. #include "math.h"   
  10. #include <time.h>   
  11.   
  12. //宏定义   
  13.   
  14. //全局变量   
  15.   
  16. //数据结构   
  17. //细胞   
  18. class _Cell  
  19. {  
  20. private:  
  21.     //输入数   
  22.     int num_in;  
  23.     //输出数   
  24.     int num_out;  
  25.     //输入   
  26.     double *pt_in;  
  27.     //输出   
  28.     double *pt_out;  
  29.     //输出,不加权   
  30.     double out_no_w;  
  31.     //权   
  32.     double *pt_w;  
  33.     //阈值   
  34.     double threshold;  
  35.     //传递函数类型   
  36.     int type_fun;  
  37.     //传递函数   
  38.     double fun(double x);  
  39. public:  
  40.     //初始化   
  41.     //num1:输入数   
  42.     //num2:输出数   
  43.     _Cell(int num1 = 0,int num2 = 0);  
  44.     //设置输入数   
  45.     void set_in_num(int num);  
  46.     //设置输出数   
  47.     void set_out_num(int num);  
  48.     //返回输入数   
  49.     int return_in_num();  
  50.     //返回输出数   
  51.     int return_out_num();  
  52.     //返回权值   
  53.     //num:指向的目标细胞   
  54.     double return_w(int num);  
  55.     //返回当前阈值   
  56.     double return_threshold();  
  57.     //返回输入   
  58.     //num为第num个输入   
  59.     double return_in(int num);  
  60.     //设置输入   
  61.     void set_in(double a,int num);  
  62.     //设置阈值   
  63.     void set_threshold(double a);  
  64.     //设置权   
  65.     void set_w(double a,int num);  
  66.     //设置传递函数类型   
  67.     void set_fun(int num);  
  68.     //计算输出   
  69.     void calc();  
  70.     //返回输出   
  71.     double output(int num);  
  72.     //返回输出不加权   
  73.     double output_no_w();  
  74. };  
  75.   
  76. //BP网络   
  77. class _BP_Net  
  78. {  
  79. private:  
  80.     //输入层细胞数   
  81.     int num_in_layer;  
  82.     //隐藏层细胞数   
  83.     int num_hide_layer;  
  84.     //输出层细胞数   
  85.     int num_out_layer;  
  86.     //输入层细胞指针   
  87.     _Cell *pt_in_layer_cell;  
  88.     //隐藏层细胞指针   
  89.     _Cell *pt_hide_layer_cell;  
  90.     //输出层细胞指针   
  91.     _Cell *pt_out_layer_cell;  
  92.     //学习速率   
  93.     double g;  
  94. public:  
  95.     //初始化   
  96.     _BP_Net(int num_in = 0,int num_hide = 0,int num_out = 0);  
  97.     //设置输入层细胞数   
  98.     void set_num_in_layer(int num);  
  99.     //设置隐藏层细胞数   
  100.     void set_num_hide_layer(int num);  
  101.     //设置输出层细胞数   
  102.     void set_num_out_layer(int num);  
  103.     //返回输入层细胞数   
  104.     int return_num_in_layer();  
  105.     //返回隐藏层细胞数   
  106.     int return_num_hide_layer();  
  107.     //返回输出层细胞数   
  108.     int return_num_out_layer();  
  109.     //返回权值   
  110.     //i:层号,0输入层,1隐藏层,2输出层   
  111.     //j:本层细胞号   
  112.     //k:下一层细胞号   
  113.     //失败返回-1   
  114.     double return_w(int i,int j,int k);  
  115.     //返回阈值   
  116.     //i:层号,0输入层,1隐藏层,2输出层   
  117.     //j:本层细胞号   
  118.     //失败返回-1   
  119.     double return_threshold(int i,int j);  
  120.     //产生随机的权值,-1-1之间   
  121.     void set_rand_w();  
  122.     //产生随机的阈值,-1-1之间   
  123.     void set_rand_threshold();  
  124.     //设置输入层权值   
  125.     //a:权值,i:细胞号,j:细胞对应输出   
  126.     void set_in_layer_w(double a,int i,int j);  
  127.     //设置隐藏层权值   
  128.     //a:权值,i:细胞号,j:细胞对应输出   
  129.     void set_hide_layer_w(double a,int i,int j);  
  130.     //设置隐藏层阈值   
  131.     //a:阈值,num:细胞号   
  132.     void set_hide_layer_threshold(double a,int num);  
  133.     //设置输出层阈值   
  134.     //a:阈值,num:细胞号   
  135.     void set_out_layer_threshold(double a,int num);  
  136.     //设置学习速率   
  137.     void set_g(double a);  
  138.     //学习   
  139.     //right为正确的值数组   
  140.     void study(double *right);  
  141.     //计算输出   
  142.     void calc();  
  143.     //返回输出   
  144.     double output(int num);  
  145.     //设置���入层细胞输入   
  146.     void set_in(double a,int num);  
  147. };  
  148.   
  149. //全局函数   
  150. //初始化   
  151. //归一化函数   
  152. //dst:目标数据   
  153. //min:最小值   
  154. //max:最大值   
  155. double mapminmax(double dst,double min,double max);  
  156. //反归一化   
  157. //dst:目标数据   
  158. //min:最小值   
  159. //max:最大值   
  160. double premapminmax(double dst,double min,double max);  
  161. //加载权值   
  162. //dir:目录,bp_net:神经网络   
  163. //成功返回1,失败返回-1   
  164. int load_w(QString dir,_BP_Net *bp_net);  
  165. //加载阈值   
  166. //dir:目录,bp_net:神经网络   
  167. //成功返回1,失败返回-1   
  168. int load_threshold(QString dir,_BP_Net *bp_net);  
  169. //写入权值   
  170. //dir:目录,bp_net:神经网络   
  171. //成功返回1,失败返回-1   
  172. int write_w(QString dir,_BP_Net *bp_net);  
  173. //写入阈值   
  174. //dir:目录,bp_net:神经网络   
  175. //成功返回1,失败返回-1   
  176. int write_threshold(QString dir,_BP_Net *bp_net);  
  177. //读取正确的值,并且学习   
  178. //dir:目录,bp_net:神经网络   
  179. //成功返回1,失败返回-1   
  180. int study(QString dir,_BP_Net *bp_net);  
  181.   
  182. #endif // PUBLIC_H  

相关推荐

ganyouxianjava / 0评论 2012-05-31