歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 初探神經網絡:QT下建立BP網絡模型

初探神經網絡:QT下建立BP網絡模型

日期:2017/3/1 10:27:01   编辑:Linux編程

環境:

主機: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. #include <QWidget>
  5. #include "qdebug.h"
  6. #include "QFile"
  7. #include "math.h"
  8. #include <time.h>
  9. //宏定義
  10. //全局變量
  11. //數據結構
  12. //細胞
  13. class _Cell
  14. {
  15. private:
  16. //輸入數
  17. int num_in;
  18. //輸出數
  19. int num_out;
  20. //輸入
  21. double *pt_in;
  22. //輸出
  23. double *pt_out;
  24. //輸出,不加權
  25. double out_no_w;
  26. //權
  27. double *pt_w;
  28. //阈值
  29. double threshold;
  30. //傳遞函數類型
  31. int type_fun;
  32. //傳遞函數
  33. double fun(double x);
  34. public:
  35. //初始化
  36. //num1:輸入數
  37. //num2:輸出數
  38. _Cell(int num1 = 0,int num2 = 0);
  39. //設置輸入數
  40. void set_in_num(int num);
  41. //設置輸出數
  42. void set_out_num(int num);
  43. //返回輸入數
  44. int return_in_num();
  45. //返回輸出數
  46. int return_out_num();
  47. //返回權值
  48. //num:指向的目標細胞
  49. double return_w(int num);
  50. //返回當前阈值
  51. double return_threshold();
  52. //返回輸入
  53. //num為第num個輸入
  54. double return_in(int num);
  55. //設置輸入
  56. void set_in(double a,int num);
  57. //設置阈值
  58. void set_threshold(double a);
  59. //設置權
  60. void set_w(double a,int num);
  61. //設置傳遞函數類型
  62. void set_fun(int num);
  63. //計算輸出
  64. void calc();
  65. //返回輸出
  66. double output(int num);
  67. //返回輸出不加權
  68. double output_no_w();
  69. };
  70. //BP網絡
  71. class _BP_Net
  72. {
  73. private:
  74. //輸入層細胞數
  75. int num_in_layer;
  76. //隱藏層細胞數
  77. int num_hide_layer;
  78. //輸出層細胞數
  79. int num_out_layer;
  80. //輸入層細胞指針
  81. _Cell *pt_in_layer_cell;
  82. //隱藏層細胞指針
  83. _Cell *pt_hide_layer_cell;
  84. //輸出層細胞指針
  85. _Cell *pt_out_layer_cell;
  86. //學習速率
  87. double g;
  88. public:
  89. //初始化
  90. _BP_Net(int num_in = 0,int num_hide = 0,int num_out = 0);
  91. //設置輸入層細胞數
  92. void set_num_in_layer(int num);
  93. //設置隱藏層細胞數
  94. void set_num_hide_layer(int num);
  95. //設置輸出層細胞數
  96. void set_num_out_layer(int num);
  97. //返回輸入層細胞數
  98. int return_num_in_layer();
  99. //返回隱藏層細胞數
  100. int return_num_hide_layer();
  101. //返回輸出層細胞數
  102. int return_num_out_layer();
  103. //返回權值
  104. //i:層號,0輸入層,1隱藏層,2輸出層
  105. //j:本層細胞號
  106. //k:下一層細胞號
  107. //失敗返回-1
  108. double return_w(int i,int j,int k);
  109. //返回阈值
  110. //i:層號,0輸入層,1隱藏層,2輸出層
  111. //j:本層細胞號
  112. //失敗返回-1
  113. double return_threshold(int i,int j);
  114. //產生隨機的權值,-1-1之間
  115. void set_rand_w();
  116. //產生隨機的阈值,-1-1之間
  117. void set_rand_threshold();
  118. //設置輸入層權值
  119. //a:權值,i:細胞號,j:細胞對應輸出
  120. void set_in_layer_w(double a,int i,int j);
  121. //設置隱藏層權值
  122. //a:權值,i:細胞號,j:細胞對應輸出
  123. void set_hide_layer_w(double a,int i,int j);
  124. //設置隱藏層阈值
  125. //a:阈值,num:細胞號
  126. void set_hide_layer_threshold(double a,int num);
  127. //設置輸出層阈值
  128. //a:阈值,num:細胞號
  129. void set_out_layer_threshold(double a,int num);
  130. //設置學習速率
  131. void set_g(double a);
  132. //學習
  133. //right為正確的值數組
  134. void study(double *right);
  135. //計算輸出
  136. void calc();
  137. //返回輸出
  138. double output(int num);
  139. //設置輸入層細胞輸入
  140. void set_in(double a,int num);
  141. };
  142. //全局函數
  143. //初始化
  144. //歸一化函數
  145. //dst:目標數據
  146. //min:最小值
  147. //max:最大值
  148. double mapminmax(double dst,double min,double max);
  149. //反歸一化
  150. //dst:目標數據
  151. //min:最小值
  152. //max:最大值
  153. double premapminmax(double dst,double min,double max);
  154. //加載權值
  155. //dir:目錄,bp_net:神經網絡
  156. //成功返回1,失敗返回-1
  157. int load_w(QString dir,_BP_Net *bp_net);
  158. //加載阈值
  159. //dir:目錄,bp_net:神經網絡
  160. //成功返回1,失敗返回-1
  161. int load_threshold(QString dir,_BP_Net *bp_net);
  162. //寫入權值
  163. //dir:目錄,bp_net:神經網絡
  164. //成功返回1,失敗返回-1
  165. int write_w(QString dir,_BP_Net *bp_net);
  166. //寫入阈值
  167. //dir:目錄,bp_net:神經網絡
  168. //成功返回1,失敗返回-1
  169. int write_threshold(QString dir,_BP_Net *bp_net);
  170. //讀取正確的值,並且學習
  171. //dir:目錄,bp_net:神經網絡
  172. //成功返回1,失敗返回-1
  173. int study(QString dir,_BP_Net *bp_net);
  174. #endif // PUBLIC_H
Copyright © Linux教程網 All Rights Reserved