matlab神經網絡newff函數的用法

轉自:matlab神經網絡newff函數的用法,保存在此以學習。

設[P,T]是訓練樣本,[X,Y]是測試樣本;
net=newrb(P,T,err_goal,spread); %建立網絡
q=sim(net,p);
e=q-T;
plot(p,q); %畫訓練誤差曲線
q=sim(net,X);
e=q-Y;
plot(X,q); %畫測試誤差曲線

訓練前饋網絡的第一步是建立網絡對象。函數newff建立一個可訓練的前饋網絡。這需要4個輸入參數。
第一個參數是一個Rx2的矩陣以定義R個輸入向量的最小值和最大值
第二個參數是一個設定每層神經元個數的數組
第三個參數是包含每層用到的傳遞函數名稱的細胞數組
最後一個參數是用到的訓練函數的名稱
舉個例子,下面命令將創建一個二層網絡。它的輸入是兩個元素的向量,第一層有三個神經元(3),第二層有一個神經元(1)。
第一層的傳遞函數是tan-sigmoid,輸出層的傳遞函數是linear。
輸入向量的第一個元素的範圍是-1到2[-1 2],輸入向量的第二個元素的範圍是0到5[0 5],訓練函數是traingd。

  net=newff([-1 2; 0 5],[3,1],{'tansig','purelin'},'traingd');

這個命令建立了網絡對象並且初始化了網絡權重和偏置,因此網絡就可以進行訓練了。
我們可能要多次重新初始化權重或者進行自定義的初始化。
下面就是初始化的詳細步驟。
  在訓練前饋網絡之前,權重和偏置必須被初始化。初始化權重和偏置的工作用命令init來實現。這個函數接收網絡對象並初始化權重和偏置後返回網絡對象。
下面就是網絡如何初始化的:

  net = init(net);

  我們可以通過設定網絡參數net.initFcn和net.layer{i}.initFcn這一技巧來初始化一個給定的網絡。
net.initFcn用來決定整個網絡的初始化函數。前饋網絡的缺省值爲initlay,它允許每一層用單獨的初始化函數。
設定了net.initFcn ,那麼參數net.layer{i}.initFcn 也要設定用來決定每一層的初始化函數。
  對前饋網絡來說,有兩種不同的初始化方式經常被用到:initwb和initnw。initwb函數根據每一層自己的初始化參數(net.inputWeights{i,j}.initFcn)初始化權重矩陣和偏置。前饋網絡的初始化權重通常設爲rands,它使權重在-1到1之間隨機取值。這種方式經常用在轉換函數是線性函數時。initnw通常用於轉換函數是曲線函數。它根據Nguyen和Widrow[NgWi90]爲層產生初始權重和偏置值,使得每層神經元的活動區域能大致平坦的分佈在輸入空間。
它比起單純的給權重和偏置隨機賦值有以下優點:
(1)減少神經元的浪費(因爲所有神經元的活動區域都在輸入空間內)。
(2)有更快的訓練速度(因爲輸入空間的每個區域都在活動的神經元範圍中)。
  初始化函數被newff所調用。因此當網絡創建時,它根據缺省的參數自動初始化。init不需要單獨的調用。可是我們可能要重新初始化權重和偏置或者進行自定義的初始化。例如,我們用newff創建的網絡,它缺省用initnw來初始化第一層。如果我們想要用rands重新初始化第一層的權重和偏置,我們用以下命令:

  net.layers{1}.initFcn = 'initwb';
  net.inputWeights{1,1}.initFcn = 'rands';
  net.biases{1,1}.initFcn = 'rands';
  net.biases{2,1}.initFcn = 'rands';
  net = init(net);

IW: 輸入層到隱含層的權重矩陣
LW: 隱含層和輸出層間的權重矩陣
b: 閥值向量

如網絡爲net, 輸入層和輸出均爲一個接點情況下,則用
net.IW{1,1}可以看到第一個輸入接點到第一隱含層的權重向量;
net.LW{2,1}可以看到隱含層到輸出層的權值向量;
net.b{1,1}是隱含層的閥值向量,
net.b{2,1}是輸出接點的閥值;

在多輸入輸出下先用
net.IW
net.LW
net.b
查看各矩陣結構,再相應用net.IW{?,?}等語句查到相關的向量

______________________________________________________________________________________________

clear all;
%define the input and output
p= [974 874 527;
388 466 1764;
1316 2439 2251;
1836 2410 1860;
1557 2301 1578;
1490 1877 2749;
1513 1278 2026;
1070 1561 2794;
1347 2415 3306;
1324 2746 1233;
1383 1463 1847;
1282 0 2347];
t=[19797 24282 34548];
% 創建bp網絡和定義訓練函數
% 這裏是爲了方便而建立一個矩陣,注意是12x2,不是3x2
pr=[ 527 974;
388 1764;
1316 2439;
1836 2410;
1557 2301;
1490 2749;
1278 2026;
1070 2794;
1347 3306;
1233 2746;
1383 1847;
0 2347]
net=newff(pr,[15,1],{'tansig' 'purelin'},'trainlm'); %這裏要加入輸出層的轉移函數,一般是trainlm
net.trainparam.goal=50;
net.trainparam.epochs=5000;
%訓練神經網絡
[net,tr]=train(net,p,t);
%輸出訓練後的權值和閾值
iw1=net.IW{1};
b1=net.b{1};
lw2=net.LW{2};
b2=net.b{2};
%存儲訓練好的神經網絡
save netkohler net


______________________________________________________________________________________________

怎樣知道matlab已經訓練好的神經網絡的權值、步長以及闕值

用matlab訓練神經網絡時不需輸入權值、步長以及闕值,如果我想知道matlab已經訓練好的神經網絡的權值、步長以及闕值該怎末操作?

訓練好的權值、閾值的輸出方法是:
輸入到隱層權值: w1=net.iw{1,1}
隱層閾值: theta1=net.b{1}
隱層到輸出層權值: w2=net.lw{2,1};
輸出層閾值: theta2=net.b{2}

______________________________________________________________________________________________

幫我看看matlab的這段程序(有關神經網絡BP算法)

在一位老師的講義上看到的程序,但是有些東西不太明白,請求幫助
程序如下:
****************************************************************
clf;
figure(gcf)
echo on
%NEWFF — 建立一個BP網絡
%TRAIN — 對BP網絡進行訓練
%SIM — 對BP網絡進行仿真
pause
P = -1:0.1:1;
T = [-.9602 -.5770 -.0729 .3771 .6405 .6600 .4609 ...
.1336 -.2013 -.4344 -.5000 -.3930 -.1647 .0988 ...
.3072 .3960 .3449 .1816 -.0312 -.2189 -.3201];
plot(P,T,'+');
title('Training Vectors');
xlabel('Input Vector P');
ylabel('Target Vector T');
pause
net=newff(minmax(P),[5 1],{'tansig' 'purelin'},'traingd','learngd','sse');
echo off
k = pickic;
if k == 2
net.iw{1,1} = [3.5000; 3.5000; 3.5000; 3.5000; 3.5000];
net.b{1} = [-2.8562; 1.0774; -0.5880; 1.4083; 2.8722];
net.lw{2,1} = [0.2622 -0.2375 -0.4525 0.2361 -0.1718];
net.b{2} = [0.1326];
end

net.iw{1,1}
net.b{1}
net.lw{2,1}
net.b{2}

pause
echo on
me=8000;
net.trainParam.show=10;
net.trainParam.goal=0.02;
net.trainParam.lr=0.01;
A=sim(net,P);
sse=sumsqr(T-A);
for i=1:me/100
if sse>net.trainparam.goal,i=i-1;break,end
net.trainParam.epochs=100;
[net,tr]=train(net,P,T);
trp((1+100*(i-1)):(max(tr.epoch)+100*(i-1)))=tr.perf(1:max(tr.epoch));
A=sim(net,P);
sse=sumsqr(T-A);
plot(P,T,'+');
hold on
plot(P,A)
hold off
pause
end
message=sprintf('Traingd, Epoch %%g/%g, SSE %%g\n',me);
fprintf(message,(max(tr.epoch)+100*(i-1)),sse)
plot(tr)
[i,j]=size(trp);
hold on
plot(1:j,net.trainParam.goal,'r--')
hold off
title('Error Signal')
xlabel('epoch')
ylabel('Error')
p = 0.5;
a = sim(net,p)
echo off


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章