環境:
主機: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