|
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.
Zobacz
także: Tomasz
Woźniak: Dobór
architektury sieci neuronów dynamicznych za pomocą algorytmu A* - budowa
symulatora
|