W jaki sposób CNN Kriżewskiego '12 dostaje 253 440 neuronów w pierwszej warstwie?

24

W Alex Krizhevsky i in. Klasyfikacja Imagenet z głębokimi splotowymi sieciami neuronowymi wyliczają liczbę neuronów w każdej warstwie (patrz diagram poniżej).

Dane wejściowe sieci są 150 528-wymiarowe, a liczba neuronów w pozostałych warstwach sieci wynosi 253 340–186,624–64 896–64 8896–43,264– 4096–4096–1000.

CNN

Widok 3D

Liczba neuronów dla wszystkich warstw po pierwszej jest wyraźna. Jednym prostym sposobem obliczenia neuronów jest po prostu pomnożenie trzech wymiarów tej warstwy ( planes X width X height):

  • Warstwa 2: 27x27x128 * 2 = 186,624
  • Warstwa 3: 13x13x192 * 2 = 64,896
  • itp.

Jednak patrząc na pierwszą warstwę:

  • Warstwa 1: 55x55x48 * 2 = 290400

Zauważ, że nie jest to253,440 określone w dokumencie!

Oblicz rozmiar wyjściowy

Innym sposobem obliczenia wyjściowego tensora splotu jest:

Jeśli obraz wejściowy jest tensorem 3D nInputPlane x height x width, rozmiar obrazu wyjściowego będzie wynosił nOutputPlane x owidth x oheightgdzie

owidth = (width - kW) / dW + 1

oheight = (height - kH) / dH + 1 .

(z dokumentacji Torch SpatialConvolution )

Obraz wejściowy to:

  • nInputPlane = 3
  • height = 224
  • width = 224

A warstwa splotowa to:

  • nOutputPlane = 96
  • kW = 11
  • kH = 11
  • dW = 4
  • dW = 4

(np. rozmiar jądra 11, krok 4)

Po podłączeniu tych liczb otrzymujemy:

owidth = (224 - 11) / 4 + 1 = 54 oheight = (224 - 11) / 4 + 1 = 54

Więc brakuje nam jednego z 55x55wymiarów, które musimy dopasować do papieru. Mogą być wypełnienia (ale cuda-convnet2model wyraźnie ustawia wypełnienie na 0)

Jeśli weźmiemy 54wymiary-rozmiar, otrzymujemy 96x54x54 = 279,936neurony - wciąż za dużo.

Więc moje pytanie brzmi:

Jak uzyskują 253,440 neuronów dla pierwszej warstwy splotowej? czego mi brakuje?

R. Girard
źródło
Czy kiedykolwiek to rozwiązałeś? Po prostu bądź pedantyczny w swoich obliczeniach: wysokość i wysokość w rzeczywistości wynosi 54,25. Próbowałem to rozgryźć i jako pierwszy krok podzieliłem rzekome 253440 neuronów na 96 filtrów, co daje 2640 neuronów na filtr. To nie jest liczba kwadratowa. Albo oboje mamy tutaj nieporozumienie, albo autorzy mogą popełnić błąd ... Skontaktowałeś się z nimi?
anderas
to samo ze mną, to mnie bardzo myli. btw jest prawda, że ​​wejście to 224x224x3? myślę, że musi to być 227 x 227 x 3. zobaczmy, czy mamy 227x227, 5 komórek w pierwszym lewym rogu i 5 komórek w ostatnim prawym rogu nie może być centrum splotu jądra o rozmiarze 11 x 11. Tak więc pierwszym środkiem jądra jest komórka (6,6), a ostatnim ze środkowego jądra w pierwszym rzędzie jest komórka (6x222). Za pomocą kroku 4 otrzymamy środek jądra w szóstym rzędzie: komórka w kolumnie: 6,10,14, ..., 222, a proste sformułowanie środka jądra-k znajduje się w kolumnie = 6+ (k -1) * 4, tak aby kolumna 222 była k-tym środkiem = (222-6) / 4 +1 = 55.
4
Zauważ, że 48 * 48 * 55 * 2 = 253440, więc możliwe, że mieli literówkę podczas obliczania liczby neuronów w pierwszej warstwie (pomnożonej przez 48 zamiast 55).
tsiki,
@Firebug To interesujące użycie znacznika [referencje]. Myślałem, że używamy go tylko do pytań, które wymagają referencji. Ale może się myliłem. Czy używasz go inaczej?
ameba mówi Przywróć Monikę

Odpowiedzi:

8

Z notatek ze stanfordów na NN:

Przykład z prawdziwego świata. The Krizhevsky i in. architektura, która zwyciężyła w konkursie ImageNet w 2012 r., zaakceptowała obrazy o rozmiarach [227x227x3]. W pierwszej warstwie splotowej używał neuronów o polu odbiorczym o wielkości F = 11, kroku S = 4 i zerowym wypełnieniu P = 0. Ponieważ (227–11) / 4 + 1 = 55, a ponieważ warstwa Conv miała głębokość K = 96, objętość wyjściowa warstwy Conv miała rozmiar [55x55x96]. Każdy z 55 * 55 * 96 neuronów w tej objętości był podłączony do regionu o wielkości [11x11x3] w objętości wejściowej. Ponadto wszystkie 96 neuronów w każdej kolumnie głębokości są połączone z tym samym regionem wejściowym [11 x 11 x 3], ale oczywiście o różnych wagach. Na marginesie, jeśli czytasz faktyczny artykuł, twierdzi on, że obrazy wejściowe miały wymiary 224 x 224, co z pewnością jest niepoprawne, ponieważ (224–11) / 4 + 1 nie jest wcale liczbą całkowitą. To pomieszało wiele osób w historii ConvNets i niewiele wiadomo o tym, co się stało. Podejrzewam, że Alex zastosował zerowanie 3 dodatkowych pikseli, o których nie wspomina w artykule.

ref: http://cs231n.github.io/convolutional-networks/

Te uwagi towarzyszą klasie CS CS231n: Konwolucyjne sieci neuronowe do rozpoznawania wizualnego. W przypadku pytań / wątpliwości / zgłoszeń błędów dotyczących kontaktu z Justinem Johnsonem w sprawie zadań lub skontaktuj się z Andrej Karpathy w sprawie notatek z kursu

Boczek
źródło
Czy można przypisać autorstwo tych notatek?
Silverfish,
Autorzy są wyraźnie przywoływani
Bacon
2
Chociaż są one wyraźnie wymienione, jeśli podążysz za linkiem, cytat pojawia się tutaj również, więc tutaj również należy podać kredyt. Jest to częściowo dzięki uprzejmości, ale również dlatego, że link może przestać działać (np. Jeśli materiał zostanie usunięty / zablokowany / przeniesiony na nowy adres). Niestety mamy poważny problem z „zepsuciem linków” na tej stronie - chociaż zamierzamy służyć jako długoterminowe repozytorium wysokiej jakości odpowiedzi na pytania statystyczne, wiele naszych starszych odpowiedzi stało się nieaktualnych przez linki, które już nie działają . Dlatego generalnie bezpieczniej jest starać się, aby odpowiedzi były jak najbardziej samodzielne.
Silverfish,
0

Ten papier jest naprawdę mylący. Po pierwsze, wejściowy rozmiar obrazów jest nieprawidłowy. 224 x 224 nie daje wyniku 55. Te neurony są po prostu jak zgrupowane piksele w jednym, więc wynik jest obrazem 2D losowych wartości (wartości neuronów). Więc w zasadzie liczba neuronów = szerokość x wysokość x głębokość, nie ma żadnych tajemnic, aby to rozgryźć.

Moe
źródło