8. Kompresja obrazu - sieć Kohonena

Transkrypt

8. Kompresja obrazu - sieć Kohonena
8. Kompresja obrazu - sieć
Kohonena
Dzisiejsze zadanie będzie połączeniem dwóch poprzednich. Wykorzystamy sieć samoorganizującą jako narzędzie do kompresji obrazu. Sieć samoorganizująca omawiana
w zadaniu poprzednim jest nazywana siecią Kohonena.
Do kompresji obrazu wykorzystamy sieć z zadania 7, która będzie składała się z
64 wejść oraz N neuronów pierwszej warstwy. Liczba N będzie wpływała na stopień
kompresji pliku (im większa tym mniejszy współczynnik kompresji) i powinna być
zmienną, którą możemy ustalać w momencie uruchamiania programu.
Jak zatem wykorzystać sieć Kohonena do omawianego zagadnienia i czym będzie kompresja? Pierwszym krokiem, jaki należy wykonać jest wygenerowanie zbioru
wektorów wejściowych. Będzie to zbiór 3p wektorów 64−elementowych. Sposób ich
generowania został omówiony w zadaniu 6. Mając zbiór wejściowy należy postępować godnie z algorytmem:
1. Ustalenie struktury sieci, to znaczy ilości neuronów, gdyż ona determinuje
zdolności sieci do wykrywania różnej ilości grup.
2. Wczytanie zbioru wejść.
3. Wylosowanie wartości wag dla każdego neuronu.
4. Normalizacja wag i wczytanych sygnałów wejściowych według wzoru:
xi
xi = qP
N
i=1
x2i
gdzie N jest ilością wejść.
5. Powtarzaj założoną ilość kroków:
(a) Wybierz wzorzec p.
(b) Oblicz sygnały wyjściowe dla wzorca p.
(c) Znajdź neuron o największej wartości sygnału na wyjściu. Oznacz go jako
winner.
(d) Zmień wagi winner’a tak aby były bliższe wzorcowi p według wzoru:
wi = wi + η[xi − wi ]
gdzie i = 1...N , N jest ilością wejść, η jest współczynnikiem uczenia.
Współczynnik uczenia należy zmniejszać. Na początku może być większy,
na przykład 0.2, a następnie powinien dążyć do zera.
1
6. Na zakończenie dla każdego wektora wejściowego zapamiętujemy numer neuronu, który zareagował najsilniej (winner’a).
Algorytm uczenia sieci dokona podziału wektorów wchodzących w skład zbioru
uczącego na grupy. Grup tych będzie co najwyżej tyle z ilu neuronów składała się
sieć. Na tej podstawie dokonamy procedury tworzenia pliku, będącego kompresją
rozważanego obrazka. Plik będzie miał strukturę:
• N - liczba neuronów
• n linii, z których każda będzie wektorem wag kolejnych neuronów
• 3p linii, z których każda będzie zawierała numer neuronu zwycięzcy dla kolejnych wektorów wejściowych
Tak utworzony plik zawiera pełną informację o sieci. Jest przechowywana liczba
neuronów. Znamy długość wektora wejściowego oraz macierz wag. Wiemy również,
jak zostały sklasyfikowane wektory wejściowe. Aby dokonać dekompresji należy odtworzyć dla każdego wejścia odpowiadający mu wektor wejściowy. Nie będzie to
jednak dokładnie ten wektor. Dla każdej grupy wektorów odpowiadającej poszczególnym neuronom wygenerujemy jeden wektor, jako reprezentant tej grupy. Będzie
to wektor wag przypisanych neuronowi. Oznacza to, że wszystkie wektory wejściowe,
dla których zwyciężył i−ty neuron zostaną zdekompresowane jako ten sam wektor
– wektor wag i−tego neuronu. Wektor ten jest czymś w rodzaju średniej wektorów
wejściowych generujących obszar wpływów rozważanego neuronu. Łatwo zauważyć,
że zdekompresowany obraz będzie składał się z takiej ilości różnych klastrów ile
mieliśmy neuronów winnerów.
Jeżeli wektory wejściowe należące do obszaru jednego neuronu nie różniły się
między sobą, nie wystąpią straty podczas dekompresji. W sytuacji przeciwnej – gdy
różnicę będą występowały, wszystkie (mimo że różne między sobą) wektory zostaną
odtworzone jako ten sam wektor. Wówczas wystąpią duże straty kompresji. Można
im zapobiec, dokonując zmian wektorów wag o pewną wartość losową. Wartość ta
będzie zależała od stopnia rozproszenia wektorów wejściowych należących do jednego
obszaru. Użyjemy w tym celu miary rozrzutu.
W wyniku procesu uczenia wektory wejściowe zostały podzielone na grupy. Dla
każdej z tych grup wyliczymy stopień rozproszenia wektorów wejściowych zgodnie
ze wzorem:
sP
n
k
¯k 2
j=1 (xj − x )
,
sik =
n
gdzie
• i− numer grupy (i ¬ N )
• k− współrzędna wektora wejściowego (k = 1, ..., 64)
• n− liczba wektorów w i−tej grupie
• x¯k − średnia arytmetyczna xkj , j = 1, ..., n.
Tak wyliczone miary rozrzutu będą wektorami 64−elementowymi, z których każdy przypisany jest do innego neuronu zwycięzcy. Informacja o rozrzucie musi być
przechowywana w pliku kompresji. Teraz będzie on miał strukturę:
• N - liczba neuronów
2
• n linii, z których każda będzie wektorem wag kolejnych neuronów
• 3p linii, z których każda będzie zawierała numer neuronu zwycięzcy dla kolejnych wektorów wejściowych
• liczba neuronów winnerów linii, z których każda będzie zawierała wektor
rozrzutu odpowiadających mu danych wejściowych
Mając wyliczoną miarę rozrzutu zmieni się sposób dekompresji. Dekompresją każdego wektora wejściowego będzie wektor wag odpowiadającego mu neuronu zwycięzcy
zmodyfikowany o miarę rozrzutu. Dokonamy tego zgodnie z wzorem:
xik = wki + ρsik ,
gdzie
• i− numer wzorca
• k− numer współrzędnej
• ρ− wartość losowa z przedziału [−1, 1].
Tak dokonana modyfikacja pozwoli zastąpić jeden wektor reprezentujący dany
neuron zwycięzcę kilkoma wektorami stanowiącymi jego modyfikację. Modyfikacja
będzie tym większa im większy jest rozrzut wektorów wejściowych.
Zadanie
Zadanie będzie polegało na dokonaniu kompresji i dekompresji obrazu wykorzystując
powyższą sieć i algorytm. Należy napisać dwa programy, z których jeden będzie
wykorzystywał miarę rozrzutu, a drugi nie. Pozwoli to na zaobserwowanie wpływu
modyfikacji wektora wag w zależności od rozproszenia danych wejściowych.
3