Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Matlab - Neuronske mreze - Back Propagation Algoritam

[es] :: Ostali programski jezici :: Matlab - Neuronske mreze - Back Propagation Algoritam

[ Pregleda: 2360 | Odgovora: 0 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

nayrobb
Vlado Oravec
Novi Sad

Član broj: 129179
Poruke: 24
212.178.226.*



Profil

icon Matlab - Neuronske mreze - Back Propagation Algoritam24.09.2013. u 17:02 - pre 127 meseci
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.
 
Odgovor na temu

[es] :: Ostali programski jezici :: Matlab - Neuronske mreze - Back Propagation Algoritam

[ Pregleda: 2360 | Odgovora: 0 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.