Rozumiem, że warstwa splotowa splotowej sieci neuronowej ma cztery wymiary: kanały wejściowe, wysokość filtru, szerokość filtru, liczba filtrów. Co więcej, rozumiem, że każdy nowy filtr jest po prostu zawijany przez WSZYSTKIE kanały wejściowe (lub mapy funkcji / aktywacji z poprzedniej warstwy).
JEDNAK grafika poniżej z CS231 pokazuje, że każdy filtr (na czerwono) jest stosowany do POJEDYNCZEGO KANAŁU, a nie ten sam filtr stosowany w kanałach. To wydaje się wskazywać, że istnieje KAŻDY filtr dla KAŻDEGO kanału (w tym przypadku zakładam, że są to trzy kolorowe kanały obrazu wejściowego, ale to samo dotyczy wszystkich kanałów wejściowych).
Jest to mylące - czy dla każdego kanału wejściowego istnieje inny unikalny filtr?
Źródło: http://cs231n.github.io/convolutional-networks/
Powyższy obraz wydaje się być sprzeczny z fragmentem „Podstawy głębokiego uczenia się” O'reilly :
„... filtry nie działają tylko na jednej mapie obiektów. Działają na całej objętości map obiektów, które zostały wygenerowane na określonej warstwie ... W rezultacie mapy obiektów muszą być zdolne do działania na objętościach, nie tylko obszary ”
... Rozumiem również, że poniższe obrazy wskazują, że filtr SAME SAM jest po prostu splatany we wszystkich trzech kanałach wejściowych (sprzeczne z tym, co pokazano na powyższej grafice CS231):
Odpowiedzi:
Były. W rzeczywistości dla każdej kombinacji kanałów wejściowych / kanałów wyjściowych zdefiniowano osobne jądro.
Zazwyczaj w architekturze CNN, w jednym filtrze, jak opisano w
number_of_filters
parametrze, jest jedno jądro 2D na kanał wejściowy. Istniejąinput_channels * number_of_filters
zestawy wag, z których każdy opisuje jądro splotu. Tak więc schematy przedstawiające jeden zestaw wag na kanał wejściowy dla każdego filtra są prawidłowe. Pierwszy diagram pokazuje również wyraźnie, że wyniki zastosowania tych jąder są łączone przez ich sumowanie i dodawanie odchylenia dla każdego kanału wyjściowego.Można to również postrzegać jako użycie splotu 3D dla każdego kanału wyjściowego, który ma taką samą głębokość jak wejście. To właśnie pokazuje twój drugi diagram, a także to, co wiele bibliotek zrobi wewnętrznie. Matematycznie jest to ten sam wynik (pod warunkiem, że głębokości dokładnie pasują), chociaż typ warstwy jest zazwyczaj oznaczony jako „Conv2D” lub podobny. Podobnie, jeśli typ wejścia jest z natury 3D, taki jak woksele lub wideo, możesz użyć warstwy „Conv3D”, ale wewnętrznie można ją zaimplementować jako splot 4D.
źródło
input_channels
wersji o różnych wagach . Czy masz „oficjalne” źródło, które potwierdza to zrozumienie?Poniższy obraz użyty w pytaniu bardzo dokładnie opisuje, co się dzieje. Pamiętaj, że każdy element filtra 3D (szara kostka) składa się z innej wartości (
3x3x3=27
wartości). Tak więc można połączyć trzy różne filtry 2D o rozmiarze,3x3
tworząc jeden filtr 3D o rozmiarze3x3x3
.Fragment
3x3x3
RGB z obrazu jest mnożony elementarnie przez filtr 3D (pokazany jako szary). W takim przypadku filtr ma3x3x3=27
ciężary. Gdy te wagi zostaną pomnożone przez element, a następnie zsumowane, daje to jedną wartość.Czy istnieje oddzielny filtr dla każdego kanału wejściowego?
TAK , na obrazie jest tyle filtrów 2D, ile jest kanałów wejściowych. Jest to jednak pomocne, jeśli uważasz, że dla matryc wejściowych z więcej niż jednym kanałem istnieje tylko jeden filtr 3D (jak pokazano na powyższym obrazku).
Dlaczego więc nazywa się to splotem 2D (jeśli filtr to 3D, a matryca wejściowa to 3D)?
Jest to splot 2D, ponieważ kroki filtra znajdują się tylko wzdłuż wymiarów wysokości i szerokości ( NIE głębokości), a zatem moc wyjściowa wytwarzana przez to splot jest również matrycą 2D. Liczba kierunków ruchu filtra determinuje wymiary splotu.
Uwaga: jeśli zbudujesz swoje zrozumienie, wizualizując pojedynczy filtr 3D zamiast wielu filtrów 2D (po jednym dla każdej warstwy), będziesz mieć łatwy czas na zrozumienie zaawansowanych architektur CNN, takich jak Resnet, InceptionV3 itp.
źródło
input_channels
wersji o różnych wagach. Jeśli tak rozumiesz, czy istnieje „oficjalne” źródło, które to potwierdza?Podążam za powyższymi odpowiedziami konkretnym przykładem w nadziei, że wyjaśnię, jak działa splot w odniesieniu do kanałów wejściowych i wyjściowych oraz wag:
Niech przykład będzie następujący (wrt na 1 warstwę splotową):
input_channels=5
output_channels=56
Zauważamy, że:
Ta warstwa splotowa zawiera zatem:
56 3-wymiarowych filtrów o rozmiarze 4x4x5 (= 80 różnych ciężarów każdy) w celu uwzględnienia 56 kanałów wyjściowych, z których każdy ma wartość dla trzeciego wymiaru 5, aby pasować do 5 kanałów wejściowych. W sumie są
number_of_filters=input_channel*output_channels=5*56=280
Filtry 2D o rozmiarze 4x4 (tj. Łącznie 280 x 16 różnych wag).
źródło
Istnieją tylko ograniczenia w 2D. Czemu?
Wyobraź sobie w pełni połączoną warstwę.
Byłoby strasznie ogromne, każdy neuron byłby podłączony do może neuronów wejściowych 1000 x 1000 x 3. Ale wiemy, że przetwarzanie pobliskiego piksela ma sens, dlatego ograniczamy się do małego sąsiedztwa 2D, więc każdy neuron jest połączony tylko z 3x3 w pobliżu neuronów w 2D. Nic nie wiemy o kanałach, więc łączymy się ze wszystkimi kanałami.
Nadal byłoby zbyt wiele obciążników. Ale z powodu niezmienności tłumaczenia, filtr działający dobrze w jednym obszarze jest najprawdopodobniej przydatny w innym obszarze. Dlatego używamy tego samego zestawu wag w 2D. Ponownie, nie ma takiej niezmienności tłumaczenia między kanałami, więc nie ma takiego ograniczenia.
źródło
Patrz sekcja „Łączność lokalna” w http://cs231n.github.io/convolutional-networks/ i slajd 7-18.
Hiperparametr „pola recepcyjnego” filtra jest definiowany tylko przez wysokość i szerokość, ponieważ głębokość jest ustalana przez głębokość poprzedniej warstwy.
UWAGA: „Zasięg łączności wzdłuż osi głębokości jest zawsze równy GŁĘBOKOŚCI objętości wejściowej” lub GŁĘBOKOŚCI mapy aktywacji (w przypadku późniejszych warstw).
Intuicyjnie musi to wynikać z faktu, że dane kanałów obrazu są przeplatane, a nie płaskie. W ten sposób zastosowanie filtra można osiągnąć po prostu przez pomnożenie wektorów kolumnowych.
UWAGA: Convolutional Network uczy się wszystkich parametrów filtra (w tym wymiaru głębokości) i są one sumą „h w input_layer_depth + 1 (bias)”.
źródło
Jako odpowiedź zalecam rozdział 2.2.1 mojej pracy magisterskiej . Aby dodać do pozostałych odpowiedzi:
Keras jest Twoim przyjacielem, aby zrozumieć, co się dzieje:
daje
Spróbuj sformułować swoje opcje. Co to oznaczałoby dla parametrów, gdyby coś innego miało miejsce?
Takie podejście pomaga również w przypadku innych typów warstw, nie tylko warstw splotowych.
Pamiętaj również, że możesz dowolnie wdrażać różne rozwiązania, które mogą mieć inną liczbę parametrów.
źródło
Żeby dwa szczegóły były absolutnie jasne:
Najprostszym sposobem, aby się o tym przekonać, jest wyobrażenie sobie, co dzieje się w innych scenariuszach i przekonanie się, że obliczenia ulegają degeneracji - to znaczy, jeśli nie przeplatasz i nie zrekombinujesz wyników, wówczas różne dane wyjściowe w rzeczywistości nic nie zrobią - one miałby taki sam efekt jak pojedyncze wyjście z połączonymi wagami.
źródło
Dla każdego, kto próbuje zrozumieć, w jaki sposób obliczane są zwoje, oto przydatny fragment kodu w Pytorch:
Uruchomienie tego daje następujące dane wyjściowe:
Zauważ, jak sumuje się każdy kanał splotu na wszystkich wyjściach poprzednich kanałów.
źródło