《注》遺傳演算法部分使用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神經網路拓撲結構包含有...