Как рассчитать количество параметров сверточных нейронных сетей?

Я не могу указать правильное количество параметров AlexNet или VGG Net.

Например, чтобы вычислить количество параметров слоя conv3-256 сети VGG, ответ будет 0,59M = (3*3)*(256*256), то есть (размер ядра) * (произведение обоих количеств каналов в объединенные слои), однако таким образом я не могу получить параметры 138M.

Итак, не могли бы вы показать мне, где не так с моим расчетом, или показать мне правильную процедуру расчета?


person Eric    schedule 30.01.2015    source источник
comment
Пожалуйста, дайте полный расчет всех слоев, чтобы мы могли увидеть, что не так. Вот отправная точка, чтобы узнать, как рассчитать общее количество: learning.eng.cam.ac.uk/pub/Public/Turner/Teaching/   -  person runDOSrun    schedule 30.01.2015
comment
Что означает S на 10-м слайде лекции? Stride для подвыборки?@runDOSrun   -  person nn0p    schedule 05.02.2015
comment
Вот мой ответ на аналогичный вопрос здесь: stackoverflow.com/a/39687866/1621562. Вы можете написать простой скрипт на Python для вычисления общего количества параметров (если вы используете Caffe). См. gist.github.com/kaushikpavani/a6a32bd87fdfe5529f0e908ed743f779.   -  person Kaushik Pavani    schedule 25.09.2016


Ответы (5)


Если вы ссылаетесь на сеть VGG с 16 слоями (таблица 1, столбец D), то 138M относится к общему количеству параметров этой сети, т. е. включая все сверточные слои, а также полносвязные.

Глядя на 3-й сверточный этап, состоящий из 3 x conv3-256 слоев:

  • первый имеет N=128 входных плоскостей и F=256 выходных плоскостей,
  • два других имеют N=256 входных плоскостей и F=256 выходных плоскостей.

Ядро свертки 3x3 для каждого из этих слоев. По параметрам это дает:

  • 128x3x3x256 (веса) + 256 (смещения) = 295 168 параметров для 1-го,
  • 256x3x3x256 (веса) + 256 (смещения) = 590 080 параметров для двух других.

Как объяснялось выше, вы должны сделать это для всех слоев, а также для полносвязных слоев, и просуммировать эти значения, чтобы получить окончательное число 138M.

-

ОБНОВЛЕНИЕ: разбивка по слоям дает:

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

В частности, для полносвязных слоев (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) см. раздел 3.2 статьи: полностью связанные слои сначала преобразуются в сверточные слои (первый слой FC в сверточный слой 7 × 7, последние два слоя FC в сверточные слои 1 × 1 ).

Подробнее о fc1

Как уточнялось выше, пространственное разрешение непосредственно перед подачей полносвязных слоев составляет 7x7 пикселей. Это связано с тем, что эта сеть VGG использует пространственное заполнение перед свертками, как подробно описано в разделе 2.1 статьи:

[...] пространственное заполнение конв. входной слой таков, что пространственное разрешение сохраняется после свертки, т. е. заполнение составляет 1 пиксель для свертки 3×3. слои.

При таком заполнении и работе с входным изображением 224x224 пикселя разрешение уменьшается следующим образом по слоям: 112x112, 56x56, 28x28, 14x14 и 7x7 после последнего этапа свертки/объединения, который имеет 512 карт признаков.

Это дает вектор признаков, переданный в fc1, с размером: 512x7x7.

person deltheil    schedule 30.01.2015
comment
Я прогнал числа для удовольствия, используя то же предположение, но я также не получил 138 миллионов. Допустим, у меня где-то опечатка, так как это довольно длинное выражение. - person runDOSrun; 30.01.2015
comment
Я получил 14 714 688 параметров для сверточных слоев и 123 642 856 для полносвязных, что дает в сумме 138M. - person deltheil; 31.01.2015
comment
Заполнение fc1 - это именно то, где я застрял. Спасибо за очень подробное объяснение. - person Eric; 01.02.2015
comment
в сегодняшней архитектуре, должны ли мы также включать параметры уровня пакетной нормализации/масштабирования? в caffe слой BN разделен на два слоя BN и масштаба. что на самом деле удваивает количество параметров, я думаю. поэтому такие слои, как BN (стиль кафе) и отсев, также должны быть включены в этот расчет? - person Rika; 05.06.2016
comment
@deltheil: Как можно рассчитать количество операций (mul/sum) в такой архитектуре? - person Rika; 16.03.2017

Подробная разбивка расчета для сети VGG-16 также приведена в примечаниях к лекциям CS231n.

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
person Ray    schedule 02.05.2016
comment
@Ray: Есть ли у нас какой-нибудь скрипт python/matlab для автоматического вычисления этих общих параметров? Спасибо - person John; 08.04.2017
comment
вычислительная стоимость CNN напрямую связана с параметрами? - person Aadnan Farooq A; 08.01.2018
comment
Привет, @Рэй. Не подскажете, как получить TOTAL memory: 24M? - person roachsinai; 09.04.2018
comment
@Ray, не могли бы вы указать код, который генерирует этот вывод! - person Anu; 21.01.2019

Приведенная ниже архитектура VGG-16 находится в оригинальном документе, как указано @deltheil в (таблица 1, столбец D), и я цитирую оттуда

2.1 АРХИТЕКТУРА

Во время обучения входом в наши ConvNets являются RGB-изображения фиксированного размера 224 × 224. Единственная предварительная обработка, которую мы делаем, — это вычитание среднего значения RGB, вычисленного на обучающем наборе, из каждого пикселя.

Изображение проходит через стопку сверточных (конв.) слоев, где мы используем фильтры с очень маленьким воспринимающим полем: 3 × 3 (это наименьший размер для захвата понятия лево/право, вверх/вниз, центр) . Шаг свертки фиксируется на 1 пиксель; пространственное заполнение конв. входной слой таков, что пространственное разрешение сохраняется после свертки, т. е. заполнение составляет 1 пиксель для 3 × 3 свертки. слои. Пространственное объединение осуществляется пятью слоями максимального объединения, которые следуют некоторым конв. слои (не все конв. слои сопровождаются максимальным объединением). Максимальное объединение выполняется в окне размером 2 × 2 пикселя с шагом 2.

За стеком сверточных слоев (который имеет разную глубину в разных архитектурах) следуют три полносвязных (FC) слоя: первые два имеют по 4096 каналов каждый, третий выполняет 1000-путевую классификацию ILSVRC и, таким образом, содержит 1000 каналов (один для каждого класса).

Последний слой — это слой soft-max.

Используя вышеизложенное и

  • Формула для нахождения формы активации слоя!

  • Формула для расчета весов, соответствующих каждому слою:

Примечание.

  • вы можете просто умножить соответствующий столбец формы активации, чтобы получить размер активации

  • CONV3: означает, что фильтр 3*3 будет свернут на входе!

  • MAXPOOL3-2: означает, 3-й слой пула, с фильтром 2 * 2, шаг = 2, заполнение = 0 (довольно стандартно для слоев пула)

  • Этап-3: означает, что он имеет несколько сложенных слоев CONV! с тем же отступом=1, шагом=1 и фильтром 3*3

  • Cin : означает глубину, также известную как канал, исходящий из входного слоя!

  • Cout: означает глубину исходящего канала (вы настраиваете его по-другому - чтобы узнать более сложные функции!),

Cin и Cout — это количество фильтров, которые вы складываете вместе, чтобы изучить несколько функций в разных масштабах, например, в первом слое вы можете захотеть изучить вертикальные края, а также горизонтальные края и края, скажем, под углом 45 градусов, бла-бла!, 64 возможных различных фильтра. каждый из разных видов краев !!

  • n: размер ввода без глубины, например, n=224 в случае INPUT-изображения!

  • p: отступы для каждого слоя

  • s: шаг, используемый для каждого слоя

  • f: размер фильтра, т.е. 3*3 для слоев CONV и 2*2 для слоев MAXPOOL!

  • После MAXPOOL5-2 вы просто сглаживаете объем и связываете его с первым слоем FC.!

Получаем таблицу: введите здесь описание изображения

Наконец, если вы добавите все веса, рассчитанные в последнем столбце, вы получите 138 357 544 (138 миллионов) параметров для обучения VGG-15!

person Anu    schedule 21.01.2019

Вот как можно вычислить количество параметров в каждом слое cnn:
некоторые определения
n -- ширина фильтра
m -- высота фильтра
k -- количество входных карт объектов
L -- количество выходных карт объектов
Тогда количество параметров #= (n*m *k+1)*L, в которых первый вклад вносится весами, а второй – смещением.

person saunter    schedule 09.11.2018

Я знаю, что это старый пост, тем не менее, я думаю, что принятый ответ @deltheil содержит ошибку. Если нет, буду рад, если меня поправят. Слой свертки не должен иметь смещения. то есть 128x3x3x256 (веса) + 256 (смещения) = 295 168 должны быть 128x3x3x256 (веса) = 294 9112

Спасибо

person rav    schedule 05.07.2017
comment
Вам лучше добавить комментарий к ответу. - person Sahil Mittal; 05.07.2017
comment
Да, я хотел, но не мог из-за репутации. - person rav; 05.07.2017
comment
Поправьте меня, если я ошибаюсь, но по умолчанию Caffe использует смещения для сверточных слоев[1] (bias_term [по умолчанию true]), и официальная предварительно обученная модель VGG 16[2] использует такое значение по умолчанию (в слоях нет Bias_term: false определение). [1]: caffe.berkeleyvision.org/tutorial/layers/convolution.html [1]: gist.githubusercontent.com/ksimonyan/211839e770f7b538e2d8/raw / - person deltheil; 14.10.2017