Pokazywanie postów oznaczonych etykietą CNN. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą CNN. Pokaż wszystkie posty

czwartek, 22 marca 2018

CNN - Fully Connected Layer (FC) -> warstwa w pełni połączona

Położenie warstwy w strukturze CNN
Fully Connected Layer (FC Layers) tzw. warstwa gęsta (ang. dense layer), wchodzi w skład tzw. warstwy klasyfikującej.

Jest to najcześciej przedostatnia warstwa w sieci CNN (Convolutional Neural Networks).
Za nią może być np. warstwa softmax.




Jakie jest jej zadania
Warstwy konwolucyjna, ReLU i pooling mogą służyć do wykrycia złożonych wzorców, a do wsparcia ostatecznej klasyfikacji obiektu stosuje się tzw. warstwę gęstą (ang. dense layer lub fully connected layer.
Warstwa ostatecznie identyfikuje do jakiej klasy należy obiekt wejściowy.
Zwraca prawdopodobieństwo, że obiekt na zdjęciu jest określonego rodzaju.


Najnowsze projekty ConvNet jednak pokazały, że można je skonstruować sieć CNN bez warstw FC Layer. Najnowsze modele takie jak GoogleNet i ResNet, pokazują, że warstwę FC Layer można zastąpić Global Average Pooling Layer (GAP Layer), która ma o wiele mniej parametrów i większą dokładność klasyfikacji. 
Dlatego coraz więcej modeli preferuje odrzucanie FC Layer na rzecz lepszej wydajności.


Budowa warstwy
W FC Layer każdy neuron jest połączony z każdym neuronem z poprzedniej warstwy, a każde połączenie ma swoją własną wagę.



 
Ważną rzeczą w Fully Connected Layer są właśnie wagi połączeń. Są one tym, czego nauczyła się sieć.  
Kiedy trenujesz sieć, ciągle dostosowujesz te wagi w górę i w dół, aż sieć zrobi to, co chcesz.  
Kiedy ludzie mówią o "wyuczonych parametrach" sieci neuronowej, mówią o tych wagach.

Suma iloczynu danych wejściowych i wag w każdym węźle wyjściowym określa prawdopodobne przypisanie do klasy wynikowej.

Rozpatrzy taki przykład sieci:


Fully Connected Layer to spłaszczona jednowymiarowa tablica poprzedniej warstwy wynikowej (może to być zarówna wartwa konwolucyjna, pooling jak i inna fully connected layer), w tym przypadku warstwy polling.






Fully Connected Layer (FC) vs Convolutional layers (CONV)
Warstwy konwolucyjne (CONV) pomagają wyodrębnić pewne cechy z obrazu, podczas gdy Fully Connected Layer (FC) może generalizować te cechy na przestrzeń wyjściową (ponieważ nie ma struktury wag, takiej jak CN). W ten sposób przechodzisz od warstwy najmniej elastycznej do najbardziej elastycznej.

Warto zauważyć, że jedyną różnicą między warstwami FC i CONV jest to, że neurony w warstwie CONV są połączone tylko z lokalnym regionem w danych wejściowych i że wiele neuronów w woluminie CONV mają wspólne parametry. 



Postać funkcjonalna obu warstw jest identyczna. Możliwa jest zatem konwersja pomiędzy warstwami FC i CONV.

FC to warstwa bardzo pamięciożerna ze względu na przechowywanie informacji o każdym neuronie i jego wagach i wszystkich połączeniach. Kompresja ma tu kluczowe znaczenie dla zmniejszenia pamięci i kosztów obliczeniowych sieci neuronowych.
W porównaniu z warstwą konwolucyjną, gdzie każdy neuron przechowywał informację tylko o połączeniach z sąsiednim neuronem z poprzedniej warstwy. 

Zasadniczo FC Layer ma największą liczbę wag. Ta warstwa może zatem wymagać czasu na trening w porównaniu do innych warstw. 


Fully Connected Layers a uczenie
Wyobraź sobie teraz, że chcesz zbudować własny model, aby rozpoznać słodkie koty.
Jeśli zaczynasz od zera, musisz podać dużą liczbę przykładów ćwiczeń, aby model uczył się rozpoznawać, co jest kotem w pierwszej kolejności. Możesz zamiast tego wziąć istniejący, dobrze działający model z już wyuczonymi ciężarami np. ImageNet.

Ideą jest to, że oryginalny model nauczył się rozpoznawać ogólne cechy w warstwach CNN i można je ponownie wykorzystać (rozpoznaje koty i inne obiekty). Górna warstwa działa poza generalizacją i skupia się na konkretnych elementach, które znajdują się w zestawie treningowym.

Usuń zatem wierzchnią warstwę (Fully Connected Layer), która wyuczyła się klasyfikowania obiektów do etykiet. Nie interesują Cię przecież wszystkie etykiety, których nauczył się oryginalny model, tylko same koty. Poprzez trening na naszych obiektach (słodkich kotkach) nauczysz sieć rozpoznawać detale słodkich kotków poprzez stworzenie swojej specyficznej dla twoich potrzeb, warstwy Fully Connected Layer.


Multiple Fully Connected Layers
Istnieją pewne architektury CNN, które wykorzystują wiele w pełni połączonych warstw na końcu sieci. Poniższy przykład - ma dwie w pełni połączone warstwy, a na końcu warstwę softmax.



SOFTMAX
Celem wypracowania decyzji klasyfikacyjnej, wyjściowa warstwa typu Fully Connected Layer jest poddawana działaniu aktywacji za pomocą funkcji, którą formalnie utożsamia się z istnieniem oddzielnej warstwy o nazwie Softmax.

Funkcja typu softmax oblicza dla każdego neuronu z ostatniej warstwy typu FullConnected prawdopodobieństwo  przynależności  obrazu  wejściowego do określonej kategorii.



Materiały
http://andrew.gibiansky.com/blog/machine-learning/convolutional-neural-networks/
https://www.safaribooksonline.com/library/view/deep-learning/9781491924570/ch04.html
https://leonardoaraujosantos.gitbooks.io/artificial-inteligence/content/fc_layer.html

środa, 31 stycznia 2018

Konwolucyjne sieci neuronowe (CNN) - proste przykłady

Przykład rozpoznawania slash, backslash, kółko i krzyżyk
Bazując na filmach: 

Zakładamy, że obrazki slash and backslash mają wymiary 2x2 piksele.
Rozkładamy na postać 4x1 :


Filtr backslash
Mamy wzorzec backslash, gdzie wartości 1 odpowiada + a wartości -1 odpowiada -.


Kiedy nałożymy filtr backslash na obrazek backslash wynik sumowania znaków po kolumnach (dla rozmiaru 4x1) daje nam wartość 4:  (+1) + (+1) + (+1) + (+1) = 1 + 1 + 1 + 1 = 4 .
Jest to najwyższy wynik mówiący, że badany element jest zgodny z filtrem.



Przykładowy test rozpoznania backslash
Nakładamy wzorzec backslash na badany element.
Ustalamy znaki pomiędzy wzorcem a testowanym elementem.
Wzorzec ma znaki: +, -, -, +. Testowany element ma znaki: +, +, -, +.


Wynik sumowania znaków po kolumnach (dla rozmiaru 4x1): +, -, +, + (plus i minus daje minus , plus i plus daje plus). Następnie sumujemy jedynki.
Przykład dla pierwszego wzorca:  (+1) + (-1) + (+1) + (+1) = 1-1+1+1=2
Im wyższa wartość tym element testujący jest podobny do wzorca.

Drugi przykład


Wartość -2 sugeruje, że podany przykład daleko odbiega od wzorca.

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

Przykład rozpoznawania slash, backslash, kółka i krzyżyka.


Obrazki mają tym razem wymiary 3x3.
Możemy zauważyć, że każdy z obrazków 3x3 składa się ze złożenia elementów 2x2 odpowiadających slash i backslash.


Oto sieć którą będzie analizować:

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

Tworzenie Convolution Layer

Warstwę konwolucyjną tworzą filtry wykrywające pewną niskopoziomową cechę obrazka.
Naszymi filtrami są obrazki reprezentujące backslasha i slash:


Analiza dla obrazka X
Nasze filtry (2x2 piksele) mogą wystąpić w dowolnym obszarze obrazka więc w każdym obszarze musimy je wykrywać w taki sam sposób:
UWAGA
Jeśli mielibyśmy obrazek o wymiarach m× n, a chcielibyśmy skonstruować filtr obejmujący obszar o rozmiarze k× l (dla k < m i l < n ), to potrzebowalibyśmy co najmniej (m − k+ 1) × (n − l + 1) neuronów filtrujących daną cechę (czasami rozszerza się obrazek o piksele zerowe na brzegach, np. aby zachować taką samą liczbę neuronów z warstwy wejściowej i neuronów filtrujących). 

W naszym przykładzie dla jednego filtra potrzebne jest (3-2+1)x(3-2+1)=2x2=4 neurony na filtr. Czyli mając dwa filtry / i \ mamy 8 neuronów kodujących.
-------------------------------------------------------------------------------------------------------------------------- 

Tworzenie Pooling Layer

Badamy nasz obrazek wejściowy poprzez nałożenie naszego pierwszego filtra na wszystkie fragmenty badanego obrazka (równe co do wielkości wielkości filtra 2x2).
Jeśli wynikiem jest nasza liczba zgodności (liczba dodatnia 4) to znaczy ze znaleźliśmy nasz wzorzec.

 
 W poniższym przypadku nie mamy zgodności (liczba ujemna -4) ze wzorcem czyli nic nie znaleźliśmy.
To samo robimy dla dolnych elementów z siatki 3x3.


To samo robimy z drugim filtrem (dolnym):

Doszliśmy do przekształcenia obrazka 3x3 na obrazek 2x2 wykorzystując do tego filtry warstwy konwolucyjnej:


Powyższy wynikowy obrazek jest tym co komputer widzi po konwolucji - z większego obrazka mamy mniejszy zawierające elementy pasujące do filtrów.

Warstwa konwolucyjna wprowadza redundancje danych. Sąsiednie jednostki częściowo pokrywają te same obszary danych wejściowych. W celu poradzenia sobie z tym zjawiskiem wprowadzony jest kolejny rodzaj warstwy – tzw. pooling layer albo subsampling layer.

Warstwy pooling pomagają wydobyć najważniejsze cechy z wcześniejszych warstw.


Analiza dla obrazka O:


Dla \ :



Dla / :


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

Jak tworzymy Fully Connected Layer

Do wsparcia ostatecznej klasyfikacji obrazka stosuje się tzw. warstwę gęstą (ang. dense layer lub fully connected layer).

Analiza dla X:
Zamieniamy teraz nasz obrazek 2x2 na 4x1 :

Następnie tworzymy matryce, w której umieszczamy informację, gdzie znaleźliśmy nasze bazowe filtry \ i / w obrazku 4x1 :
Oto kolejne etapy wypełnienia matrycy dla \ i / :


Oto jak wyglądają macierze dla wszystkich obrazków:


Nasze matrycę są ostatecznie filtrami (składającymi sie z + i - ) dla poszczególnych obrazków:

Następnie porównujemy każdą macierz z każdym filtrem.
Przykład dla X:
Jak wyliczamy pojedynczą macierz dla pierwszego filtra:


Jak to wygląda dla pozostałych filtrów:


Filtr z najwyższą wartością "8" jest właściwym filtrem dla obrazka wejściowego.

Oto jak wygląda Fully Connected Layer dla wszystkich symboli:

-------------------------------------------------------------------------------------------------------------------------- 
Oto cała sieć po połączeniu wszystkiego w całość:

--------------------------------------------------------------------------------------------------------------------------
Oto jaka jest ścieżka dla rozpoznania X:
--------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------

Rozpatrzmy bardziej rozbudowany przypadek

Rozwiążmy problem czy obrazek po prawej stronie odpowiada obrazkowi na lewej stronie.
 




CNN porównują obrazek kawałek po kawałku. Te kawałki nazywamy cechami (features).

Dzięki znalezieniu dopasowań przybliżonych elementów w mniej więcej w tych samych pozycjach na dwóch obrazach, CNN uzyskuje lepsze dopasowanie niż dopasowywanie całego obrazu.


Każda cecha jest mini dwuwymiarowym obrazkiem.W przypadku obrazów X, cechy składające się z ukośnych linii i krzyżyków przechwytują wszystkie ważne cechy większości X-ów. Te cechy będą prawdopodobnie pasować do ramion i środka dowolnego obrazu X.

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

Konwolucja

Konwolucja ma za zadanie określenie stopnia dopasowania filtra (w naszym przypadku obrazek o wymiarach 3x3) do poszczególnych fragmentów obrazka wejściowego.

Przykład obliczeń konwolucyjnych dla filtra backslash:



Wynik konwolucji przeprowadzony na całym obrazie:


Jeden obraz stał się stosem przefiltrowanych obrazów
Oto jak wygląda wynik konwolucji dla wszystkich filtrów backslash, X i slash:



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

Pooling layer
Pooling layer kompresuje obraz. Najpopularniej poprzez wybranie maksymalnej wartości (max-pooling) z danego analizowanego fragmentu obrazu.







Pooling przeprowadzony dla wszystkich filtrów:



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

ReLU (Rectified Linear Units) layer
Można wprowadzić dodatkową warstwę ReLu pomiędzy warstwe konwolucji a pooling.


Normalizacja - operacji na obrazie polega na zamianie wszystkich ujemnych wartości na zero.


Wynik operacji warstwy ReLU dla wszystkich obrazków:


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

Oto jak wyglądają wszystkie warstwy razem:


Warstwy można powielać:


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

Full Connected Layer 

Decyzja przynależności obrazka wejściowego do odpowiedniej klasy wyjściowej w przypadku obrazka idealnie spełniającego wymagania jednej z klas jest prosta.  
Poniżej sieć jest skonstruowana do rozpoznawania X więc komórki z wartością 1 wykazują na wzorzec X.



Dla wzorca rozpoznającego O:

Rozpatrzmy przykład gdzie obrazek wejściowy nie jest jednoznaczny:


Ponieważ dla wzorcowego przypadku X i O wiemy, która połączenia neuronów prowadzą do które klasy obiektu, wyliczamy średnią wartość: poniżej jest to wartość .92:


 To samo robimy dla połączeń dominujących do klasy O:


Najwyższa wartość będzie nam określać klase dla której obrazek wejściowy należy. 
W poniższym przypadku do klasy X.


Oto jak wygląda symboliczne oznaczenie tej warstwy:

Warstwę można powielać.

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

Oto jak może wyglądać nasz sieć w całości:

 

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

Materiały