遺傳演算法優化BP神經網路前後的對比

2021-10-08 12:49:49 字數 4645 閱讀 1581

《注》遺傳演算法部分使用sheffield工具箱,bp部分是matlab自帶。

1.bp**實現

function err = bpfun(x,p,t,hiddennum,p_test,t_test)

% x為個體初始權值&閾值

% p為訓練樣本輸入

% t為訓練樣本輸出

% hiddennum為隱含層神經元數量

% p_test為測試樣本輸入

% t_test為測試樣本輸出

% err為**樣本誤差

inputnum = size(p,1) %輸入層神經元個數

outputnum = size(t,1) %輸出層神經元個數

% 開始構建網路

net = feedforwardnet(hiddennum);

net = configure(net,p,t);

net.layers.transferfcn = 'longsig';

%設定引數

net.trainparam.epochs = 1000;

net.trainparam.goal = 0.01;

net.trainparam.lr = 0.1;

net.trainparam.show = nan;

w1num = inputnum * hiddennum; %輸入層到隱含層

w2num = outputnum * hiddennum; %隱含層到輸出層

w1 = x(1:w1num) %輸入層到隱含層權值

b1 = x(w1num + 1:w1num + hiddennum); %隱含層神經元閾值

w2 = x(w1num + hiddennum+ 1:w1num + hiddennum + w2num); %隱含層到輸出層權值

b2 = x(w1num + hiddennum+ + w2num + 1:w1num + hiddennum + w2num + outputnum); %輸出層閾值

net.iw = reshape(w1,hiddennum,inputnum);

net.lw = reshape(w2,outputnum,hiddennum);

net.b = reshape(b1,hiddennum,1);

net.b = reshape(b2,outputnum,1);

%訓練net = train(net,p,t);

%測試y = sim(net,p_test);

err = norm(y-t_test);

自認為注釋寫得還比較清楚哈哈哈,csdn上好多大佬講bp還是很清楚的,我也看了好多才搞懂,大家可以去學習一下。

之後就是寫遺傳演算法的主程式,然後兩者對比。

用遺傳演算法進行bp優化還是很簡單的,就是在bp輸出誤差後計算適應度,然後進行交叉變異等操作,檢驗是否滿足終止條件。

畫個簡單的圖就是:

2. 遺傳演算法主函式就很簡單,之前寫過,不嫌棄的可以看一下:

clc

clear

load data

hiddennum = 31; %設定隱含層神經元個數

threshold = [0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1];

inputnum = size(p,1); %輸入層神經元個數

outputnum = size(t,1); %輸出層神經元個數

w1num = inputnum * hiddennum; %輸入層到隱含層權值數

w2num = outputnum * hiddennum; %隱含層到輸出層權值數

n = w1num + hiddennum + w2num +outputnum; %變數數

%設定引數

nind = 40; %種群大小

maxgen = 50; %最大遺傳代數

preci = 10; %個體長度

ggap = 0.95; %代溝

px = 0.7; %交叉概率

pm = 0.01; %變異概率

trace = zeros(n+1,maxgen); %尋優結果的初始值

fieldd = [repmat(preci,1,n);repmat([-0.5;0.5],1,n);repmat([1;0;1;1],1,n)]; %描述區域

chrom = crtbp(nind,preci * n);

%優化gen = 0; %計數器

x = bs2rv(chrom,fieldd); %種群的十進位制轉化

objv = objfun(x,p,t,hiddennum,p_test,t_test);

while gen這裡面涉及到乙個objfun的函式,定義為求解種群中各個個體的目標值

function obj = objfun(x,p,t,hiddennum,p_test,t_test)

[m,n] = size(x);

obj = zeros(m,1);

for i = 1:m

obj(i) = bpfun(x(i,:),p,t,hiddennum,p_test,t_test);

end

3. 進行比較

clc

inputnum = size(p,1) %輸入層神經元個數

outputnum = size(t,1) %輸出層神經元個數

% 開始構建網路

net = feedforwardnet(hiddennum);

net = configure(net,p,t);

net.layers.transferfcn = 'longsig';

%設定引數

net.trainparam.epochs = 1000;

net.trainparam.goal = 0.01;

net.trainparam.lr = 0.1;

%訓練net = train(net,p,t);

%測試disp(['1.使用隨機權值和閾值'])

disp(['測試樣本**結果'])

y1 = sim(net,p_test);

err1 = norm(y-t_test);

err11 = norm(sim(net,p)-t);

disp(['測試樣本的**誤差',num2str(err1)])

disp(['訓練樣本的**誤差'],num2str(err11))

%優化後的權值閾值

inputnum = size(p,1) %輸入層神經元個數

outputnum = size(t,1) %輸出層神經元個數

% 開始構建網路

net = feedforwardnet(hiddennum);

net = configure(net,p,t);

net.layers.transferfcn = 'longsig';

%設定引數

net.trainparam.epochs = 1000;

net.trainparam.goal = 0.01;

net.trainparam.lr = 0.1;

w1num = inputnum * hiddennum; %輸入層到隱含層

w2num = outputnum * hiddennum; %隱含層到輸出層

w1 = x(1:w1num) %輸入層到隱含層權值

b1 = x(w1num + 1:w1num + hiddennum); %隱含層神經元閾值

w2 = x(w1num + hiddennum+ 1:w1num + hiddennum + w2num); %隱含層到輸出層權值

b2 = x(w1num + hiddennum+ + w2num + 1:w1num + hiddennum + w2num + outputnum); %輸出層閾值

net.iw = reshape(w1,hiddennum,inputnum);

net.lw = reshape(w2,outputnum,hiddennum);

net.b = reshape(b1,hiddennum,1);

net.b = reshape(b2,outputnum,1);

%訓練net = train(net,p,t);

%測試disp(['2.使用優化權值和閾值'])

disp(['測試樣本**結果'])

y2 = sim(net,p_test);

err2 = norm(y2-t_test);

err21 = norm(sim(net,p)-t);

disp(['測試樣本的**誤差',num2str(err2)])

disp(['訓練樣本的**誤差'],num2str(err21))

以上,對比試驗基本上就是把上面兩者重複一遍,在遺傳演算法後得到最佳的初始權值與閾值矩陣,通過畫圖或是比較誤差即可得到兩者差別。

基於遺傳演算法的BP神經網路優化

1 前言2 思路與步驟 遺傳演算法優化bp神經網路主要分為三步 bp神經網路結構的確定 遺傳演算法優化權值和閾值 bp神經網路訓練與 2.1 bp神經網路結構的確定 2.2遺傳演算法 基本要素 染色體編碼方式 適應度函式 遺傳操作 執行引數 其中執行引數是遺傳演算法初始化時確定的引數,主要包括 群體...

BP神經網路演算法

bp神經網路是一種基於有監督的學習,使用非線性可導函式作為傳遞函式的前饋神經網路。一 模型 bp神經網路由輸入層 隱含層 輸出層組成。訓練過程分為網路輸入訊號正向傳播和誤差訊號反向傳播,按有監督學習方式進行訓練。1 相鄰層之間結點的連線有乙個權重wij,其值在 1,1 之間 2 每乙個神經單元都有一...

BP神經網路演算法

bp back propagation 神經網路是在1986年被rumelhart與mccelland等科學家提出的概念,正如名字所說,它是一種back propagation型的網路,它將訓練誤差進行逆向傳播,通過前饋的方式不斷修正網路中各神經元的權值,而進行自身學習的。bp神經網路拓撲結構包含有...