400 likes | 780 Views
第六章 Matlab 與 NNT 使用範例. 6.1 平行輸入及循序輸入之模擬 6.2 步進學習 (Incremental learning) 及 批次學習 (Batch learning) 6.3 FIR 濾波器及 newlin 的關係 6.4 頻率變動偵測 (Frequency variation detection). 6.1 平行輸入及循序輸入之模擬.
E N D
第六章Matlab與NNT使用範例 6.1 平行輸入及循序輸入之模擬 6.2 步進學習(Incremental learning)及 批次學習(Batch learning) 6.3 FIR濾波器及newlin的關係 6.4 頻率變動偵測(Frequency variation detection)
6.1 平行輸入及循序輸入之模擬 • 平行輸入(Concurrent inputs)是指有許多組的輸入送至類神經網路,它的順序不重要。可以看成有這麼多組相同的類神經網路,而每一組輸入加在每一組類神經網路上。循序輸入(Sequential inputs)則與時間有關,第三組一定發生在第二組之後,它們的順序不可任意對調,因此像是在火車站買票的人們,先來先買;插隊或自行對調,可能造成其後面或其中有些人因而買不到票(原來可以的)。不按原輸入順序送入則輸出的結果因之而變。另外兩個要說明的名詞一為動態網路(Dynamic networks)、一為靜態網路(Static networks)。所謂動態網路是指網路中包含有回授或有遲元件者,相反地兩者皆無的網路稱為靜態網路。平行輸入只能用在靜態網路,因為輸入的順序並不重要,但對動態網路,輸入前後關係影響很大,輸出完全大不相同。因此平行輸入加在動態網路上,要特別注意,並且用Cell array表示才正確。
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
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?)。
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表示!
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]
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
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
6.2 步進學習及批次學習 • 步進學習是指每一筆輸入進來,經過計算、整型等過程,一直傳到輸出後,誤差得到了立刻計算dW及db,即修正量。批次學習則要把一個批次中的每一筆誤差累積至總誤差,有了總誤差才做一次修正。前面討論過的適應瀘波器是屬於步進學習類。
6.2 步進學習及批次學習 • 在NNT中有两個學習法則,一為adapt,一為train。基本上adapt可以用在步進學習及批次學習,而train只能用在批次學習。首先討論adapt用在步進學習上。既然要一步一步學,則用cell array表示I/O data最好。
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都是一般陣列宣告,故不合做步進學習用。
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則不會學習。
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); %再步進學習
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]
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
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才行。
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]
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
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
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.
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.
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
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,包含有兩次輸入延遲。
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
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
6.3 FIR濾波器及newlin的關係 • 現在吾人用ADDLINE來模擬圖6.3-2的FIR filter。
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
6.3 FIR濾波器及newlin的關係 • 原來NNT中的sim寫反了Pi的定義,按原來意思p(k-1)的初始值為1,p(k-2)的初始值為3,在定義Pi時應寫為[1 3]。但當你這麼代入時模擬結果是錯的,把Pi反過來定如[3 1],模擬才會正確。這一小錯誤,讀者要小心避免。
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
6.4 頻率變動偵測 • ADALINE可以用來偵察某一被監督信號是否正常,假設該信號(如某馬達運轉時之聲波)正常時之頻率為f,如不正常時頻率會變快或慢(如0.5f及2f),一個偵測的方法是由示波器產生其波形或是頻率計讀其頻率;另一方法為利用一有五個延遲輸入信號組成的適應線性元件(ADALINE)所組成。當輸入信號有變動時,ADALINE的輸出大小就會有所變化,以此推測輸入走頻(頻率有所變動)發生,而判斷信號有故障發生。
6.4 頻率變動偵測 • 程式FVD_adaline.m係參考NNT手冊中的例子寫成一頻率變動偵測器(Frequency Variation Detection, FVD)。假設輸入信號為正弦波,不論信號正常與否,其振幅皆固定,只是頻率會變。ADALINE的架構如圖6.4-1所示,輸入信號與目標信號皆相同。執行完FVD_adaline程式後之結果如圖6.4-2所示,由其誤差圖可偵測出頻率發生變動。
6.4 頻率變動偵測 • 這個例子中所使用之ADALINE即是吾人常用之適應濾波器,由於此濾波器的輸入為五組輸入延遲信號,而它的功能在預測原始輸入信號,故它能還原成原始輸入,只是有一小段的適應時間。吾人利用此一小段適應時間的變化得知信號異常,此即所謂適應預測(Adaptive prediction)。