wstecz | dalej  

 Archiwum Process Control Club 2001, poz.12  
 


Rozpoznawanie znaków przez
sztuczną sieć neuronową
dla początkujących


inż. Tomasz Woźniak

 

Streszczenie - Artykuł omawia problem rozpoznawania znaków przez sztuczną sieć neuronową, w tym przypadku przez sieć Hopfielda. Prezentacja odbywa się w oparciu o biblioteki dostępne w pakiecie obliczeniowym Matlab 4.2.


      Przy pomocy sztucznej sieci neuronowej możemy rozwiązywać zadania różnego typu. W artykule chciałbym przybliżyć problem jak i sam mechanizm rozpoznawania obrazów oraz znaków przez sieć neuronową. Generalnie problem ten sprowadza się do procesu rekonstruowania obrazu faktycznego z obrazu niekompletnego lub obarczonego zakłóceniami podanego na wejście sztucznej sieci neuronowej.
      Przy prezentacji i omawianiu problemu, który stanowi temat tego artykułu, posłużę się siecią Hopfielda, która jest najczęściej stosowana przy tego typu zadaniach. Nie będę się tu rozpisywał na temat samej sieci Hopfielda, gdyż jest to temat do oddzielnych rozważań.
      W celu przedstawienia (w sposób praktyczny) problemu rozpoznawania obrazów i cyfr posłużę się pewnym schematem, który stanowi często temat laboratorium dla studentów na kierunku informatyki.
      Na wstępie należy zaznaczyć, że sieć Hopfielda realizuję pamięć asocjacyjną. Jest to zapamiętywanie zbioru próbek wejściowych w taki sposób aby przy prezentacji nowej próbki układ (sieć neuronowa) mógł wygenerować odpowiedź odpowiadającą jednej z zapamiętanych wcześnie próbek. Ważnym parametrem pamięci asocjacyjnej jest jej pojemność, którą definiuje się jako maksymalną liczbę wzorców wejściowych zapamiętanych i odtwarzanych z dopuszczalnym błędem. Dla przykładu można podać, że gdy N oznacza liczbę elementów przetwarzających tworzących pamięć, a Pmax - maksymalną pamięć, to przy założeniu stabilności związanej ze stanem początkowym sieci, maksymalna pamięć określona jest zależnością Pmax = 0.15N.
      Na początku zakładamy, że sieć Hopfielda będzie rozpoznawać 10 cyfr odpowiednio zakodowanych i podawanych na wejście sieci. Kodowanie poszczególnych cyfr, które stanowić będą wzorce, dokonuję się na mapie o określonej wielkości. W tym przypadku, będzie to mapa o 35 polach w formacie 7x5. Każde pole w mapie to jeden bit w wektorze binarnym dla danej cyfry (1 - pole czarne, 0 - pole białe). Dla przykładu - wzorce cyfr 2, 5, 7 są przedstawione następująco:

     

Macierz binarna wzorców składa się w tej sytuacji z 10 wierszy i 35 kolumn. Każdy wiersz odpowiada jednej z cyfr. W celu zaimplementowania algorytmu rozpoznawania cyfr posłużyłem się pakietem obliczeniowym Matlab. Pakiet ten posiada wbudowane funkcję obsługujące proces uczenia się sieci Hopfielda. Mam tu na myśli funkcję solvehop.m i simhop.m.
      Pierwsza z nich projektuje odpowiednią architekturę sieci Hopfielda na podstawie macierzy wzorców. Parametrami wyjściowymi tej funkcji jest macierz odpowiednio dopasowanych wag oraz wektor biasu. Funkcja simhop.m dokonuje symulacji, a w efekcie realizuje proces uczenia sieci Hopfielda. Parametrami wejściowymi tej funkcji jest macierz wag, wektor biasu oraz wektor inicjujący (wektor zniekształcony lub nie kompletny w stosunku do określonego wiersza macierzy wzorców).
      Należy podkreślić, że proces uczenia sieci Hopfielda polega na takim dopasowaniu wag aby na etapie odtwarzania sieć była zdolna odnaleźć zbiór danych w sensie odległości Hamminga. Odległość Hamminga jest to liczba, której wartość określa ilość bitów, którymi różnią się dwa wektory.
      Sam algorytm jest bardzo krótki i poszczególne linie kodu łatwe do zrozumienia. Oto kod algorytmu:

load wzorce % załadowanie pliku z macierzą wzorców
CYFRY=CYFRY'; % operacja transponowania macierzy wzorców CYFRY
A=[11000000010001111111001000100011111]; % wektor inicjujący
[W,B]=solvehop(CYFRY); % generowanie macierzy wag W oraz wektora biasu B
Z=simhop(A',W,B,100); % generowanie nowego wektora Z który odpowiada danemu wierszowi z macierzy wzorców
for i=1:10, % pętla po dziesięci wierszach macierzy wzorców
e=sumsqr(Z-CYFRY(:,i)); % obliczanie sumy kwadratów błędów
errors=[errors e]; % zapisywanie uzyskanych błędów do wektora o nazwie errors
end
[wartosc,cyfra]=min(errors); % obliczanie minimalnego błędu po wszystkich wzorcach; wartość minimalna z wektor errors wskazuje rozpoznaną cyfrę z wektora inicjującego
cyfra=cyfra-1 % wyswetlenie na ekranie rozpoznanej cyfry



      Powyższy algorytm mimo swej prostoty jest bardzo efektywny. Po zmianie określonej liczby bitów w wektorze inicjującym, który stanowi zakłócony obraz wybranej cyfry, nadal uzyskujemy prawidłową identyfikację. Błędne rozpoznanie obrazu zakłóconego lub niekompletnego uzyskujemy wówczas, gdy zmienimy znaczące bity danej cyfry lub zmienimy ich zbyt dużo. W tej sytuacji może się zdarzyć, że cyfra 2 zostanie rozpoznana jako 7, lub cyfra 3 jako 8 lub 9. Należy zaznaczyć, że powyższy algorytm znajdzie w każdej sytuacji rozwiązanie (niekoniecznie trafne).
      W celu przeprowadzenia bardziej precyzyjnych badań nad rozpoznawaniem obrazów i znaków należy zastosować odpowiednio większe mapy przeznaczone do kodowania. Powyżej stosowane były mapy o niewielkich rozmiarach, które służyły jedynie do prezentacji problemu. Zachęcam do własnych prób.

Download: cyfry.m (324 bajty), wzorce.mat (3kB)

 

 Zobacz także: Tomasz Woźniak: Dobór architektury sieci neuronów dynamicznych za pomocą algorytmu A* - budowa symulatora