W jaki sposób splot 1x1 jest taki sam jak w pełni połączona warstwa?

55

Niedawno przeczytałem komentarz Yan LeCuns na temat zwojów 1x1 :

W sieciach konwekcyjnych nie ma czegoś takiego jak „w pełni połączone warstwy”. Istnieją tylko warstwy splotu z jądrem splotu 1x1 i pełną tabelą połączeń.

Jest to zbyt rzadko rozumiany fakt, że ConvNets nie muszą mieć danych wejściowych o stałym rozmiarze. Możesz trenować je na wejściach, które produkują jeden wektor wyjściowy (bez zasięgu przestrzennego), a następnie zastosować je do większych obrazów. Zamiast jednego wektora wyjściowego otrzymujesz przestrzenną mapę wektorów wyjściowych. Każdy wektor widzi okna wejściowe w różnych miejscach na wejściu. W tym scenariuszu „w pełni połączone warstwy” naprawdę działają jak zwoje 1x1.

Chciałbym zobaczyć prosty przykład tego.

Przykład

Załóżmy, że masz w pełni połączoną sieć. Ma tylko warstwę wejściową i wyjściową. Warstwa wejściowa ma 3 węzły, warstwa wyjściowa ma 2 węzły. Ta sieć ma 32=6 parametrów. Aby uczynić go jeszcze bardziej konkretnym, załóżmy, że masz funkcję aktywacji ReLU w warstwie wyjściowej i macierzy wagi

W=(011235)R2×3b=(813)R2

Więc sieć to f(x)=ReLU(Wx+b) z xR3 .

Jak wyglądałaby ta sama warstwa splotowa? Co oznacza LeCun z „pełną tabelą połączeń”?

Myślę, że aby uzyskać równoważny CNN, musiałby mieć dokładnie taką samą liczbę parametrów. MLP z góry ma 23+2=8 parametrów.

Martin Thoma
źródło

Odpowiedzi:

29

Twój przykład

W twoim przykładzie mamy 3 jednostki wejściowe i 2 jednostki wyjściowe. Aby zastosować zwoje, pomyśl o tych jednostkach, które mają odpowiednio kształt: [1,1,3]i [1,1,2]. W kategoriach CNN mamy mapy obiektów 3wejściowych i 2wyjściowych, z których każda ma wymiary przestrzenne 1 x 1.

n x nk[n,n,k]1x1[1, 1, 3]221×11×1×number of channels of the input


w1=(011)R3w2=(235)R3b=(813)R2

f(x)=ReLU((w1xw2x)+(b1b2))xR3

Transformacja w prawdziwym kodzie

Dla przykładu z życia zobacz także moją implementację vgg-fcn . Kod zawarty w tym pliku przyjmuje wagi VGG, ale przekształca każdą w pełni połączoną warstwę w warstwy splotowe. Powstała sieć daje taką samą wydajność, jak w vggprzypadku zastosowania do wejściowego obrazu kształtu [244,244,3]. (W przypadku stosowania obu sieci bez wypełniania).

Przekształcone warstwy splotowe są wprowadzane do funkcji _fc_layer(linia 145). Mają rozmiar jądra 7x7dla FC6 (który jest maksymalny, ponieważ pool5VGG generuje mapę cech kształtu [7,7, 512]. Warstwa FC7i FC8są implementowane jako 1x1splot.

„Pełna tabela połączeń”

Nie jestem w 100% pewien, ale może odnosić się do filtra / jądra, który ma taki sam wymiar jak wejściowa mapa funkcji. W obu przypadkach (Kod i Twój przykład) wymiary przestrzenne są maksymalne w tym sensie, że wymiar przestrzenny filtra jest taki sam jak wymiar przestrzenny jak dane wejściowe.

MarvMind
źródło
„Stąd jądro waszych zwojów 1x1 ma kształt [1, 1, 3].”. Co? Wydaje się, że istnieje większe nieporozumienie zwojów. Pomyślałem, że jeśli jądro splotu ma kształt [1, 1, 3], to można powiedzieć, że jest to splot 1x1x3? Więc splot 1x1 dotyczy tylko wyjścia, a nie jądra?
Martin Thoma,
2
Czy dla mnie kernel = filtersię zgadzasz? >> „Zatem splot 1x1 dotyczy tylko wyjścia, a nie jądra? Wcale nie. 3x3Splot może mieć dowolny kształt wyjściowy.” Rzeczywiście, jeśli padding jest użyty, a stride=1następnie output shape = input shape. >> „Myślałem, że jeśli jądro splotu ma kształt [1, 1, 3], to można powiedzieć, że jest to splot 1x1x3?” Nie, nigdy nie słyszałem, żeby ktoś mówił o 3x3x512zwojach. Jednak wszystkie filtry splotu, które widziałem, mają trzeci wymiar przestrzenny równy liczbie map cech warstwy wejściowej.
MarvMind
W Convolution Democelach informacyjnych zapoznaj się z kursem Karpathies CS321n : cs231n.github.io/convolutional-networks/#conv . Lub w interfejsie API tensorflow: tensorflow.org/versions/r0.9/api_docs/python/nn.html#conv2d Filtry powinny mieć kształt [filter_height, filter_width, in_channels, out_channels].
MarvMind
Czy mogę dodać do odpowiedzi „zwojami 1x1 to 1 x 1 x liczba kanałów wejściowych”? To było przyczyną mojego zamieszania i ciągle o tym zapominam.
Martin Thoma,
Pewnie, dawaj!
MarvMind
4

nnimnnm

nnim

nnim

nnim

( Źródło )

Michael Yahalom
źródło
1
n=1
2

Równoważne jądro ma po prostu dowolny kształt danych wejściowych i oblicza iloczyn tensorowy. (Używam słowa „kształt”, ponieważ wydaje się, że istnieje pewne zamieszanie w stosunku do „rozmiaru”, które często ignoruje wymiar kanału / głębokości). Nie ma potrzeby „przesuwania jądra między danymi wejściowymi”, ponieważ jądro jest tak duże, jak to tylko możliwe. Cytując notatki z kursu Stanford CS 231n :

dowolną warstwę FC można przekonwertować na warstwę CONV. Na przykład warstwa FC o K = 4096, która patrzy na pewną objętość wejściową o rozmiarze 7 × 7 × 512, może być równoważnie wyrażona jako warstwa CONV o F = 7, P = 0, S = 1, K = 4096, F = 7, P = 0, S = 1, K = 4096. Innymi słowy, ustawiamy rozmiar filtra dokładnie na wielkość objętości wejściowej, a zatem wynik będzie po prostu 1 × 1 × 4096, ponieważ tylko jedna kolumna głębokości „pasuje” do objętości wejściowej, dając identyczny wynik jak początkowa warstwa FC.

Uważam, że „F = 7, P = 0, S = 1, K = 4096, F = 7, P = 0, S = 1, K = 4096” oznacza tutaj, że każde jądro konwekcyjne ma kształt 7x7x512 i jest 4096 takich filtrów.

W wcześniejszej odpowiedzi wspomniano, że ostatnia fc AlexNet (która otrzymuje dane wejściowe o kształcie 1x1x4096 i oblicza wyniki 1000 klas) jest zaimplementowana jako „splot 1x1”. Podsumowując , każde takie jądro konwekcyjne ma kształt 1x1x4096, a jest ich 1000.

Le Cunn wyjaśnia to również w artykule CNN , strona 8, opis LeNet5:

Warstwa C5 jest warstwą splotową ze 120 mapami obiektów. Każda jednostka jest połączona z dzielnicą 5x5 na wszystkich 16 mapach obiektów S4. Tutaj, ponieważ rozmiar S4 wynosi również 5x5, rozmiar map obiektów C5 wynosi 1x1; oznacza to pełne połączenie między S4 i C5.

Yibo Yang
źródło
1

Do każdego nowego użytkownika PyTorch, takiego jak ja , nie należy mylić „w pełni połączonej warstwy” z „warstwą liniową”.

Warstwa liniowa i zwoje 1x1 to to samo. Chwilę zajęło mi zrozumienie, że nie ma czegoś takiego jak „w pełni połączona warstwa” - to po prostu spłaszczenie wymiarów przestrzennych w gigantyczny tensor 1D. Spłaszczanie powoduje, że każdy element we wszystkich lokalizacjach przestrzennych jest przedstawiany jako osobna mapa obiektów / kanał / wymiar (jakkolwiek chcesz to nazwać). Dlatego, gdy nakładamy warstwę liniową na spłaszczony tensor , otrzymujemy w pełni połączoną operację, która oczywiście nie jest tym samym co splot 1x1.

1x1j=01X[j]W0[j]+b[0]j=01X[j]W1[j]+b[1]j=01X[j]W2[j]+b[2]

O=W2×3X3×1+b2×1

Inne odpowiedzi, które twierdzą, że w pełni połączona warstwa jest po prostu prawidłową nxn warstwą splotu dla danych wejściowych o rozmiarze, nxnsą mylące (choć poprawne).

Rakshit Kothari
źródło