1 / 39

第六章 Matlab 與 NNT 使用範例

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

louisa
Download Presentation

第六章 Matlab 與 NNT 使用範例

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

  3. 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

  4. 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?)。

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

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

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

  8. 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表示!

  9. 6.1 平行輸入及循序輸入之模擬 • 更進一步說,如果有兩組不同的輸入P及Q,是否可寫成一組cell array以進行模擬? • >> 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 double]

  10. 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

  11. 6.1 平行輸入及循序輸入之模擬 • % 看看NN輸出結果是正確的。 • >> A=sim(net,R) • A = • [1x2 double] [1x2 double] [1x2 double] [1x2 double] [1x2 double] • >> celldisp(A) • A{1} = 1 1 • A{2} = 4 5 • A{3} = 7 8 • A{4} = 10 8 • A{5} = 13 13

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

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

  14. 6.2 步進學習及批次學習 • 例如輸入為二維的x及y,輸出為t,且關係為 • t=x+2y=[1 2]*(x y) • 輸入有四組為(1,1)、(1,2)、(2,1)、(3,2),利用matlab很快找到其間關係值: • >> 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都是一般陣列宣告,故不合做步進學習用。

  15. 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則不會學習。

  16. 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); %再步進學習

  17. 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]

  18. 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

  19. 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(在步進學習裡叫pass),不是只做一個pass就會很好,故要多做些passes才行。

  20. 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]

  21. 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

  22. 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

  23. 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.

  24. 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.

  25. 6.2 步進學習及批次學習

  26. 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

  27. 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,包含有兩次輸入延遲。

  28. 6.3 FIR濾波器及newlin的關係

  29. 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

  30. 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

  31. 6.3 FIR濾波器及newlin的關係 • 現在吾人用ADDLINE來模擬圖6.3-2的FIR filter。

  32. 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

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

  34. 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

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

  36. 6.4 頻率變動偵測

  37. 6.4 頻率變動偵測 • 程式FVD_adaline.m係參考NNT手冊中的例子寫成一頻率變動偵測器(Frequency Variation Detection, FVD)。假設輸入信號為正弦波,不論信號正常與否,其振幅皆固定,只是頻率會變。ADALINE的架構如圖6.4-1所示,輸入信號與目標信號皆相同。執行完FVD_adaline程式後之結果如圖6.4-2所示,由其誤差圖可偵測出頻率發生變動。

  38. 6.4 頻率變動偵測

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

More Related