Skip to content

Instantly share code, notes, and snippets.

@lethern
Created June 19, 2020 21:27
Show Gist options
  • Save lethern/c48b776c83b32aff79b2c67b7a7685e1 to your computer and use it in GitHub Desktop.
Save lethern/c48b776c83b32aff79b2c67b7a7685e1 to your computer and use it in GitHub Desktop.
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