Created
June 19, 2020 21:27
-
-
Save lethern/c48b776c83b32aff79b2c67b7a7685e1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Procedure naucz(var _siec :Tsiec;var _uczacy :Tuczacy); | |
{uczenie sieci metoda wstecznej propagacji bledow, liczba warstw: min 3} | |
var | |
_out :Tout; _in :Tin; _delta :Tdelta; _blad :Tblad; | |
_i,_i2,_i3 :integer; waga_tmp :real; | |
begin | |
for _i2:=1 to _siec.liczba_n[1] do _out[1,_i2]:=_uczacy.we[_i2]; {warstwa we} | |
for _i:=1 to _siec.liczba_w-1 do _out[_i,_siec.liczba_n[_i]]:=1; {bias} | |
{mnozenie wejsc przez wagi dla kazdego neuronu} | |
for _i:=2 to _siec.liczba_w do | |
if _i<>_siec.liczba_w then for _i2:=1 to _siec.liczba_n[_i]-1 do begin | |
_in[_i,_i2]:=0; | |
for _i3:=1 to _siec.liczba_n[_i-1] do | |
_in[_i,_i2]:=_in[_i,_i2]+_out[_i-1,_i3]*_siec.wagi[_i,_i2,_i3]; | |
_out[_i,_i2]:=1/(1+exp(_uczacy.beta*(-_in[_i,_i2]))); | |
end else for _i2:=1 to _siec.liczba_n[_i] do begin | |
_in[_i,_i2]:=0; | |
for _i3:=1 to _siec.liczba_n[_i-1] do | |
_in[_i,_i2]:=_in[_i,_i2]+_out[_i-1,_i3]*_siec.wagi[_i,_i2,_i3]; | |
_out[_i,_i2]:=1/(1+exp(_uczacy.beta*(-_in[_i,_i2]))); | |
end; | |
{obliczenie bledow} | |
for _i2:=1 to _siec.liczba_n[_siec.liczba_w] do | |
_blad[_i2]:=_uczacy.wy[_i2]-_out[_siec.liczba_w,_i2]; | |
_uczacy.blad:=0; | |
for _i2:=1 to _siec.liczba_n[_siec.liczba_w] do | |
_uczacy.blad:=_uczacy.blad+sqr(_blad[_i2]); | |
_uczacy.blad:=_uczacy.blad/_siec.liczba_n[_siec.liczba_w]; | |
_uczacy.blad:=sqrt(_uczacy.blad); | |
{propagowanie bledow do ukrytych warstw} | |
_i:=_siec.liczba_w; | |
for _i2:=1 to _siec.liczba_n[_i] do | |
_delta[_i,_i2]:=(_uczacy.wy[_i2]-_out[_i,_i2]){*_out[_i,_i2]*(1-_out[_i,_i2])}; | |
for _i:=_siec.liczba_w-1 downto 2 do | |
for _i2:=1 to _siec.liczba_n[_i]-1 do begin | |
_delta[_i,_i2]:=0; | |
if _i+1<>_siec.liczba_w then | |
for _i3:=1 to _siec.liczba_n[_i+1]-1 do | |
_delta[_i,_i2]:=_delta[_i,_i2]+_out[_i,_i2]*(1-_out[_i,_i2])*_delta[_i+1,_i3]*_siec.wagi[_i+1,_i3,_i2] | |
else | |
for _i3:=1 to _siec.liczba_n[_i+1] do | |
_delta[_i,_i2]:=_delta[_i,_i2]+_out[_i,_i2]*(1-_out[_i,_i2])*_delta[_i+1,_i3]*_siec.wagi[_i+1,_i3,_i2]; | |
end; | |
{poprawa wag} | |
for _i:=2 to _siec.liczba_w do | |
if _i<>_siec.liczba_w then for _i2:=1 to _siec.liczba_n[_i]-1 do | |
for _i3:=1 to _siec.liczba_n[_i-1] do begin | |
waga_tmp:=_siec.wagi[_i,_i2,_i3]; | |
_siec.wagi[_i,_i2,_i3]:=_siec.wagi[_i,_i2,_i3] | |
+_uczacy.wsp_uczenia* _delta[_i,_i2]* _out[_i-1,_i3] | |
+_uczacy.momentum*(_siec.wagi[_i,_i2,_i3]-_uczacy.wagi_old[_i,_i2,_i3]); | |
_uczacy.wagi_old[_i,_i2,_i3]:=waga_tmp; | |
end | |
else for _i2:=1 to _siec.liczba_n[_i] do | |
for _i3:=1 to _siec.liczba_n[_i-1] do begin | |
waga_tmp:=_siec.wagi[_i,_i2,_i3]; | |
_siec.wagi[_i,_i2,_i3]:=_siec.wagi[_i,_i2,_i3]+_uczacy.wsp_uczenia* _delta[_i,_i2]* _out[_i-1,_i3] | |
+_uczacy.momentum*(_siec.wagi[_i,_i2,_i3]-_uczacy.wagi_old[_i,_i2,_i3]); | |
_uczacy.wagi_old[_i,_i2,_i3]:=waga_tmp; | |
end; | |
end; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment