Proste sieci neuronowe

2011-04-07 00:00:00 +0100


Sieci neuronowe to nie tylko ciekawa zabawa ale i przydatne narzędzie, stosowane obecnie np. w systemach rozpoznawania obrazu. Eksperymenty z sieciami najłatwiej zacząć chyba od darmowego programiku Sharky Neural Network. Jest on celowo wyposażony w ograniczoną liczbę predefiniowanych sieci, by nie konfundować początkującego użytkownika dużą liczbą opcji.

Podstawowym parametrem sieci jest liczba i szerokość jej warstw wyrażana jako ciąg liczb. Np. sieć 2:10:2 ma na wejściu dwie komórki, w środku warstwę 10 komórek i na wyjściu znowu 2 komórki. Na obrazku poniżej można zobaczyć (po lewej stronie) czterowarstwową sieć 2:10:5:2.

Sieci w programie Sharky służą do generowania obrazków pasujących do zadanego wzorca. Obrazki na wejściu i wyjścią są zapisywane jako mapa bitowa. Każdy punkt obrazu jest opisywany przez dwie współrzędne (x i y) — stąd na wejściu sieci są dwie komórki (podobnie na wyjściu). Środek sieci (warstwy 10 i 5) to “czarna skrzynka”, której wartości są ustalane w trakcie procesu uczenia (guzik Learn).

Uczenie polega na nieznacznym modyfikowaniu parametrów warstw wewnętrznych i sprawdzaniu czy na wyjściu sieci pojawiają się oczekiwane wartości (pasujące do wzorca na wyjściu). Operacja ta może być powtarzana setki i tysiące razy — w programie Sharky można ją zatrzymać np. po osiągnięciu przez sieć stopy błędów 5% (szybciej) lub 0% (dłużej). Dokładnie to robi autor tego filmiku demonstracyjnego Sharky. Najpierw uczy sieć 2:10:10:2 rozpoznawania kształtu spirali, co wychodzi jej średnio przy stopie 5% i całkiem nieźle przy 0%. Potem próbuje tego samego na sieci 2:5:10:2, która z zadaniem nie daje sobie rady.

Kto chciałby pobawić się w programowanie sieci neuronowych powinien zwrócić uwagę na pakiet ffnet dla języka Python autorstwa Marka Wojciechowskiego. Stosunkowo prosty skrypt ocr, po nauczeniu, potrafi bezbłędnie rozpoznawać losowe cyfry zapisane jako mapa bitowa o wymiarach 8x8.

Ponieważ na wejściu mamy 64 bity (8x8), więc taki rozmiar ma też pierwsza warstwa sieci z tego przykładu. Na wyjściu oczekujemy cyfry, więc ostatnia warstwa ma rozmiar 10. Ostatecznie sieć z tego przykładu ma wymiary 64:10:10:10. Poniższy obrazek został wygenerowany przez przykład ocr i pokazuje rozpoznawanie losowej cyfry — pik na wykresie oznacza, że dla tej cyfry sieć zwróciła wartość i jak widać jest ona poprawna.

Przystępny opis podstaw programowania sieci neuronowych można znaleźć w artykule towarzyszącym innemu popularnemu programowi FANN.

Użytkownikom Windows trochę problemów może nastręczyć instalacja ffnet, które wymaga szeregu dodatków — numpy, scipy, matplotlib oraz networkx. Dodatkowo trzeba nieco zmodyfikować program ocr.py tam gdzie jest ładowana biblioteka pylab:

import matplotlib
matplotlib.use('WXAgg')
from matplotlib.pylab import *