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 parametrów. Aby uczynić go jeszcze bardziej konkretnym, załóżmy, że masz funkcję aktywacji ReLU w warstwie wyjściowej i macierzy wagi
Więc sieć to z .
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 parametrów.
źródło
kernel = filter
się zgadzasz? >> „Zatem splot 1x1 dotyczy tylko wyjścia, a nie jądra? Wcale nie.3x3
Splot może mieć dowolny kształt wyjściowy.” Rzeczywiście, jeśli padding jest użyty, astride=1
następnieoutput 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ł o3x3x512
zwojach. Jednak wszystkie filtry splotu, które widziałem, mają trzeci wymiar przestrzenny równy liczbie map cech warstwy wejściowej.Convolution Demo
celach 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]
.( Źródło )
źródło
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 :
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:
źródło
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.
1x1
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,nxn
są mylące (choć poprawne).źródło