Как '12 CNN Крижевского получает 253,440 нейронов в первом слое?

24

В Alex Krizhevsky et al. При классификации Imagenet с глубокими сверточными нейронными сетями они перечисляют количество нейронов в каждом слое (см. Диаграмму ниже).

Сетевой вход имеет размер 150 528, а число нейронов в остальных слоях сети составляет 253 440–186 624–64 896–64 896–43 264– 4096–4096–1000.

CNN

3D вид

Количество нейронов для всех слоев после первого ясно. Один простой способ вычислить нейроны состоит в том, чтобы просто умножить три измерения этого слоя (planes X width X height ):

  • Слой 2: 27x27x128 * 2 = 186,624
  • Слой 3: 13x13x192 * 2 = 64,896
  • и т.п.

Тем не менее, глядя на первый слой:

  • Слой 1: 55x55x48 * 2 = 290400

Обратите внимание, что это не 253,440 как указано в документе!

Рассчитать выходной размер

Другой способ вычислить выходной тензор свертки:

Если входное изображение является 3D-тензором nInputPlane x height x width, размер выходного изображения будет nOutputPlane x owidth x oheightгде

owidth = (width - kW) / dW + 1

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

(из документации Torch SpatialConvolution )

Исходное изображение:

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

И слой свертки это:

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

(например, размер ядра 11, шаг 4)

Подставив эти цифры, мы получим:

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

Таким образом, нам не хватает 55x55размеров, которые нам нужны, чтобы соответствовать бумаге. Они могут быть дополнением (но cuda-convnet2модель явно устанавливает отступ равным 0)

Если мы возьмем 54размеры-размеры, мы получим 96x54x54 = 279,936нейроны - все еще слишком много.

Итак, мой вопрос заключается в следующем:

Как они получают 253440 нейронов для первого сверточного слоя? Чего мне не хватает?

Р. Жирар
источник
Вы когда-нибудь решали это? Просто чтобы быть педантичным с вашими расчетами: ширина и высота на самом деле будет 54,25. Я попытался выяснить это, и в качестве первого шага я разделил предполагаемые 253440 нейронов среди 96 фильтров, что дает 2640 нейронов на фильтр. Это не квадратное число. Так что либо у нас обоих есть недоразумение, либо авторы могут ошибаться ... Вы с ними связались?
Андерас
То же самое со мной, это очень смущает меня. кстати есть правда вход 224x224x3? я думаю, что это должно быть 227x227x3. давайте посмотрим, если мы имеем 227x227, 5 ячеек в первом левом и 5 ячеек в последнем правом не могут быть центром свертки ядра с размером 11x11. Таким образом, первый центр ядра - это ячейка (6,6), а последний центр ядра в первом ряду - это ячейка (6x222). На шаге-4 мы получим центр ядра в шестой строке: ячейка в столбце: 6,10,14, ..., 222 и простая формулировка для центра ядра-k в ​​столбце = 6+ (k -1) * 4, так что столбец 222 является k-м центром = (222-6) / 4 +1 = 55.
4
Обратите внимание, что 48 * 48 * 55 * 2 = 253440, поэтому возможно, что они имели опечатку при расчете количества нейронов в первом слое (умноженное на 48 вместо 55).
Цики
@Firebug Это интересное использование тега [reference]. Я думал, что мы используем его только для вопросов, которые просят ссылки. Но, возможно, я был неправ. Вы используете это по-другому?
говорит амеба, восстанови Монику

Ответы:

8

Из примечания Stanfords на NN:

Пример из реального мира. Крижевский и соавт. архитектура, победившая в конкурсе ImageNet в 2012 году, принимала изображения размером [227x227x3]. На первом сверточном слое использовались нейроны с размером рецептивного поля F = 11, шагом S = 4 и отсутствием заполнения нулями P = 0. Поскольку (227 - 11) / 4 + 1 = 55, а поскольку слой Conv имел глубину K = 96, выходной объем слоя Conv имел размер [55x55x96]. Каждый из 55 * 55 * 96 нейронов в этом объеме был связан с областью размером [11x11x3] во входном объеме. Более того, все 96 нейронов в каждом столбце глубины связаны с одной и той же [11x11x3] областью входа, но, конечно, с разными весами. В качестве забавы, если вы читаете реальную статью, она утверждает, что входные изображения были 224x224, что, безусловно, неверно, потому что (224 - 11) / 4 + 1 совершенно явно не является целым числом. Это смутило многих людей в истории ConvNets, и мало что известно о том, что произошло. Мое личное предположение состоит в том, что Алекс использовал заполнение нулями 3 дополнительных пикселей, которые он не упоминает в статье.

ссылка: http://cs231n.github.io/convolutional-networks/

Эти примечания сопровождают класс CS231n Stanford CS: сверточные нейронные сети для визуального распознавания. По вопросам / проблемам / сообщениям об ошибках, касающимся контактов, свяжитесь с Джастином Джонсоном относительно заданий или свяжитесь с Андреем Карпати в отношении заметок курса

Бекон
источник
Можно ли дать кредит, назвав автора этих заметок?
Серебряная рыба
Авторы явно ссылаются на себя в примечаниях, см. Cs231n.github.io
Бекон,
2
Хотя на них есть четкая ссылка, если вы перейдете по ссылке, здесь также появится цитата, поэтому здесь также следует упомянуть. Это частично любезно, но также и потому, что ссылка может перестать работать (например, если материал удален / расплатился / перемещен на новый адрес). К сожалению, у нас есть серьезная проблема с «гнилью ссылок» на этом сайте - хотя мы намерены служить долгосрочным хранилищем высококачественных ответов на статистические вопросы, многие из наших старых ответов устарели из-за ссылок, которые больше не работают , Поэтому, как правило, безопаснее пытаться сделать ответы максимально автономными.
Серебряная рыба
0

Эта статья действительно сбивает с толку. Во-первых, входной размер изображений неправильный, 224x224 не дает выходных данных 55. Эти нейроны просто похожи на сгруппированные пиксели в одном, поэтому на выходе получается двухмерное изображение случайных значений (значений нейронов). Таким образом, в основном число нейронов = ширина xheightxdepth, никаких секретов, чтобы понять это.

Моу
источник