[ nayrobb @ 24.09.2013. 17:02 ] @
Pozdrav svima, imam problem da rešim Back Propagation algoritam u Matlab-u. Potrebno je napraviti neuronsku mrežu na osnovu Beale fje. Beale funkcija izgleda ovako: Code: function[Fx]=bealeFN(x1,x2) c=[1.5,2.25,2.625]; Fx=0; for i=1:3 Fx=Fx+(c(i)-x1*(1-x2^i))^2; end Ono što sam ja uradio je sledeće: Code: clear;clc; p=rand(2,100); [m,n] = size(p); i=0; for i = 1:n p(3,i) = 1;%biasi R7(i) = 1; end brEpoha = 5000; maxGreska = 1e-5; korak = 0.8; greska = zeros(n,1); momentum = 0.8; i = 0; for i=1:n t(1,i)=bealeFN(p1(1,i),p1(2,i)); end %inicijalizacija pocetnih vrednosti tezina %skriveni sloj 1 Wx11(1) = -1 + 2.*rand(1); Wx21(1) = -1 + 2.*rand(1); Wx31(1) = -1 + 2.*rand(1); Wx41(1) = -1 + 2.*rand(1); Wx51(1) = -1 + 2.*rand(1); Wx61(1) = -1 + 2.*rand(1); Wx12(1) = -1 + 2.*rand(1); Wx22(1) = -1 + 2.*rand(1); Wx32(1) = -1 + 2.*rand(1); Wx42(1) = -1 + 2.*rand(1); Wx52(1) = -1 + 2.*rand(1); Wx62(1) = -1 + 2.*rand(1); %tezine biasa1 Wx13(1) = -1 + 2.*rand(1); Wx23(1) = -1 + 2.*rand(1); Wx33(1) = -1 + 2.*rand(1); Wx43(1) = -1 + 2.*rand(1); Wx53(1) = -1 + 2.*rand(1); Wx63(1) = -1 + 2.*rand(1); %skriveni sloj 2 Wy11(1) = -1 + 2.*rand(1); Wy21(1) = -1 + 2.*rand(1); Wy12(1) = -1 + 2.*rand(1); Wy22(1) = -1 + 2.*rand(1); Wy13(1) = -1 + 2.*rand(1); Wy23(1) = -1 + 2.*rand(1); Wy14(1) = -1 + 2.*rand(1); Wy24(1) = -1 + 2.*rand(1); Wy15(1) = -1 + 2.*rand(1); Wy25(1) = -1 + 2.*rand(1); Wy16(1) = -1 + 2.*rand(1); Wy26(1) = -1 + 2.*rand(1); %bias2 Wy17(1) = -1 + 2.*rand(1); Wy27(1) = -1 + 2.*rand(1); %izlazni sloj W11(1) = -1 + 2.*rand(1); W12(1) = -1 + 2.*rand(1); W21(1) = -1 + 2.*rand(1); W22(1) = -1 + 2.*rand(1); for j = 1: brEpoha i = 0; for i = 1 : n %ulazi neurona skrivenog sloja 1 R11(i) = (Wx11(i) * p(1,i)) + (Wx12(i) * p(2,i)) + (Wx13(i) * p(3,i)); R21(i) = (Wx21(i) * p(1,i)) + (Wx22(i) * p(2,i)) + (Wx23(i) * p(3,i)); R31(i) = (Wx31(i) * p(1,i)) + (Wx32(i) * p(2,i)) + (Wx33(i) * p(3,i)); R41(i) = (Wx41(i) * p(1,i)) + (Wx42(i) * p(2,i)) + (Wx43(i) * p(3,i)); R51(i) = (Wx51(i) * p(1,i)) + (Wx52(i) * p(2,i)) + (Wx53(i) * p(3,i)); R61(i) = (Wx61(i) * p(1,i)) + (Wx62(i) * p(2,i)) + (Wx63(i) * p(3,i)); %izlaz neurona skrivenog sloja 1 R1(i) = logsig(R11(i)); R2(i) = logsig(R21(i)); R3(i) = logsig(R31(i)); R4(i) = logsig(R41(i)); R5(i) = logsig(R51(i)); R6(i) = logsig(R61(i)); %ulazi neurona skrivenog sloja 2 R12(i) = (R1(i) * Wy11(i)) + (R2(i)*Wy12(i)) + (R3(i)*Wy13(i)) + (R4(i)*Wy14(i)) + (R5(i)*Wy15(i)) + (R6(i)*Wy16(i)) + (R7(i)*Wy17(i)); R22(i) = (R1(i) * Wy21(i)) + (R2(i)*Wy22(i)) + (R3(i)*Wy23(i)) + (R4(i)*Wy24(i)) + (R5(i)*Wy25(i)) + (R6(i)*Wy26(i)) + (R7(i)*Wy27(i)); %izlaz neurona skrivenog sloja 2 S1(i) = logsig(R12(i)); S2(i) = logsig(R22(i)); %ulaz izlaznog neurona Y1(i) = S1(i)*W11(i) + S2(i)*W12(i); Y2(i) = S1(i)*W21(i) + S2(i)*W22(i); %izlaz mreze y1(i) = logsig(Y1(i)); y2(i) = logsig(Y2(i)); %gradijent izlaza greska_izl1(i) = y1(i) * (1 - y1(i)) * (p(1,i) - y1(i)); greska_izl2(i) = y2(i) * (1 - y2(i)) * (p(2,i) - y2(i)); greska(j,i) = sum(abs(p(1,i) - y1(i)) + abs(p(2,i) - y2(i))); %greska(j,i) = sum(sum(abs(t(i) - y(i))./2)); if greska(j,i) > maxGreska %promena vrednosti izlaznih tezina W11(i+1) = W11(i) + (korak * greska_izl1(i) * S1(i)); W12(i+1) = W12(i) + (korak * greska_izl2(i) * S1(i)); W21(i+1) = W21(i) + (korak * greska_izl1(i) * S2(i)); W22(i+1) = W22(i) + (korak * greska_izl2(i) * S2(i)); %gradijenti drugog skrivenog sloja greska_s1(i) = S1(i) * (1 - S1(i)) * (greska_izl1(i) * W11(i) + greska_izl2(i) * W12(i)); greska_s2(i) = S2(i) * (1 - S2(i)) * (greska_izl1(i) * W21(i) + greska_izl2(i) * W22(i)); %promena tezina skrivenog sloja Wy11(i+1) = Wy11(i) + (korak * greska_s1(i) * R1(i)); Wy12(i+1) = Wy12(i) + (korak * greska_s1(i) * R2(i)); Wy13(i+1) = Wy13(i) + (korak * greska_s1(i) * R3(i)); Wy14(i+1) = Wy14(i) + (korak * greska_s1(i) * R4(i)); Wy15(i+1) = Wy15(i) + (korak * greska_s1(i) * R5(i)); Wy16(i+1) = Wy16(i) + (korak * greska_s1(i) * R6(i)); Wy17(i+1) = Wy17(i) + (korak * greska_s1(i) * R7(i)); Wy21(i+1) = Wy21(i) + (korak * greska_s2(i) * R1(i)); Wy22(i+1) = Wy22(i) + (korak * greska_s2(i) * R2(i)); Wy23(i+1) = Wy23(i) + (korak * greska_s2(i) * R3(i)); Wy24(i+1) = Wy24(i) + (korak * greska_s2(i) * R4(i)); Wy25(i+1) = Wy25(i) + (korak * greska_s2(i) * R5(i)); Wy26(i+1) = Wy26(i) + (korak * greska_s2(i) * R6(i)); Wy27(i+1) = Wy27(i) + (korak * greska_s2(i) * R7(i)); %gradijenti prvog skrivenog sloja greska_R1(i) = R1(i) * (1 - R1(i)) * (greska_s1(i) * Wy11(i) + greska_s2(i) * Wy21(i)); greska_R2(i) = R2(i) * (1 - R2(i)) * (greska_s1(i) * Wy12(i) + greska_s2(i) * Wy22(i)); greska_R3(i) = R3(i) * (1 - R3(i)) * (greska_s1(i) * Wy13(i) + greska_s2(i) * Wy23(i)); greska_R4(i) = R4(i) * (1 - R4(i)) * (greska_s1(i) * Wy14(i) + greska_s2(i) * Wy24(i)); greska_R5(i) = R5(i) * (1 - R5(i)) * (greska_s1(i) * Wy15(i) + greska_s2(i) * Wy25(i)); greska_R6(i) = R6(i) * (1 - R6(i)) * (greska_s1(i) * Wy16(i) + greska_s2(i) * Wy26(i)); %promena tezina izmedju ulaznog i prvog skrivenog sloja Wx11(i+1) = Wx11(i) + (korak * greska_R1(i) * p(1,i)); Wx21(i+1) = Wx21(i) + (korak * greska_R2(i) * p(1,i)); Wx31(i+1) = Wx31(i) + (korak * greska_R3(i) * p(1,i)); Wx41(i+1) = Wx41(i) + (korak * greska_R4(i) * p(1,i)); Wx51(i+1) = Wx51(i) + (korak * greska_R5(i) * p(1,i)); Wx61(i+1) = Wx61(i) + (korak * greska_R6(i) * p(1,i)); Wx12(i+1) = Wx12(i) + (korak * greska_R1(i) * p(2,i)); Wx22(i+1) = Wx22(i) + (korak * greska_R2(i) * p(2,i)); Wx32(i+1) = Wx32(i) + (korak * greska_R3(i) * p(2,i)); Wx42(i+1) = Wx42(i) + (korak * greska_R4(i) * p(2,i)); Wx52(i+1) = Wx52(i) + (korak * greska_R5(i) * p(2,i)); Wx62(i+1) = Wx62(i) + (korak * greska_R6(i) * p(2,i)); Wx13(i+1) = Wx13(i) + (korak * greska_R1(i) * p(3,i)); Wx23(i+1) = Wx23(i) + (korak * greska_R2(i) * p(3,i)); Wx33(i+1) = Wx33(i) + (korak * greska_R3(i) * p(3,i)); Wx43(i+1) = Wx43(i) + (korak * greska_R4(i) * p(3,i)); Wx53(i+1) = Wx53(i) + (korak * greska_R5(i) * p(3,i)); Wx63(i+1) = Wx63(i) + (korak * greska_R6(i) * p(3,i)); else break; end end end for i = 1:n y(i) = bealeFN(y1(i),y2(i)); end k=1:1:n; plot(k,t(1,:),'Or',k,y,'*g') title('Realna vrednost - O Vrednost ostvarena mrezom(aproksimacija) - *') xlabel('Broj test funkcija'); ylabel('Stvarna vrednost, Ostvarena vrednost'); Dakle, neuronska mreža ima 2 ulazna neurona, 6 u prvom skrivenom sloju, 2 u drugom skrivenom sloju i dva izlaza. Ono što mene muči je sledeće: Da li ja na ulaz neuronske mreže dovodim ulaze Beale-ove fje u mom slučaju p(1,i) i p(2,i) ili dovodim t(i) koji sadrži vredonst nakon beale fje, odnosno željene vrednosti? Da li na izlazu neuronske mreže u slučaju da dovodim samo t(i) imam jedan izlaz ili više njih? Gde i kada treba da računam grešku koja će mi predstavljati kriterijum završetka obuke? Kako napisati sledeću formulu za grešku: http://clip2net.com/s/5OEjah Sve sam probao, ali jednostavno na izlazu mreže ne mogu dobiti ono što dobijem sa Beale fjom. Kontam da je to zbog toga što na izlazu NM koristim sigmoidu funkciju koja mi izlaz sabije na opseg 0-1, a izlazi beale fje su negde u opsegu od 5-15. Ukoliko neko zna kako da rešim ovaj problem, bio bih mu zahvalan. Napomena: Ovaj kod mora biti uradjen ručno, ne smem koristiti nnstart ugradjeni matlabov alat za neuronske mreže. |