Jak obliczyć liczbę parametrów konwolucyjnych sieci neuronowych?

Nie mogę podać poprawnej liczby parametrów AlexNet lub VGG Net.

Na przykład, aby obliczyć liczbę parametrów conv3-256 warstwy Sieci VGG, odpowiedź wynosi 0,59 M = (3*3)*(256*256), jest to (rozmiar jądra) * (iloczyn liczby obu kanałów w warstwach łączonych), jednak w ten sposób nie mogę uzyskać parametrów 138M.

Więc czy mógłbyś mi pokazać, gdzie jest źle z moimi obliczeniami, lub pokazać mi właściwą procedurę obliczania?

Author: nbro, 2015-01-30

3 answers

Jeśli odnosisz się do sieci VGG z 16-warstwową (tabela 1, kolumna D), to 138M odnosi się do całkowitej liczby parametrów tej sieci, tzn. obejmującej wszystkie warstwy convolutional, ale także te w pełni połączone.

Patrząc na 3. etap konwolucyjny złożony z 3 x conv3-256 warstw:

  • pierwszy ma N = 128 płaszczyzn wejściowych i F=256 płaszczyzn wyjściowych,
  • dwa pozostałe mają N = 256 płaszczyzn wejściowych i F=256 płaszczyzn wyjściowych.

The convolution kernel jest 3x3 dla każdej z tych warstw. Pod względem parametrów daje to:

  • 128x3x3x256 (waga) + 256 (waga) = 295,168 parametrów dla pierwszego,
  • 256x3x3x256 (waga) + 256 (waga) = 590,080 parametrów dla dwóch pozostałych.

Jak wyjaśniono powyżej, musisz to zrobić dla wszystkich warstw, ale także tych w pełni połączonych i zsumować te wartości, aby uzyskać ostateczną liczbę 138M.

-

UPDATE : podział na warstwy dają:

conv3-64  x 2       : 38,720
conv3-128 x 2       : 221,440
conv3-256 x 3       : 1,475,328
conv3-512 x 3       : 5,899,776
conv3-512 x 3       : 7,079,424
fc1                 : 102,764,544
fc2                 : 16,781,312
fc3                 : 4,097,000
TOTAL               : 138,357,544

W szczególności dla warstw w pełni połączonych (fc):

 fc1 (x): (512x7x7)x4,096 (weights) + 4,096 (biases)
 fc2    : 4,096x4,096     (weights) + 4,096 (biases)
 fc3    : 4,096x1,000     (weights) + 1,000 (biases)

(x) patrz sekcja 3.2 artykułu: w pełni połączone warstwy są najpierw konwertowane do warstw konwolucyjnych (pierwsza warstwa FC do conv 7 × 7. warstwa, dwie ostatnie warstwy FC do 1 × 1 conv. warstw).

Szczegóły dotyczące fc1

Jak podano powyżej rozdzielczość przestrzenna tuż przed podaniem w pełni połączonych warstw wynosi 7x7 pikseli. To dlatego, że ten VGG Net używa podkładek przestrzennych przed splotami, zgodnie z sekcją 2.1 artykułu:

[...] spatial padding of conv. wejście warstwowe jest takie, że rozdzielczość przestrzenna jest zachowana po splotach, tzn. padding wynosi 1 piksel dla conv 3×3. warstwy.

Przy takim paddingu i pracy z obrazem wejściowym 224x224 pikseli Rozdzielczość maleje w następujący sposób wzdłuż warstw: 112x112, 56x56, 28x28, 14x14 i 7x7 po ostatnim etapie splatania/łączenia który posiada 512 map Fabularnych.

Daje to wektor funkcji przekazany do {[4] } o wymiarze: 512x7x7.

 49
Author: deltheil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-31 09:50:06

Wielki podział obliczeń dla sieci VGG-16 jest również podany w CS231n uwagach do wykładu.

INPUT:     [224x224x3]    memory:  224*224*3=150K   weights: 0
CONV3-64:  [224x224x64]   memory:  224*224*64=3.2M  weights: (3*3*3)*64 = 1,728
CONV3-64:  [224x224x64]   memory:  224*224*64=3.2M  weights: (3*3*64)*64 = 36,864
POOL2:     [112x112x64]   memory:  112*112*64=800K  weights: 0
CONV3-128: [112x112x128]  memory:  112*112*128=1.6M weights: (3*3*64)*128 = 73,728
CONV3-128: [112x112x128]  memory:  112*112*128=1.6M weights: (3*3*128)*128 = 147,456
POOL2:     [56x56x128]    memory:  56*56*128=400K   weights: 0
CONV3-256: [56x56x256]    memory:  56*56*256=800K   weights: (3*3*128)*256 = 294,912
CONV3-256: [56x56x256]    memory:  56*56*256=800K   weights: (3*3*256)*256 = 589,824
CONV3-256: [56x56x256]    memory:  56*56*256=800K   weights: (3*3*256)*256 = 589,824
POOL2:     [28x28x256]    memory:  28*28*256=200K   weights: 0
CONV3-512: [28x28x512]    memory:  28*28*512=400K   weights: (3*3*256)*512 = 1,179,648
CONV3-512: [28x28x512]    memory:  28*28*512=400K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [28x28x512]    memory:  28*28*512=400K   weights: (3*3*512)*512 = 2,359,296
POOL2:     [14x14x512]    memory:  14*14*512=100K   weights: 0
CONV3-512: [14x14x512]    memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [14x14x512]    memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [14x14x512]    memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
POOL2:     [7x7x512]      memory:  7*7*512=25K      weights: 0
FC:        [1x1x4096]     memory:  4096             weights: 7*7*512*4096 = 102,760,448
FC:        [1x1x4096]     memory:  4096             weights: 4096*4096 = 16,777,216
FC:        [1x1x1000]     memory:  1000             weights: 4096*1000 = 4,096,000

TOTAL memory: 24M * 4 bytes ~= 93MB / image (only forward! ~*2 for bwd)
TOTAL params: 138M parameters
 33
Author: Ray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-20 17:05:22

Wiem, że to stary post, ale myślę, że przyjęta odpowiedź przez @ deltheil zawiera błąd. Jeśli nie, byłbym szczęśliwy, mogąc zostać poprawionym. Warstwa splotu nie powinna mieć odchylenia. tj. 128x3x3x256 (waga) + 256 (waga) = 295,168 powinno być 128x3x3x256 ( waga) = 294,9112

Thanks

 1
Author: rav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-05 11:26:35