В модели SSD , представленной в документе , говорится, что базовая сеть рассматривается как VGG16, а в конце нее добавляются дополнительные слои объектов, которые позволяют создавать карты объектов на разных уровнях. масштабы и пропорции.
Мой вопрос заключается в том, что в архитектуре, показанной на рис. 2 (показанной ниже) в документе SSD, слои свертки имеют обозначения, показанные как Conv5_3
, Conv4_3
, для базовой сети Conv8_2
, Conv9_2
, Conv10_2
для слоев добавленных функций.
Что означает это обозначение _2, _3 в представлении слоев свертки?
Я видел, что те же обозначения используются на странице описания модели SSD , где базовая сеть VGG16 меняется на ResNET50 и используются такие обозначения, как Conv5_x, Conv4_x.
Что означает этот _x для обозначения слоя свертки?
(примечание): модель SSD и модель VGG16 (до тех пор, пока она не считается базовой сетью в SSD) имеют одинаковые слои (см. ниже), но в результате получаются разные карты выходных характеристик (используются torchinfo.summary(model,(1, 3, 300, 300))
) VGG16 на выходе каждого слоя карта объектов , карта объектов вывода каждого слоя SSD
Сама по себе статья, возможно, не очень полезна для описания интересующей вас записи; однако соответствующий репозиторий кода добавляет немного больше информации:
Если мы посмотрим, например, ssd_pascal.py, то увидим, где создаются слои с таким именем (начиная со строки 23):
out_layer = "conv6_1"
ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 1, 0, 1,
lr_mult=lr_mult)
from_layer = out_layer
out_layer = "conv6_2"
ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 512, 3, 1, 2,
lr_mult=lr_mult)
Теперь нам также следует взглянуть на определение ConvBNLayer
в model_libs.py (начиная со строки 30):
def ConvBNLayer(net, from_layer, out_layer, use_bn, use_relu, num_output,
kernel_size, pad, stride, dilation=1, use_scale=True, lr_mult=1,
conv_prefix='', conv_postfix='', bn_prefix='', bn_postfix='_bn',
scale_prefix='', scale_postfix='_scale', bias_prefix='', bias_postfix='_bias',
**bn_params):
Затем мы можем собрать эту информацию воедино и добавить немного догадок:
Технически conv#_1
и conv#_2
(где #
— это заполнитель для фактического номера слоя) всегда представляют собой два слоя сверточной сети, созданные вызовом ConvBNLayer
, которые следуют друг за другом в сетевой архитектуре (таким образом, выход conv#_1
является входом conv#_2
). Они различаются количеством выходных каналов (например, 256 против 512 выше), размером ядра (например, 1 против 3 выше), величиной заполнения (например, 0 против 1 выше) и шагом (например, 1 против 2 выше). выше).
Логично, что авторам эти два слоя кажутся подслоями одного и того же сетевого уровня, отсюда и суффиксы _1
и _2
. Итак, conv6_1
будет сверточным слоем 6, подслоем 1 и conv6_2
будет сверточным слоем 6, подслоем 2. Это становится ясно, если посмотреть на рисунок, например на иллюстрацию Conv8_2 и то, что написано под ним:
Обратите внимание, что имена и номера слоев рисунка не совпадают с именами и номерами ssd_pascal.py
(последний заканчивается после conv9_2
, шаг которого отличается от Conv9_2 на рисунке), но схема должна быть такой же, если предположить, что авторы работали с определенной последовательностью.
Что касается вашего последнего вопроса: на странице описания SSD, где они пишут, например.
- Слои conv5_x, avgpool, fc и softmax были удалены из исходной модели классификации.
- Все шаги в conv4_x установлены на 1x1.
Я предполагаю, что «x» просто служит заполнителем для суффиксов _1
, _2
и, следовательно, его следует читать следующим образом: conv5_1 и conv5_2 были удалены, все шаги в conv4_1 и conv4_2 установлены на 1x1.
одно сомнение, прежде чем принять ответ. Это связано с base network
, который обозначается как Conv4_3
, through Conv5_3
. Распечатал модели SSD, VGG16 на google colab
, использовал torchinfo
пакет (отредактированный в вопросе. см.). Оба привели к одной и той же сети. Всего он имеет 10 конв-слоев, за каждым из которых следует ReLU, за 3 из них следуют слои maxpool. Я думаю, что _3 здесь означает 3 maxpools
. Вы думаете так же? Кроме того, что означает Conv4–Conv5?
Причина для вышеуказанного сомнения заключается в том, что в этом документе MobileNet рассматривается как базовая сеть и берутся выходные данные слоев Conv4_3, Conv5_3 MobileNet.
Я думаю, что новые цифры вписываются в схему именования: глядя на последнюю картинку, которую мы имеем (скобки сделаны мною): (conv conv maxpool) (conv conv maxpool) (conv conv maxpool) (conv conv maxpool) (conv conv maxpool). В этой схеме я не вижу «Conv5», но выходные данные «Conf4_3», как на первом опубликованном вами рисунке архитектуры (38x38x512), будут точно соответствовать тому, что напечатано как размер после последнего слоя конв в последняя цифра, которую вы выложили ([1, 512, 38, 38]). Он не соответствует последнему слою пула ([1, 256, 38, 38]). Опять же, это всего лишь догадки. Лучшим вариантом будет письмо авторам по электронной почте.
Спасибо за обновление, в любом случае!
Большое спасибо @Simon. Это был четкий ответ.