Praca magisterska



Pobieranie 1,5 Mb.
Strona14/16
Data24.02.2019
Rozmiar1,5 Mb.
1   ...   8   9   10   11   12   13   14   15   16
i-tego neuronu z wejściem m-tego neuronu nie zależą od j. Wynika to z faktu, że rozważając sieć Hopfielda na tym etapie nie dyskutujemy jej uczenia. Zakładamy, że wartości zostały wcześniej ustalone za pomocą jakiegoś algorytmu ( najczęściej przyjmuje się tu algorytm Hebba) i obecnie nie podlegają zmianom. Numer j oznacza natomiast chwilę czasową, określającą w jakim momencie procesu dynamicznego następującego pop pobudzeniu sieci obecnie się znajdujemy. Zagadnienie to będzie niżej dokładnie dyskutowane. Po drugie sumowanie sygnałów wyjściowych z poszczególnych neuronów w wzorze definiującym łączne pobudzenie odbywa się po wszystkich elementach czyli po wszystkich elementach sieci. Oznacza to, że w sieci przewidziane są także połączenia z warstw dalej położonych (wyjściowych) do warstw wcześniejszych - czyli sprzężenie zwrotne.

Jak było to wcześniej odnotowane, sieć o takim schemacie połączeń nazywana jest siecią autoasocjacyjną. W ramach tego sprzężenia każdy neuron jest także połączony jednym z wejść ze swoim własnym wyjściem, zatem zasada autoasocjacyjności odnosi się także do pojedynczych neuronów. Każdy neuron sieci ma także kontakt z pewnym, odpowiadającym mu sygnałem wejściowym , zatem zaciera się tu podział na warstwę wejściową i pozostałe warstwy sieci.

Procesy zachodzące w sieciach Hopfielda są zawsze stabilne. Stabilność procesów w sieci Hopfielda osiągnięto dzięki:



  • wprowadzeniu bardzo regularnej struktury wewnętrzną sieci - w całej sieci neurony są łączone na zasadzie "każdy z każdym";

  • zabronione są sprzężenia zwrotne obejmujących pojedynczy neuron.

  • wprowadzane współczynniki wagowe muszą być symetryczne - to znaczy jeśli połączenie od neuronu o numerze x do neuronu o numerze y charakteryzuje się pewnym współczynnikiem wagi w, to dokładnie taką samą wartość w ma współczynnik wagowy połączenia biegnącego od neuronu o numerze y do neuronu o numerze x.

Z siecią Hopfielda kojarzy się tzw. „funkcje energii” (nazwa ta ma charakter czysto umowny – nie jest związana z rzeczywistą energią), zwaną też funkcją Lapunowa. Funkcja ta opisuje zbiór stanów sieci Hopfielda, zdefiniowanych przez zbiór wartości wyjść elementów przetwarzających tejże sieci. Można udowodnić, ze funkcja taka, dla sieci Hopfielda w skończonej ilości kroków osiągnie swoje minimum lokalne oraz że jest to funkcja nierosnąca w czasie – co jest równoznaczne ze stwierdzeniem, że procesy zachodzące w sieci Hopfielda są procesami stabilnymi.

Łatwość budowy i stosowania sieci Hopfielda powoduje, że są one bardzo popularne. Znajdują one liczne zastosowania - między innymi przy rozwiązywaniu zadań optymalizacji, a także przy generacji określonych sekwencji sygnałów, następujących po sobie w pewnej kolejności. Pozwala to za pomocą takich sieci tworzyć i wysyłać do różnych obiektów sygnały sterujące. Sieci Hopfielda mogą także pracować jako tzw. pamięci autoasocjacyjne.

Koncepcja pamięci autoasocjacyjnej wiąże się z jedną z podstawowych funkcji mózgu – z odtwarzaniem całości informacji na podstawie informacji niepełnej. Jest to zdolność sieci do prawidłowego zinterpretowania danych zniekształconych lub niekompletnych. Sieć pracująca jako pamięć autoasocjacyjna może także usuwać zakłócenia i zniekształcenia różnych sygnałów - także wtedy, gdy stopień „zaszumienia” sygnału wejściowego wyklucza praktyczne użycie jakichkolwiek innych metod filtracji.
struktury danych algorytmu:

Wagi – wektor wag neuronów w sieci

Wzorzec – wektor wzorców rozpoznawanych przez sieć

rozM - rozmiar sieci - poziomo (domyślnie 25)

rozN rozmiar sieci - pionowo (domyślnie 25)

nMax – ilość neuronów w sieci

Użyta w programie procedura TabNaWzorzec przepisuje do wzorca wartość elementy tymczasowego, procedura WzorzecNaTab działa dokładnie odwrotnie.
for k := 1 to 16 do

if tZrB[k] then begin

Inc(nElem);

if nrWzorca = k then nrWz := nElem;

TabNaWzorzec(tZr[k],Wzorzec[nElem]);

end;
if nrWz = 0 then

Exit;
( ustawinie wag sieci }

for k := 1 to nMax do begin

for i := 1 to k-1 do begin

Wagi[k,i] := 0;

for j := 1 to nElem do

Wagi[k,i] := Wagi[k,i] + (Wzorzec[j,k]*Wzorzec[j,i]);

Wagi[i,k] := Wagi[k,i];

end;


end;
Randomize;

{ przpisanie wzorca 1 do wzorca 2 i wprowadzenie zmian dla wzorca 2}

for i := 0 to 25 do

for j := 0 to 25 do

tOdp[2,i,j] := tOdp[1,i,j];

for i := 1 to Trunc(enZmPkt.Value) do begin

j := Trunc(rozM*Random);

k := Trunc(rozN*Random);

tOdp[2,j,k] := 1 - tOdp[2,j,k];

end;
{przerysowanie ekranu}

.....
{ przepisanie zmienionego wzorca do obszaru roboczego }

TabNaWzorzec(tOdp[2],Wzorzec[21]);

TabNaWzorzec(tOdp[2],Wzorzec[22]);
Licz1 := 0; Licz2 := 0;

{ rozpoznawanie }

repeat

for i := 1 to nMax do



Wyj[i] := Wzorzec[21,i];
{ oblicznie odpowiedzi sieci }

for i := 1 to nMax do begin

wy := 0;

for j := 1 to nMax do

if i <> j then

wy := wy + (Wyj[j]*Wagi[j,i]);


if wy > 0 then

Wyj2[i] := 1;


if wy < 0 then

Wyj2[i] := -1;


if wy = 0 then

Wyj2[i] := Wyj[i];

end;
{ oblicznie różnic i ustawienie liczników }

rozn1 := 0; rozn2 := 0;

for i := 1 to nMax do begin

if Wyj2[i] <> Wzorzec[22,i] then

Inc(rozn2);

Wzorzec[22,i] := Wyj[i];

Wzorzec[23,i] := -1;

if Wyj2[i] <> Wyj[i] then begin

Inc(rozn1);

Wzorzec[23,i] := 1;

end;

Wyj[i] := Wyj2[i];



Wzorzec[21,i] := Wyj[i];

end;


if rozn1 = 0 then Inc(Licz1);

if rozn2 = 0 then Inc(Licz2);


{ rysuneki i opisy kroku rozpoznania }

if (Licz1 < 2) and (Licz2 < 3) then begin

Inc(iKrok);

WzorzecNaTab(Wzorzec[21],tOdp[iKrok]);

WzorzecNaTab(Wzorzec[23],tRoz[iKrok-2]);

{wyrysowanie kroku rozpoznawania na ekranie}

end;

until (Licz1 = 2) or (Licz2 = 3) or (iKrok = 49);





1   ...   8   9   10   11   12   13   14   15   16


©operacji.org 2017
wyślij wiadomość

    Strona główna