歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

初探神經網絡: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網絡類頭文件

  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  
Copyright © Linux教程網 All Rights Reserved