wtorek, 30 stycznia 2018

Konwolucja - wstep do neuronowych sieci konwolucyjnych

Co to jest konwolucja (splot) - trochę matematyki?

W matematyce oraz technice, działanie określone dla dwóch funkcji dające w wyniku inną, która może być postrzegana jako zmodyfikowana wersja oryginalnych funkcji.

W kontekście przetwarzania obrazów funkcja f jest dwuwymiarową macierzą  I zawierającą wartości pikseli obrazu, zazwyczaj ma ona duże wymiary np. 600x400px, natomiast funkcja g, nasz filtr, jest zdecydowanie mniejszą macierzą K (zwaną convolution kernel) o rozmiarach h×w np. 3x3px, 5x5px itp.


W wyniku konwolucji obrazu z filtrem, otrzymamy nowy obraz, w którym każdy piksel został utworzony na podstawie jego sąsiedztwa. W zależności do wyboru filtra możemy otrzymać obraz rozmyty, wyostrzony lub z uwypuklonymi krawędziami.


--------------------------------------------------------------------------------------------------------------------------
Stride/step-size (przesunięcie/krok)

Stride (przesunięcie/krok) kontroluje to jak porusza się filtr na obiekcie wejściowym.Stride jest zwykle ustawiane w taki sposób, aby wielkość obiektu wyjściowego była liczbą całkowitą, a nie ułamkiem.

Jeśli przesunięcie jest duże w początkowych warstwach sieci to sieć będzie miała małe mapy aktywacji i odwrotnie.
Należy pamiętać, że większe mapy aktywacji mają większą dokładność klasyfikacji.

Zwykle programiści zwiększą krok, jeśli chcą, aby filtry mniej się pokrywały i jeśli chcą mieć mniejsze wymiary przestrzenne.

W przykładzie poniżej mamy przesunięcie o jeden 1. Filtr przesuwa się po pikselach wejściowych przesuwając się o jeden piksel naraz.


Zaś w tym przypadku poniżej przesunięcie jest co dwa piksele:

 
Przykład wyniku konwolucji na wejściowym obrazie 4x4, przy użyciu filtra 3x3 i kroku = 1, gdzie wynikiem jest obraz 2x2:

Przykład wyniku konwolucji na wejściowym obrazie 9x9, przy użyciu filtra 5x5 gdzie wynikiem jest obraz 5x5:
--------------------------------------------------------------------------------------------------------------------------
Padding (piksele brzegowe)

Jeśli na obiekcie wejściowym 32x32x3 zastosujemy filtr 5x5x3 i będzie konwulułować w standardowy sposób to uzyskamy obiekt wyjściowy o wielkości 28x28x3 (32-5+1) i przeprowadzając kilka takich konwolucji drastycznie zmniejszy nam się obiekt wyjściowy.

Jeśli warstwy CONV nie miałyby zerowych pikseli brzegowych, to wielkość obrazu zmniejszyłaby się o niewielką ilość po każdym CONV, a informacja na granicach by się "zmyła" zbyt szybko.

Jeśli chcemy zachować wielkość obiektu wejściowego na wyjściu musimy dodać wówczas zerowe piksele brzegowe.




 
Przykład wyniku konwolucji na wejściowym obrazie 5x5, przy użyciu filtra 3x3 i dodatkowej warstwy brzegowej gdzie wynikiem jest obraz o tym samym rozmiarze 5x5:






 --------------------------------------------------------------------------------------------------------------------------

Przykład obliczania konwolucji 2D

Obraz wejściowy ma rozmiar 8x8 pikseli, filtr 3x3 a obraz wynikowy rozmiar 6x6.
Nie uwzględnia pikseli brzegowych.


Obraz wejściowy ma rozmiar 6x6 pikseli, filtr 3x3 a obraz wynikowy rozmiar 7x7.
Uwzględnia piksele brzegowe - duplikując wiersz brzegowy.


---
Obraz wejściowy 5x5, filtr 3x3, obraz wynikowy 3x3:
---
obraz wejściowy 3x3, filtr 3x3, obraz wyjściowy 2x2:



--------------------------------------------------------------------------------------------------------------------------

Przykład przeliczania wielkości warstwy wyjściowej w 3D



inny przykład i jego wybrane etapy wyliczeń:












--------------------------------------------------------------------------------------------------------------------------
Wzór ogólny na obliczenie wielkości warstwy wynikowej konwolucji

- O nasz szukany wynik -> wielkość obiektu wyjściowego
- W wielkość obiektu wejściowego
- K wielkość filtra (dla filtra 5x5 to będzie 5)
- P wielkość zerowego brzegu z jednej strony (dlatego jest 2P dla obu stron)
- S to wielkość przesunięcia/kroku

--------------------------------------------------------------------------------------------------------------------------

Materiały

1 komentarz:

  1. Bardzo dobrze wytłumaczyłeś wstęp do sieci neuronowych. Czy będą kolejne wpisy z tej serii?

    OdpowiedzUsuń