Jak działa operacja DepthConcat w „Zagłębianie się w zwoje”?

12

Czytając Idąc głębiej ze zwojów natknąłem się DepthConcat warstwie bloku budowlanego proponowanych modułów Incepcja , który łączy wyjście wielu tensorów o różnej wielkości. Autorzy nazywają to „Filter Concatenation”. Wydaje się, że istnieje implementacja Torch , ale tak naprawdę nie rozumiem, co ona robi. Czy ktoś może wyjaśnić prostymi słowami?

moi
źródło

Odpowiedzi:

9

Nie sądzę, aby dane wyjściowe modułu początkowego były różnych rozmiarów.

wprowadź opis zdjęcia tutaj

W przypadku warstw splotowych ludzie często używają paddingu, aby zachować rozdzielczość przestrzenną.

Dolna warstwa po prawej stronie (niebieska ramka) pośród innych warstw splotowych może wydawać się niezręczna. Jednak w przeciwieństwie do konwencjonalnych warstw podpróbkowania puli (czerwona ramka, krok> 1), zastosowali krok 1 w tej warstwie puli . Warstwy pulujące Stride-1 faktycznie działają w taki sam sposób jak warstwy splotowe, ale z operacją splotu zastąpioną przez operację max.

Rozdzielczość po warstwie pulowania również pozostaje niezmieniona, a my możemy łączyć warstwy puli i splotowe razem w wymiarze „głębokości”.

wprowadź opis zdjęcia tutaj

Jak pokazano na powyższym rysunku z dokumentu, moduł początkowy faktycznie zachowuje rozdzielczość przestrzenną.

dontloo
źródło
6

Miałem na myśli to samo pytanie, kiedy czytasz tę białą księgę i zasoby, o których wspomniałeś, pomogły mi wymyślić wdrożenie.

W podanym kodzie pochodni jest napisane:

--[[ DepthConcat ]]--
-- Concatenates the output of Convolutions along the depth dimension
-- (nOutputFrame). This is used to implement the DepthConcat layer
-- of the Going deeper with convolutions paper :

Słowo „głębokość” w głębokim uczeniu się jest trochę niejednoznaczne. Na szczęście ta odpowiedź SO zapewnia pewną jasność:

W Deep Neural Networks głębokość odnosi się do głębokości sieci, ale w tym kontekście głębokość jest używana do rozpoznawania wizualnego i przekłada się na trzeci wymiar obrazu.

W tym przypadku masz obraz, a rozmiar tego wejścia to 32x32x3, czyli (szerokość, wysokość, głębokość). Sieć neuronowa powinna być w stanie uczyć się na podstawie tych parametrów, ponieważ głębokość przekłada się na różne kanały obrazów treningowych.

DepthConcat łączy więc tensory wzdłuż wymiaru głębokości, który jest ostatnim wymiarem tensora, a w tym przypadku trzecim wymiarem tensora 3D.

DepthConcat musi sprawić, by tensory były takie same we wszystkich wymiarach, ale w wymiarze głębokości, jak mówi kod palnika :

-- The normal Concat Module can't be used since the spatial dimensions
-- of tensors to be concatenated may have different values. To deal with
-- this, we select the largest spatial dimensions and add zero-padding
-- around the smaller dimensions.

na przykład

A = tensor of size (14, 14, 2)
B = tensor of size (16, 16, 3)
result = DepthConcat([A, B])
where result with have a height of 16, a width of 16 and a depth of 5 (2 + 3). 

wprowadź opis zdjęcia tutaj

Na powyższym schemacie widzimy obraz tensora wyniku DepthConcat, gdzie biały obszar jest wypełnieniem zerowym, czerwony to tensor A, a zielony to tensor B.

Oto pseudo kod dla DepthConcat w tym przykładzie:

  1. Spójrz na tensor A i tensor B i znajdź największe wymiary przestrzenne, którymi w tym przypadku byłyby 16 szerokości i 16 wysokości tensora B. Ponieważ tensor A jest zbyt mały i nie odpowiada wymiarom przestrzennym tensora B, należy go wyściełać.
  2. Wypełnij wymiary przestrzenne tensora A zerami, dodając zera do pierwszego i drugiego wymiaru, tworząc rozmiar tensora A (16, 16, 2).
  3. Połączony tensor A z tensorem B wzdłuż wymiaru głębokości (3.).

Mam nadzieję, że pomoże to komuś, kto myśli to samo pytanie, czytając tę ​​białą księgę.

AshleyS
źródło
tak. idealne wprowadzenie. Jest to połączone w kierunku głębokości. Nie w kierunkach przestrzennych.
Shamane Siriwardhana