如何用C語言編程實現(xiàn)多層前向BP神經(jīng)網(wǎng)絡,用來解決邏輯 XOR 運算和奇偶檢驗問題_第1頁
如何用C語言編程實現(xiàn)多層前向BP神經(jīng)網(wǎng)絡,用來解決邏輯 XOR 運算和奇偶檢驗問題_第2頁
如何用C語言編程實現(xiàn)多層前向BP神經(jīng)網(wǎng)絡,用來解決邏輯 XOR 運算和奇偶檢驗問題_第3頁
如何用C語言編程實現(xiàn)多層前向BP神經(jīng)網(wǎng)絡,用來解決邏輯 XOR 運算和奇偶檢驗問題_第4頁
如何用C語言編程實現(xiàn)多層前向BP神經(jīng)網(wǎng)絡,用來解決邏輯 XOR 運算和奇偶檢驗問題_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、6.( 1) 試用 C 語言編程實現(xiàn)多層前向 NN 的 BP 算法。要求:輸入、輸出結點數(shù)目,隱層數(shù)目,及各隱層中結點的數(shù)目應為任意整數(shù)。( 2) 試用所編出的 BP 算法程序訓練出一個實現(xiàn) XOR 運算的 2 層前向網(wǎng)絡。( 3) 用所編出的 BP 算法程序訓練出輸入矢量的維數(shù)分別為 n=7和 n=8的兩個實現(xiàn)奇偶檢驗運算(即如題 2.(2)所述)的 2 層前向 NN。注: 對第 6 題的要求:(i) 列表給出訓練收斂后的 NN 權值和所用的迭代次數(shù);(ii) 給出訓練收斂后的訓練誤差和檢驗誤差,及用訓練集和檢驗集做輸入時所得到的正確輸出率;(iii) 給出 NN 的學習曲線(即 E(W(k

2、)隨迭代次數(shù) k 的變化曲線,該結果應是用計算程序計算和打印出來的曲線,而不要是用手畫出的曲線)。(1)用C語言編程實現(xiàn)前向NN的BP算法解:解題思路:先用 C語言編程實現(xiàn)前向 NN 的 BP 算法,再將誤差保存至文本文件,最后用MATLAB繪制出誤差曲線。(1.1)開發(fā)思路奇偶檢驗問題可視為 XOR 問題的推廣(由 2 輸入到 n 輸入的推廣):若 n 個輸入中有奇數(shù)個1,則輸出為 1;若n個輸入中有偶數(shù)個1,則輸出為 0。一個 2 層的 NN 可實現(xiàn)奇偶檢驗運算。本文選用2層神經(jīng)網(wǎng)絡,包括隱含層1層,輸出層1層,來設計BP神經(jīng)網(wǎng)絡。2層神經(jīng)網(wǎng)絡本文隱含層和輸出層的激活函數(shù)選用Sigmoid

3、函數(shù),其函數(shù)曲線如下所示:由奇偶檢驗問題的定義:可定義如下分類函數(shù):其中y為BP神經(jīng)網(wǎng)絡的輸出值,Y為分類結果。(1.2)運行流程本文的多層前向 NN 的 BP 算法用C 語言編程實現(xiàn),最后將運行結果保存成數(shù)據(jù)文件,通過MATLAB繪圖顯示,其運行流程圖如上圖所示,其源代碼見附錄部分。(1.3)參數(shù)設定輸入、輸出結點數(shù)目,隱層數(shù)目,及各隱層中結點的數(shù)目應為任意整數(shù),通過宏定義改變相應的值,具體修改方式見NeuralNetBP.h文件,在程序運行之前,需要跳轉到該文件修改具體的取值。( 2) 試用所編出的 BP 算法程序訓練出一個實現(xiàn) XOR 運算的 2 層前向網(wǎng)絡。解:利用(1)中BP 算法程

4、序訓練出XOR 運算的 2 層前向網(wǎng)絡。(2.1)參數(shù)設定首先進入NeuralNetBP.h文件通過宏定義改變相應的值,包括輸入、輸出結點數(shù)目,隱層數(shù)目,及各隱層中結點的數(shù)目。/XOR2#define IN_COUT2 /輸入向量維數(shù)#define OUT_COUT1 /輸出向量維數(shù)#define IMPLY_NUM1 /隱含層層數(shù)#define SampleTrain 4/訓練樣本數(shù)量 #define SampleTest 4/測試樣本數(shù)量 #define NN_ImplyCout 3/隱含層節(jié)點數(shù)#define NN_Rate0.5/學習速率#define NN_Error 0.001 /

5、精度控制參數(shù)#define NN_LOOP100000 /最大循環(huán)次數(shù)(2.1)程序訓練結果對所有樣本進行訓練,取隱含層節(jié)點數(shù)為3,運行結果如下:BP神經(jīng)網(wǎng)絡的學習曲線如下:可以看出BP神經(jīng)網(wǎng)絡的誤差很快收斂至0。為了測試BP神經(jīng)網(wǎng)絡的有效性,取10次運算的平均值,其正確率如下圖所示:定義正確率:其中,A為正確率,n=測試值和真實值相等的數(shù)量,N為參與測試的樣本數(shù)量。由上圖可以看出,10次測試的正確率都是A=1,有理由相信,BP神經(jīng)網(wǎng)絡所訓練出來的參數(shù)是正確的。(2.3)XOR運算使用2層BP神經(jīng)網(wǎng)絡,NN的取隱含層節(jié)點數(shù)為3,示意圖如下所示:兩層神經(jīng)網(wǎng)絡實現(xiàn)邏輯異或運算(XOR)的真值表如下

6、所示:x1x2y000011101110計算公式如下: 經(jīng)過28582次迭代后,可求得其權值取值如下: ( 3) 用所編出的 BP 算法程序訓練出輸入矢量的維數(shù)分別為 n=7和 n=8的兩個實現(xiàn)奇偶檢驗運算(即如題 2.(2)所述)的 2 層前向 NN。解:n=7和 n=8的兩個實現(xiàn)奇偶檢驗運算的 2 層前向 NN,完全相同,本文以n=7為例進行說明。(3.1)參數(shù)設定首先進入NeuralNetBP.h文件通過宏定義改變相應的值,包括輸入、輸出結點數(shù)目,隱層數(shù)目,及各隱層中結點的數(shù)目。/XOR7#define IN_COUT7 /輸入向量維數(shù)#define OUT_COUT1 /輸出向量維數(shù)#

7、define IMPLY_NUM1 /隱含層層數(shù)#define SampleTrain128/訓練樣本數(shù)量 用0-127共128組數(shù)據(jù)全部參加訓練#define SampleTest128/測試樣本數(shù)量 用0-127共128組數(shù)據(jù)全部參加測試#define NN_ImplyCout25/隱含層節(jié)點數(shù)#define NN_Rate0.4/學習速率#define NN_Error0.001 /精度控制參數(shù)#define NN_LOOP100000 /最大循環(huán)次數(shù)(3.2)程序訓練結果7位2進制數(shù)數(shù),共有128個樣本,對所有樣本進行訓練,取隱含層節(jié)點數(shù)為25,運行結果如下:經(jīng)過85857次迭代學習后

8、,收斂至指定誤差范圍內。全部樣本參加測試,所有的樣本的輸出值都能完全和真值吻合,正確率為1。BP神經(jīng)網(wǎng)絡的學習曲線如下:可以看出BP神經(jīng)網(wǎng)絡的誤差很快收斂至0。為了測試BP神經(jīng)網(wǎng)絡的有效性,取10次運算的平均值,其正確率如下圖所示:定義正確率:其中,A為正確率,n=測試值和真實值相等的數(shù)量,N為參與測試的樣本數(shù)量。由上圖可以看出,10次測試的正確率均值為0.967,有理由相信,BP神經(jīng)網(wǎng)絡所訓練出來的參數(shù)是正確的。附 錄一、"NeuralNetBP.h"/*參數(shù)定義*/#pragma once#ifndef _NEURALNETBP_H#define _NEURALNETB

9、P_H/XOR2/#define IN_COUT2 /輸入向量維數(shù)/#define OUT_COUT1 /輸出向量維數(shù)/#define IMPLY_NUM1 /隱含層層數(shù)/#define SampleTrain4/訓練樣本數(shù)量 用0-127共128組數(shù)據(jù)全部參加訓練/#define SampleTest4/測試樣本數(shù)量 用0-127共128組數(shù)據(jù)全部參加測試/#define NN_ImplyCout4/隱含層節(jié)點數(shù)/#define NN_Rate0.5/學習速率/#define NN_Error0.001 /精度控制參數(shù)/#define NN_LOOP100000 /最大循環(huán)次數(shù)/* 參數(shù)該變

10、量輸入維數(shù)改變時,改變IN_COUT的值即可同時需要修改SampleTrain、SampleTest、NN_ImplyCout的值;本程序?。篠ampleTrain = 2IN_COUTSampleTest = 2IN_COUTNN_ImplyCout = (2-4) * IN_COUT*/XOR7#define IN_COUT7 /輸入向量維數(shù)#define OUT_COUT1 /輸出向量維數(shù)#define IMPLY_NUM1 /隱含層層數(shù)#define SampleTrain128/訓練樣本數(shù)量 用0-127共128組數(shù)據(jù)全部參加訓練#define SampleTest128/測試樣本數(shù)

11、量 用0-127共128組數(shù)據(jù)全部參加測試#define NN_ImplyCout25/隱含層節(jié)點數(shù)#define NN_Rate0.4/學習速率#define NN_Error0.001 /精度控制參數(shù)#define NN_LOOP100000 /最大循環(huán)次數(shù)typedef struct /bp人工神經(jīng)網(wǎng)絡結構int h; /實際使用隱層節(jié)點數(shù)double vIN_COUT50; /隱藏層權矩陣i,隱層節(jié)點最大數(shù)量為50double w50OUT_COUT; /輸出層權矩陣double a; /學習率double b; /精度控制參數(shù)int LoopCout; /最大循環(huán)次數(shù)int Loop

12、Itera; /實際循環(huán)次數(shù)double ErrorNN_LOOP;/誤差 bp_nn;int InitBp(bp_nn *bp); /初始化bp網(wǎng)絡int TrainBp(bp_nn *bp, int xSampleTrainIN_COUT, int ySampleTrainOUT_COUT); /訓練bp網(wǎng)絡,樣本為x,理想輸出為yint UseBp(bp_nn *bp, int InputIN_COUT, double OutputOUT_COUT); /使用bp網(wǎng)絡double TestBp(bp_nn *bp, int xSampleTestIN_COUT, int ySampleT

13、estOUT_COUT);/測試bp網(wǎng)絡#endif二、"NeuralNetBP.cpp"/*BP人工神經(jīng)網(wǎng)絡基本算法C語言實現(xiàn)*/#include <stdlib.h>#include <math.h>#include <stdio.h>#include <time.h>#include "NeuralNetBP.h"/神經(jīng)網(wǎng)絡激活函數(shù)double fnet(double net) double temp=0;/Sigmoid函數(shù)temp= 1.0 / (1 + exp(-net); return tem

14、p;int InitBp(bp_nn *bp) /初始化bp網(wǎng)絡/請輸入隱層節(jié)點數(shù),最大數(shù)為50(*bp).h = NN_ImplyCout;/請輸入學習率(*bp).a = NN_Rate; /(*bp).a為double型數(shù)據(jù),所以必須是lf/請輸入精度控制參數(shù)(*bp).b = NN_Error;/請輸入最大循環(huán)次數(shù)(*bp).LoopCout = NN_LOOP;/產(chǎn)生隨機數(shù)初始化權值矩陣int i, j;srand(unsigned)time(NULL);for (i = 0; i < IN_COUT; i+)for (j = 0; j < (*bp).h; j+)(*b

15、p).vij = rand() / (double)(RAND_MAX);for (i = 0; i < (*bp).h; i+)for (j = 0; j < OUT_COUT; j+)(*bp).wij = rand() / (double)(RAND_MAX);return 1;int TrainBp(bp_nn *bp, int xSampleTrainIN_COUT, int ySampleTrainOUT_COUT) /訓練bp網(wǎng)絡,樣本為x,理想輸出為ydouble f = (*bp).b; /精度控制參數(shù)double a = (*bp).a; /學習率int h =

16、 (*bp).h; /隱層節(jié)點數(shù)double vIN_COUT50, w50OUT_COUT; /權矩陣double ChgH50, ChgOOUT_COUT; /修改量矩陣double O150, O2OUT_COUT; /隱層和輸出層輸出量int LoopCout = (*bp).LoopCout; /最大循環(huán)次數(shù)int i, j, k, n;double temp;for (i = 0; i < IN_COUT; i+) / 復制結構體中的權矩陣 for (j = 0; j < h; j+)vij = (*bp).vij;for (i = 0; i < h; i+)fo

17、r (j = 0; j < OUT_COUT; j+)wij = (*bp).wij;double e = f + 1;for (n = 0; e > f && n < LoopCout; n+) /對每個樣本訓練網(wǎng)絡e = 0;for (i = 0; i < SampleTrain; i+)for (k = 0; k < h; k+) /計算隱層輸出向量temp = 0;for (j = 0; j < IN_COUT; j+)temp = temp + xij * vjk;O1k = fnet(temp);for (k = 0; k <

18、; OUT_COUT; k+) /計算輸出層輸出向量temp = 0;for (j = 0; j < h; j+)temp = temp + O1j * wjk;O2k = fnet(temp);for (j = 0; j < OUT_COUT; j+) /計算輸出層的權修改量 ChgOj = O2j * (1 - O2j) * (yij - O2j);for (j = 0; j < OUT_COUT; j+) /計算輸出誤差e = e + (yij - O2j) * (yij - O2j);for (j = 0; j < h; j+) /計算隱層權修改量temp =

19、0;for (k = 0; k < OUT_COUT; k+)temp = temp + wjk * ChgOk;ChgHj = temp * O1j * (1 - O1j);for (j = 0; j < h; j+) /修改輸出層權矩陣for (k = 0; k < OUT_COUT; k+)wjk = wjk + a * O1j * ChgOk;for (j = 0; j < IN_COUT; j+) /修改隱含層權矩陣for (k = 0; k < h; k+)vjk = vjk + a * xij * ChgHk;(*bp).Errorn = e;/記錄

20、誤差if (n % 10 = 0)printf("循環(huán)次數(shù):%d, 誤差 : %fn",n,e);(*bp).LoopItera = n;/實際循環(huán)次數(shù)printf("總共循環(huán)次數(shù):%dn", n);printf("調整后的隱層權矩陣:n");for (i = 0; i < IN_COUT; i+) for (j = 0; j < h; j+)printf("%f ", vij);printf("n");printf("調整后的輸出層權矩陣:n");for (i

21、= 0; i < h; i+) for (j = 0; j < OUT_COUT; j+)printf("%f ", wij);printf("n");for (i = 0; i < IN_COUT; i+) /把結果復制回結構體 for (j = 0; j < h; j+)(*bp).vij = vij;for (i = 0; i < h; i+)for (j = 0; j < OUT_COUT; j+)(*bp).wij = wij;printf("bp網(wǎng)絡訓練結束!nn");return 1;

22、int UseBp(bp_nn *bp, int InputIN_COUT, double OutputOUT_COUT) /使用bp網(wǎng)絡double O150;double O2OUT_COUT; /O1為隱層輸出,O2為輸出層輸出int i, j;double temp;for (i = 0; i < (*bp).h; i+) temp = 0;for (j = 0; j < IN_COUT; j+)temp += Inputj * (*bp).vji;O1i = fnet(temp);for (i = 0; i < OUT_COUT; i+) temp = 0;for

23、(j = 0; j < (*bp).h; j+)temp += O1j * (*bp).wji;O2i = fnet(temp);/輸出值for (i = 0; i < OUT_COUT; i+)Outputi = O2i;return 1;double TestBp(bp_nn *bp, int xSampleTestIN_COUT, int ySampleTestOUT_COUT) /使用bp網(wǎng)絡int i, j;int InputIN_COUT;double OutputOUT_COUT;/此處的輸出是實際計算輸出 所以為double型int yMeasureSampleTe

24、st;int CorrectN = 0;double Accuracy = 0;/正確率for (i = 0; i < SampleTest; i+)for (j = 0; j < IN_COUT; j+)Inputj = xij;UseBp(bp, Input, Output); /測試bp神經(jīng)網(wǎng)絡子函數(shù)/結果分類if (OutputOUT_COUT - 1 >= 0.5)yMeasurei = 1;elseyMeasurei = 0;if (yiOUT_COUT - 1 = yMeasurei)/真值=測量值CorrectN+;Accuracy=CorrectN * 1.

25、0 / SampleTest;/計算正確率/顯示測試結果printf("n=7 時,BPNN 測試結果為:n");printf(" 測試樣本數(shù):%dn", SampleTest);printf(" 正確樣本數(shù):%dn", CorrectN);printf(" 正確率為 :%fn", Accuracy);printf("nn");return Accuracy;三、"main.cpp"#include <stdlib.h>#include <math.h>#include <stdio.h>#include <time.h>#include <memory.h>#include "NeuralNetBP.h"

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論