39
第第第 Matlab 第 NNT 第第第第 6.1 第第第第第第第第第第第第 6.2 第第第第 (Incremental learning) 第 第第第第 (Batch learning) 6.3 FIR 第第第第 newlin 第第第 6.4 第第第第第第 (Frequency variation detection)

第六章 Matlab 與 NNT 使用範例

  • Upload
    louisa

  • View
    156

  • Download
    4

Embed Size (px)

DESCRIPTION

第六章 Matlab 與 NNT 使用範例. 6.1 平行輸入及循序輸入之模擬 6.2 步進學習 (Incremental learning) 及 批次學習 (Batch learning) 6.3 FIR 濾波器及 newlin 的關係 6.4 頻率變動偵測 (Frequency variation detection). 6.1 平行輸入及循序輸入之模擬. - PowerPoint PPT Presentation

Citation preview

Page 1: 第六章 Matlab 與 NNT 使用範例

第六章 Matlab 與 NNT 使用範例 6.1 平行輸入及循序輸入之模擬 6.2 步進學習 (Incremental learning) 及 批次學習 (Batch learning) 6.3 FIR 濾波器及 newlin 的關係 6.4 頻率變動偵測 (Frequency variation detection)

Page 2: 第六章 Matlab 與 NNT 使用範例

6.1 平行輸入及循序輸入之模擬• 平行輸入 (Concurrent inputs) 是指有許多組的輸入送至類神經網路,它的順序不重要。可以看成有這麼多組相同的類神經網路,而每一組輸入加在每一組類神經網路上。循序輸入 (Sequential inputs) 則與時間有關,第三組一定發生在第二組之後,它們的順序不可任意對調,因此像是在火車站買票的人們,先來先買;插隊或自行對調,可能造成其後面或其中有些人因而買不到票 ( 原來可以的 ) 。不按原輸入順序送入則輸出的結果因之而變。另外兩個要說明的名詞一為動態網路 (Dynamic networks) 、一為靜態網路 (Static networks) 。所謂動態網路是指網路中包含有回授或有 遲元件者,相反地兩者皆無的網路稱為靜態網路。平行輸入只能用在靜態網路,因為輸入的順序並不重要,但對動態網路,輸入前後關係影響很大,輸出完全大不相同。因此平行輸入加在動態網路上,要特別注意,並且用

Cell array 表示才正確。

Page 3: 第六章 Matlab 與 NNT 使用範例

6.1 平行輸入及循序輸入之模擬• 平行輸入的範例如下:• >> P=randn(2,4) % 產生四組平行輸入 ( 用一般矩陣表示,如 [2 4 3.

5]) 。• P =• -0.4326 0.1253 -1.1465 1.1892• -1.6656 0.2877 1.1909 -0.0376• >> net=newlin(minmax(P),1); % 產生 2-1 的 ADALINE• >> net.IW{1,1}=[1 2]; net.b{1}=0.5; % 設定某組 W 及 b• >> A=sim(net,P) % 模擬 NN 得輸出• A =• -3.2637 1.2007 1.7354 1.6139• >> Q=[P(:,3) P(:,1:2) P(:,4)] % 把第三組往前調• Q =• -1.1465 -0.4326 0.1253 1.1892• 1.1909 -1.6656 0.2877 -0.0376• >> A=sim(net,Q) % 輸出結果相對應往前調• A =• 1.7354 -3.2637 1.2007 1.6139

Page 4: 第六章 Matlab 與 NNT 使用範例

6.1 平行輸入及循序輸入之模擬• 其次看看如何模擬循序輸入 ( 用 Cell 表示,如 {2,4,-3.5}) :• 如果 NN 中含有延遲輸入則輸入的秩序變成後重要如:• >> P={1 2 3 4 5} % 定義 P 為 cell array• P = • [1] [2] [3] [4] [5]• >> net=newlin([1 5],1,[0 1]);• % [1 5] 為 P 中的最小值的最大值, newlin 要知道輸入最小、最大值。再下來的 1 表示輸出層的神經元數目為 1 。

[0 1] 表示有 遲輸入,如果沒有任何延遲則應寫為 [0] ,也可以省畧;如果有一個延遲則應寫成 [0 1] ,若原信號為 u[k] ,那 [0 1] 表示除了 u[k] 外也有 u[k-1] 一起做輸入,如圖 6.1-1 所示。如果有兩個輸入延遲一併使用則寫為 [0 1 2] ,可視為輸入有 0 延遲即 u[k] 、 1 遲 u[k-1] 、 2 延遲 u[k-2] 共三輸入,其架構如圖 6.1-2 。如果輸入信號的維度為 2 ,其架構会是圖 6.1-3 型式,此時之 W 應為 1×4 的Array(Why?) 。

Page 5: 第六章 Matlab 與 NNT 使用範例

6.1 平行輸入及循序輸入之模擬

Page 6: 第六章 Matlab 與 NNT 使用範例

6.1 平行輸入及循序輸入之模擬

Page 7: 第六章 Matlab 與 NNT 使用範例

6.1 平行輸入及循序輸入之模擬

Page 8: 第六章 Matlab 與 NNT 使用範例

6.1 平行輸入及循序輸入之模擬• % 把所有偏壓 b 的連線打開如下• >> net.biasConnect=0;• >> net.IW{1,1}=[1 2]; % 設定 W• >> A=sim(net,P) %NN 結果也用 cell array 表示• A = • [1] [4] [7] [10] [13]• >> Q={1 3 2 4 5} % 把 2,3 的次序對調• Q = • [1] [3] [2] [4] [5]• >> A=sim(net,Q) % 哇!與上面的結果不一樣• A = • [1] [5] [8] [8] [13]• >> P=[1:5] % 如果 P 用一般陣列 (Array) 表示• P =• 1 2 3 4 5• >> A=sim(net,P) % 完全不靈光• A =• 1 2 3 4 5• 相信你要處理循序輸入時,用 cell array 表示!

Page 9: 第六章 Matlab 與 NNT 使用範例

6.1 平行輸入及循序輸入之模擬• 更進一步說,如果有兩組不同的輸入 P 及 Q ,是否可寫成一組 cell a

rray 以進行模擬?• >> P={1 2 3 4 5}• P = • [1] [2] [3] [4] [5]• >> Q={1 3 2 4 5}• Q = • [1] [3] [2] [4] [5]• % 可以!把它們集合在新的 cell array 中叫做 R ,定義如下• >> R={[1 1] [2 3] [3 2] [4 4] [5 5]}• R = % 它的表示法有點笨• [1x2 double] [1x2 double] [1x2 double] [1x2 double] [1x2 d

ouble]

Page 10: 第六章 Matlab 與 NNT 使用範例

6.1 平行輸入及循序輸入之模擬• % 這麼寫• >> R{:}• ans =• 1 1 % 第一組• ans =• 2 3 % 第二組• ans =• 3 2 % 第三組• ans =• 4 4 % 第四組• ans =• 5 5 % 第五組• % 也可以用 celldisp 指令,顯示結果仍然有點笨笨的。• >> celldisp(R)• R{1} = 1 1• R{2} = 2 3• R{3} = 3 2• R{4} = 4 4• R{5} = 5 5

Page 11: 第六章 Matlab 與 NNT 使用範例

6.1 平行輸入及循序輸入之模擬• % 看看 NN 輸出結果是正確的。• >> A=sim(net,R)• A = • [1x2 double] [1x2 double] [1x2 double] [1x2 doub

le] [1x2 double]• >> celldisp(A)• A{1} = 1 1• A{2} = 4 5• A{3} = 7 8• A{4} = 10 8• A{5} = 13 13

Page 12: 第六章 Matlab 與 NNT 使用範例

6.2 步進學習及批次學習• 步進學習是指每一筆輸入進來,經過計算、整型等過程,一直傳到輸出後,誤差得到了立刻計算 dW 及 db ,即修正量。批次學習則要把一個批次中的每一筆誤差累積至總誤差,有了總誤差才做一次修正。前面討論過的適應瀘波器是屬於步進學習類。

Page 13: 第六章 Matlab 與 NNT 使用範例

6.2 步進學習及批次學習• 在 NNT 中有两個學習法則,一為 adapt ,一為 train 。基本上 adapt 可以用在步進學習及批次學習,而 train 只能用在批次學習。首先討論 adapt 用在步進學習上。既然要一步一步學,則用 cell array 表示 I/O data最好。

Page 14: 第六章 Matlab 與 NNT 使用範例

6.2 步進學習及批次學習• 例如輸入為二維的 x 及 y ,輸出為 t ,且關係為• t=x+2y=[1 2]*(x y)• 輸入有四組為 (1,1) 、 (1,2) 、 (2,1) 、 (3,2) ,利用 matla

b 很快找到其間關係值:• >> P=[1 1;1 2;2 1;3 2]'• P =• 1 1 2 3• 1 2 1 2• >> T=[1 2]*P• T =• 3 5 4 7• P,T都是一般陣列宣告,故不合做步進學習用。

Page 15: 第六章 Matlab 與 NNT 使用範例

6.2 步進學習及批次學習• 下面重新定義以 cell array 為主的 P 及 T :• >>P={[1;1] [1;2] [2;1] [3;2]};• >>T={3 5 4 7};• 呼叫 adapt 的樣式為 [net,a,e,pf]=adapt(net,P,T); ,右邊的 net 是由呼叫 newlin創出名叫 net 的網路架構, P 為輸入, T 為輸出。左邊的 net 是訓練完的網路,其中權重及偏壓己有變化。 a 為輸出, e 為誤差記錄, pf 為最終輸入延遲條件。 P 的第一元素 (Entry) 值最小為 1 最大為 3 ,

P 的第二元素 (Entry) 值最小為 1 最大為 2 , newff 的第一函數輸入即為 [1 3;1 2] ,第二輸入的 1代表輸出只有一個神經元,故為一維,第三輸入的 0代表只有輸入圖樣;沒有任何延遲 (Delay) ,如果有一個輸入 Delay 則應寫成[0 1] 。第四輸入的 0 表示 learning rate 值,為 0 則不會學習。

Page 16: 第六章 Matlab 與 NNT 使用範例

6.2 步進學習及批次學習• 下達如下:• >> net=newlin([1 3;1 2],1,0,0);• % 如果寫得更清楚你會宣告如是• >>PMM=[1 3;1 2];no_out=1;delays=[0];learn_rate=0;• >>net=newff(PMM,no_out,delays,learn_rate); % 這樣是否更清楚?• % 首先設 W 及 b 皆為 0始• >> net.IW{1,1}=[0 0];net.b{1}=0;• >> [net,a,e,pf]=adapt(net,P,T); % 步進學習,總共 4 次• >> a % 看結果• a = • [0] [0] [0] [0] % 沒任何改善,因為沒學• >> e• e = • [3] [5] [4] [7]• >> pf• pf = • Empty cell array: 1-by-0• % 設定 W 及 b 的學習率 (Learning rates)• >> net.inputWeights{1,1}.learnParam.lr=0.1;• >> net.biases{1}.learnParam.lr=0.1;• >> [net,a,e,pf]=adapt(net,P,T); % 再步進學習

Page 17: 第六章 Matlab 與 NNT 使用範例

6.2 步進學習及批次學習• >> a• a = % 結果開始變了• [0] [1.2000] [3.1000] [5.6500]• >> T• T = • [3] [5] [4] [7]• >> e• e = %e=T-a• [3] [3.8000] [0.9000] [1.3500]• >> pf• pf = • Empty cell array: 1-by-0• >> mse(e) % 平均誤差平方• ans =• 6.5181• % 再練四次• >> [net,a,e,pf]=adapt(net,P,T);• >> [T;a;e] % 這樣顯示比較好對照• ans = • [ 3] [ 5] [ 4] [ 7]• [ 3.5900] [4.7740] [ 4.7320] [6.7080]• [-0.5900] [0.2260] [-0.7320] [0.2920]

Page 18: 第六章 Matlab 與 NNT 使用範例

6.2 步進學習及批次學習• >>mse(e)• ans=0.2551 % 平均誤差平方已有改善了• % P 一次有四組,每呼叫一次 adapt ,就做步進學習四次,這叫做一個 pass ,如果要連續 100 個 passes ,下達指令如下:• >>net.adaptParam.passes = 100;• >>[net,a,e] = adapt(net,P,T);• >> [T;a;e]• ans = % 看來學得不錯了• [ 3] [ 5] 4] [ 7]• [ 3.0069] [4.9976] [ 4.0064] [6.9944]• [-0.0069] [0.0024] [-0.0064] [0.0056]• >> mse(e)• ans = 3.1450e-005 % 誤差也變小了• >> net.IW{1,1} %W 值• ans =• 1.0010 1.9937• >> net.b{1} %b 值• ans =• 0.0120

Page 19: 第六章 Matlab 與 NNT 使用範例

6.2 步進學習及批次學習• % 如果把 b 關掉,再試試看• >> net.biasConnect=0;• >> net.adaptParam.passes = 100;• >> [net,a,e] = adapt(net,P,T);• >> net.IW{1,1} %標準答案出硯了• ans =• 1.0000 2.0000• >> [T;a;e] %好得很• ans = • [ 3] [ 5] [ 4] [ 7]• [ 3.0000] [ 5.0000] [ 4.0000] [ 7.0000]• [2.4582e-010] [8.4738e-010] [-5.9635e-010] [-1.7683e-010]• >> mse(e)• ans = 2.9135e-019• 輸入有四組,每輸入完成四組叫做一個 Epoch( 在步進學習裡叫 pa

ss) ,不是只做一個 pass就會很好,故要多做些 passes 才行。

Page 20: 第六章 Matlab 與 NNT 使用範例

6.2 步進學習及批次學習• 至於動態網路的步進學習, I/O都要用 cell array 型態表示。例如:• >> P={2 3 4}; T={3 5 7};• >> Pi={1}; %u[k-1] 的初始值• >> net=newlin([2 4],1,[0 1],0.1); % 有一個 delay• >> net.IW{1,1}=[0 0];• >> net.biasConnect=0;• >> [net,a,e,Pf] = adapt(net,P,T,Pi);• >> [T;a;e]• ans = % 一個 pass 的結果不怎麼好• [3] [ 5] [ 7]• [0] [2.4000] [ 7.9800]• [3] [2.6000] [-0.9800]• >> net.adaptParam.passes = 100; % 多做幾個 passes• >> Pf % 別忘了上一次 u(k-1) 的值• Pf = [4]• >> [net,a,e,Pf] = adapt(net,P,T,Pf);• >> [T;a;e] % 結果在改善中• ans = • [ 3] [ 5] [ 7]• [ 3.1579] [ 6.5789] [5.7368]• [-0.1579] [-1.5789] [1.2632]

Page 21: 第六章 Matlab 與 NNT 使用範例

6.2 步進學習及批次學習• 最後討論批次學習。 adapt 及 learn都可以用來做批次學習。 I/O 用普通陣列表示,例如前面說過的 t=[1 2]*(x y) 的關係,對一靜態網路而言,做法如下:• >> P=[1 1;1 2;2 2;2 3]'• P =• 1 1 2 2• 1 2 2 3• >> T=[1 2]*P• T =• 3 5 6 8

Page 22: 第六章 Matlab 與 NNT 使用範例

6.2 步進學習及批次學習• % Learning rate 不可以大大,否則可能使 W,b爆掉• >> net=newlin([1 2;1 3],1,0,0.01);• >> net.adaptParam.passes = 500;• >> [net,a,e] = adapt(net,P,T);[T;a;e]• ans = % 結果不錯• 3.0000 5.0000 6.0000 8.0000• 3.0619 5.0184 6.0023 7.9587• -0.0619 -0.0184 -0.0023 0.0413• >> net.IW{1,1}• ans =• 0.9839 1.9567• >> net.b{1}• ans = 0.1211• % 把 b 連線切掉後再試• >> net.biasConnect=0;• >> [net,a,e] = adapt(net,P,T);[T;a;e]• ans = % 結果更好• 3.0000 5.0000 6.0000 8.0000• 3.0004 4.9993 6.0007 7.9997• -0.0004 0.0007 -0.0007 0.0003• >> net.IW{1,1}• ans = % 很接近 [1 2]標準值了• 1.0014 1.9990

Page 23: 第六章 Matlab 與 NNT 使用範例

6.2 步進學習及批次學習• 至於 train 的使用方法近似上面過程,以一動態網路為例,

I/O 最好是用 cell array 型態表示:• >> P={2 3 4};Pi={1};T={3 5 6};• >> net=newlin([2 4],1,[0 1],0.02);• >> net.IW{1,1}=[0 0];• >> net.biasConnect=0;• >> net.trainParam.epochs=1; % 只做一批次• >> net=train(net,P,T,Pi);• TRAINB, Epoch 0/1, MSE 23.3333/0.• TRAINB, Epoch 1/1, MSE 0.583867/0.• TRAINB, Maximum epoch reached.

Page 24: 第六章 Matlab 與 NNT 使用範例

6.2 步進學習及批次學習• >> net.IW{1,1}• ans =• 0.9000 0.6200• >> net.trainParam.epochs=3000; %改做 3000 批次• >> net=train(net,P,T,Pi);• TRAINB, Epoch 0/3000, MSE 23.3333/0.• TRAINB, Epoch 25/3000, MSE 0.103419/0.• …• TRAINB, Epoch 2950/3000, MSE 0.0555556/0.• TRAINB, Epoch 2975/3000, MSE 0.0555556/0.• TRAINB, Epoch 3000/3000, MSE 0.0555556/0.• TRAINB, Maximum epoch reached.• >> a=sim(net,P,T,Pi); %T 不應上來的,造成錯誤• ??? Error using ==> network/sim• Input states are incorrectly sized for network.• Cell array must have 1 column.

Page 25: 第六章 Matlab 與 NNT 使用範例

6.2 步進學習及批次學習

Page 26: 第六章 Matlab 與 NNT 使用範例

6.2 步進學習及批次學習• % 原來誤多寫了 T ,改正後• >> a=sim(net,P,Pi); %sim就是模擬 net 網路在輸入為 P,Pi 後之輸出• >> [T;a] % 結果快接近目標值了• ans = • [ 3] [ 5] [ 6]• [3.1666] [4.6667] [6.1667]• >> net.IW{1,1}• ans =

1.6665 -0.1665

Page 27: 第六章 Matlab 與 NNT 使用範例

6.3 FIR 濾波器及 newlin 的關係• FIR(Finite Impulse Response) filter 是信號處理

(Signal Processing) 時常見的一種 filter 。寫成差分方程式 (Difference equation) ,其型式為• n(k)=a0p(k)+a1*p(k-1)+a2*p(k-2)• p(k-1) 為 p(k) 的單位延遲,…,其 z-domain轉移函數 G(z) 可寫為• G(z)= 1/(a0+a1z-1+a2z-2)• 與圖 6.3-1比較可知,它也是一個 ADALINE ,包含有兩次輸入延遲。

Page 28: 第六章 Matlab 與 NNT 使用範例

6.3 FIR 濾波器及 newlin 的關係

Page 29: 第六章 Matlab 與 NNT 使用範例

6.3 FIR 濾波器及 newlin 的關係• 其中 a0=w11 , a1=w12 , a2=w13 。每個延遲元件 D 的輸出可以有自己的初始值。例如 a0=1.8 , a1=-2.3 , a2

=1 。 p(k-1)初始值為 1 , p(k-2)初始值為 3 皆設在 Unit delay方塊內, Sample time=1 ,如圖 6.3-2 所示。在模擬方塊圖時, P_vec 要先設定好如

• >> P_vec=[0:3;1:4]'• P_vec = % 第一列為時間,第二列為輸入序列• 0 1• 1 2• 2 3• 3 4

Page 30: 第六章 Matlab 與 NNT 使用範例

6.3 FIR 濾波器及 newlin 的關係• % 開始手動模擬• >> P %Input sequence• P =• 1• 2• 3• 4• 5• >> a %Output sequence• a =• 2.5000• 2.3000• 1.8000• 2.3000• 2.8000

Page 31: 第六章 Matlab 與 NNT 使用範例

6.3 FIR 濾波器及 newlin 的關係• 現在吾人用 ADDLI

NE 來模擬圖 6.3-2 的 FIR filter 。

Page 32: 第六章 Matlab 與 NNT 使用範例

6.3 FIR 濾波器及 newlin 的關係• >> P1={1 2 3 4 5};Pi={1 3}; % 注意 Pi 為 delays 的初始值• >> net.IW{1,1}=[1.8 -2.3 1];• >> a1=sim(net,P1,Pi)• a1 = %好傢伙,與模擬的不一致• [-4.1000] [4.3000] [1.8000] [2.3000] [2.8000]• >> P1={1 2 3 4 5};Pi={3 1}; %換一下 Pi 次序• >> a1=sim(net,P1,Pi)• a1 = • [2.5000] [2.3000] [1.8000] [2.3000] [2.8000]• >> a' % 這是所謂之目標 T• ans =• 2.5000 2.3000 1.8000 2.3000 2.8000

Page 33: 第六章 Matlab 與 NNT 使用範例

6.3 FIR 濾波器及 newlin 的關係• 原來 NNT 中的 sim 寫反了 Pi 的定義,按原來意思 p(k-1) 的初始值為 1 , p(k-2) 的初始值為 3 ,在定義 Pi 時應寫為 [1 3] 。但當你這麼代入時模擬結果是錯的,把 Pi 反過來定如 [3 1] ,模擬才會正確。這一小錯誤,讀者要小心避免。

Page 34: 第六章 Matlab 與 NNT 使用範例

6.3 FIR 濾波器及 newlin 的關係• 其次如果己知 T={2.5 2.3 1.8 2.3 2.8};adapt 可否回求W 值?注意 Pi 要反過來定義, adapt 用來才會正確 ( 此邏輯有點詭異! ) 。• >> P1={1 2 3 4 5};Pi={3 1};T={2.5 2.3 1.8 2.3 2.8};• >> net=newlin([1 5],1,[0 1 2],0.01);• >> net.adaptParam.passes = 3000;• >> net.biasConnect=0;• >> [net,a,e,Pf] = adapt(net,P1,T,Pi);[T;a;e]• ans = % 两個結果够相近了吧!• [2.5000] [2.3000] [1.8000] [2.3000] [2.8000]• [2.4998] [2.2987] [1.7996] [2.3001] [2.8006]• [1.5557e-004][0.0013][4.3200e-004][-1.4449e-004] [-6.0560e-004]• [-6.0560e-004]• >> net.IW{1,1} % adapt 可以正確求出此 FIR filter 的係數。• ans =• 1.7983 -2.2976 0.9997

Page 35: 第六章 Matlab 與 NNT 使用範例

6.4 頻率變動偵測 • ADALINE 可以用來偵察某一被監督信號是否正常,假設該信號 ( 如某馬達運轉時之聲波 ) 正常時之頻率為 f ,如不正常時頻率會變快或慢 ( 如 0.5f 及 2f) ,一個偵測的方法是由示波器產生其波形或是頻率計讀其頻率;另一方法為利用一有五個延遲輸入信號組成的適應線性元件 (ADALINE) 所組成。當輸入信號有變動時, ADALINE 的輸出大小就會有所變化,以此推測輸入走頻 ( 頻率有所變動 ) 發生,而判斷信號有故障發生。

Page 36: 第六章 Matlab 與 NNT 使用範例

6.4 頻率變動偵測

Page 37: 第六章 Matlab 與 NNT 使用範例

6.4 頻率變動偵測• 程式 FVD_adaline.m 係參考 NNT手冊中的例子寫成一頻率變動偵測器 (Frequency Va

riation Detection, FVD) 。假設輸入信號為正弦波,不論信號正常與否,其振幅皆固定,只是頻率會變。 ADALINE 的架構如圖6.4-1 所示,輸入信號與目標信號皆相同。執行完 FVD_adaline 程式後之結果如圖 6.4-2 所示,由其誤差圖可偵測出頻率發生變動。

Page 38: 第六章 Matlab 與 NNT 使用範例

6.4 頻率變動偵測

Page 39: 第六章 Matlab 與 NNT 使用範例

6.4 頻率變動偵測• 這個例子中所使用之 ADALINE 即是吾人常用之適應濾波器,由於此濾波器的輸入為五組輸入延遲信號,而它的功能在預測原始輸入信號,故它能還原成原始輸入,只是有一小段的適應時間。吾人利用此一小段適應時間的變化得知信號異常,此即所謂適應預測 (Adaptive prediction) 。