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