u=guiyi';
for i = 1:12
p=u(relieff(1:i),1:38);
p(i+1,:)=u(13,1:38);
t=u(14,1:38);
p_test=u(relieff(1:i),39:51);
p_test(i+1,:)=u(13,39:51);
for xun = 1:2000
net = newff(minmax(p),[9,1],,'trainlm');
net = init(net);
net.trainparam.show = 10;
net.trainparam.epochs = 5000;
net.trainparam.goal = 1.0e-3;
net.trainparam.lr = 0.01;
net.dividefcn = '';
[net,tr] = train(net,p,t);
t1 = sim(net,p_test) % bp神經網路的**結果
f = fuji(14,39:51);
% g = t1(:,38:50);
s = ;
for a = 1:13
s(a) = abs(t1(a) -f(a))/abs(f(a)) %相對誤差
r1(a) = power((f(a) - t1(a))/f(a),2);
endmeans = mean(abs(s));
rms = power(sum(r1)/13,0.5);
result(xun,1:13) = t1;
result(xun,14) = means;
result(xun,15) = rms;
p1=polyfit(f,t1,1);%一次擬合;
yfit=polyval(p1,f);%求擬合後的y值;
mdl = fitlm(f,t1);%求一元線性擬合的引數
r2 = mdl.rsquared.ordinary;%
result(xun,16) = r2;
t2 = sim(net,p) % bp神經網路的**結果
f2 = fuji(14,1:38);
% g = t1(:,38:50);
s2 = ;
for a2 = 1:38
s2(a) = abs(t2(a) -f2(a))/abs(f2(a)) %相對誤差
r2(a) = power((f2(a) - t2(a))/f2(a),2);
endmeans2 = mean(abs(s));
rms2 = power(sum(r1)/38,0.5);
result2(xun,1:38) = t2;
result2(xun,39) = means2;
result2(xun,40) = rms2;
p2=polyfit(f2,t2,1);%一次擬合;
yfit2=polyval(p2,f2);%求擬合後的y值;
mdl2 = fitlm(f2,t2);%求一元線性擬合的引數
r3 = mdl.rsquared.ordinary;%
result(xun,16) = r3;
xunend
end
可得到神經網路擬合曲線圖。
設計 bp 網路的相關函式
1)神經元變換函式:線性變換函式 purelin、對數 s 型變換 函式 logsin、雙曲線正切 s 型變換函式 tansig。
2)bp 網路生成函式newff :它是用來生成bp 神經網路並 進行初始化 , 可以確定網路層數 、每層中的神經元數和變換 函式。 這個函式有六個輸入引數, 分別是:輸入向量的範圍、 網路結構、各層變換函式、訓練演算法函式、學習函式和效能函 數。輸出引數為所生成的 bp 神經網路名 net 。 其語法為:net =newff(pr, [ s1 , s2 …, sn1] , [ tf1, tf2 , …tfn1] , btf, ble, pf) 其中:pr是乙個由每個輸入向量的最大最小值構成的 rx2 矩陣, r 為輸入神經元數目。 si 是第 i 層網路的神經元個數, 網路共有 n1 層。 tfi 是第 i 層網路神經元的變換函式, 預設為 tansig. btf 是 bp 訓練演算法函式, 預設為 trainlm. blf 是學習函式, 預設為 learngdm. pf 是效能函式, 預設為mse. newff 在確定網路結構後會自動呼叫初始化函式 init , 用 預設引數來初始化網路中各個權值和閾值 , 產生乙個可訓練 的前饋網路, 即該函式的返回值 net。 在 matlab 中, 神經網 絡 net 當做物件(object)處理, 其屬性用結構來定義。
3)初始化函式 init :它是對網路的連線權值和閾值進行 初始化。 newff 在建立網路物件的同時, 自動調動初始化函 數, 根據預設的引數對網路進行連線權值和閾值初始化。
4)學習函式:提供多種學習函式, 用來修正權值和閾值。 基本的學習函式有:learngd 、 learngdm。
5)效能函式:它是用來計算網路的輸出誤差 。 為訓練提 供判據, 包括:函式 mae , 計算網路的平均絕對誤差;函式 mse, 計算網路的均方誤差;函式 msereg , 計算均方誤差和權/ 閾值的加權;函式 sse , 計算網路的均方誤差和。
6)訓練函式 train : bp 網路的訓練初始化後, 可對它進行訓練。 在matlab 中訓練網路有兩類模式:逐變模式和批處理模式。 在逐變模 式中, 每輸入乙個學習樣本就根據網路效能指標函式對連線 權值和閾值更新一次。 在批處理模式中, 所有的學習樣本都 學習完成後, 連線權值和閾值才被更新一次。 使用批處理模 式不需要為每一層的連線權值和閾值設定訓練函式, 而只需 為整個網路指定乙個訓練函式, 使用起來相對方便, 而且許 多改進的快速訓練演算法只能採用批處理模式。 訓練網路的函式是 train 按設定的 net.trainfcn 和 net. trainparam 引數來訓練網路, 採用批處理方式進行網路的權值 和閾值修正, 最終達到設定的網路效能指標的要求。
7)bp 訓練演算法函式:它是根據網路的輸入、目標期望輸 出, 對由函式 newff 生成的 bp 網路進行計算, 修正其權值和 閾值, 最終達到設定的網路效能指標的要求。 不同的訓練算 法函式對應不同的訓練演算法, 如 traingd 對應最基本梯度下降 法;traingdm 帶有動量項的梯度下降法;traingdx 帶有採用動量項的自適應算 法;用共軛梯度 法進行訓練 的函式有: traincgf(採用 fletcher -reeves 搜尋技術)、traincgp(採用 polak -ribiers 搜尋技術)、traincgb(採用 powell -beale 搜尋技術); trainbfg 是基於擬牛頓法的訓練函式;trainlm 是用 levenberg - marquardt 數值優化法來實現誤差反傳演算法的。 各演算法的快 慢及記憶體要求依問題的複雜程度、訓練集大小、網路的大小 及誤差要求的不同而有所不同。 一般來講, 對於含有幾百個 權重的網路, levenberg -marquardt 演算法有最快的收斂速度。 該演算法需要大的記憶體, 可通過增大引數 mem -reduc 的值來 減少記憶體的使用量。 需要注意的是:減少記憶體使用量實際是 通過將雅可比矩陣分解為乙個個小的亞矩陣來實現的, 每次 只計算其中乙個亞矩陣, 這勢必增加計算時間, 所以, 如果有 足夠的記憶體, 應該將 mem -reduc 引數設為 1, 即每次都計算 整個雅可比矩陣。 擬牛頓演算法的速度僅次於 levenberg - marquardt 演算法而比共軛梯度法的速度快, 記憶體的需要量也介 於這二者之間。 在共軛梯度法中, traincgb 需要的記憶體數量最 多, 但通常也能最快收斂。 總地來講, 基於共軛梯度法、擬牛 頓演算法和 levenberg-marquardt 法等數值優化演算法的訓練函 數的效率比基於啟發式演算法的 traingd 、traingdm、traingdx 的效 率高。 以上的訓練演算法函式均在網路生成函式 newff 中預先 設定。
8)**函式 sim:可以用來計算網路在給定輸入下的輸 出。
9)繪圖函式 poltperf :可以用來計算網路效能曲線
參考文獻:羅成漢. 基於matlab神經網路工具箱的bp網路實現[j]. 計算機**, 2004, 21(5):109-111.
BP神經網路的應用 分析
bp神經網路在土木工程領域中的應用主要集中在損傷定位和損傷檢測中。結構如果發生損傷,其動力學特性頻率會發生變化,因此使用頻率就能對結構的損傷進行測量。基於 bp 神經網路演算法的土木結構損傷檢測研究這篇 中,建立了一根簡支梁的損傷模型,並對損傷結構的頻率響應進行了分析,並將損傷結構的頻率特性用於訓練...
FPGA 機器學習之BP神經網路2
來個小例子講述一下,過程。apf 是0.9 af是0.1 為什麼用0.9,用0.1 主要是因為1和0.在計算過程中,會有計算隱患 可能遇到0,就計算不下去等情況 a0 1 1.78 a0 2 1.14 也就是第一組資料。輸出a2 0.9 最後我們要進行多次的迭代和優化,優化的呢?就是w1,和w2.使...
FPGA 機器學習之BP神經網路2
來個小例子講述一下,過程。apf 是0.9 af是0.1 為什麼用0.9,用0.1 主要是因為1和0.在計算過程中,會有計算隱患 可能遇到0,就計算不下去等情況 a0 1 1.78 a0 2 1.14 也就是第一組資料。輸出a2 0.9 最後我們要進行多次的迭代和優化,優化的呢?就是w1,和w2.使...