在paper中提出的SSD模型中,据说基础网络被认为是VGG16,并在其末尾添加了额外的特征层,允许以不同的尺度生成特征图,长宽比。
我的问题是在SSD论文中图2(如下所示)所示的架构中,卷积层的符号如
Conv5_3
,Conv4_3
,对于基础网络Conv8_2
, Conv9_2
、Conv10_2
用于添加的特征层。
这个 _2, _3 符号在卷积层表示中意味着什么?
我在SSD模型描述页面中看到了相同的符号,其中基础网络VGG16更改为ResNET50,并使用了Conv5_x、Conv4_x等符号。
仅这篇论文对于描述您感兴趣的符号可能没有多大帮助;但是,相应的代码存储库添加了更多信息:
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
的实例,在网络架构中紧接着一个接着一个。它们有时在输出通道数(例如上面的 256 与 512)、内核大小(例如上面的 1 与 3)、填充量(例如上面的 0 与 1)以及步幅(例如上面的 1 与 1)上有所不同。上面 2)。
逻辑上,对于作者来说,这两层似乎被视为同一网络层的子层,因此有
_1
和_2
后缀。看图就清楚了,例如“Conv8_2”的插图,下面写的是:
请注意,图中层的名称和数量与
ssd_pascal.py
的名称和数量不匹配(后者在“conv9_2”之后结束,其步长与图中不同),但方案应该是同样,假设作者的工作具有一定的一致性。
至于你的最后一个问题:在SSD描述页面中,他们写的是例如
- 从原始分类模型中删除了 conv5_x、avgpool、fc 和 softmax 层。
- conv4_x 中的所有步幅均设置为 1x1。
我假设“x”只是作为后缀
_1
、_2
的占位符,因此应解读如下:conv5_1和conv5_2被删除,conv4_1和conv4_2中的所有步幅都设置为1x1。