所以在mobilenet-v1网络中,使用了 depthwise conv 层。我理解如下。
对于 的输入特征图(C_in, F_in, F_in)
,我们只取 1 个带有C_in
通道的内核,比方说,大小(C_in, K, K)
为 ,并将内核的每个通道卷积到输入的每个通道,以生成(C_in, F_out, F_out)
特征图。C_out
然后使用大小为 的内核进行逐点转换来组合这些特征图(C_in, 1, 1)
,我们得到 的结果(1, F_out, F_out)
。与普通 conv 相比,内核参数缩减率是:
(K*K*C_in+C_in*C_out)/(K*K*C_in*C_out) = 1/C_out + 1/(K*K)
而且我还在pytorch中查了一下Conv2d
(doc),据说可以实现depthwise convolution设置groups
参数等于C_in
. 但是当我阅读相关文章时,设置背后的逻辑groups
与上面移动网络使用的深度卷积操作看起来不同。假设我们有C_in=6
, 和C_out=18
,groups=6
意味着您将输入和输出通道划分为6
组。在每组中,3
每个具有通道的内核都用于与输入通道进行转换,因此可以产生1
总共输出通道。18
但是对于正常的卷积,18*6
总内核通道用于18 kernels, each having 6 channels
. 所以缩小比是18/(18*6)
,所以缩小比是 1/C_in=1/Groups
。忽略不考虑的逐点转换,这个数字与1/C_out
上述结论不同。
谁能解释我哪里错了?是因为我在C_out
= factor * C_in
(factor > 1) 时错过了什么吗?