对depth-wise的改进,将卷积核的参数改为根据输入变化的方式
Introduction
- 卷积缺点在于:内容不变,计算量高
- 动态filter可以根据内容自适应,但是会提高计算量。depth-wise卷积很轻量,但是会降低准确度
- 提出的DDF可以处理这两个缺点,受attention影响,将depth-wise的动态卷积核解耦成空间和channel上的动态filter
Method
- 其实目标很明确,就是要设计一个动态卷积的操作,要做到content-adaptive并且比标准卷积轻量,其核心在于将动态的卷积核分成spatial和channel两个维度上
- 高级的attention,但他并没有在feature map上再乘以某个attention,而是把attention乘在filter上,再像普通卷积一样乘在spatial上面,还挺有意思的,具体的操作可以如下所示,就是将3x3卷积替换成为下图中的计算方法
- 这个图介绍的还是非常清楚的,可以对两个分支做一个具体的介绍。在特征图上使用动态卷积核相当于在展开的特征上使用attention,所以我们将feature map展开来计算动态卷积核。
- 在spatial维度上,首先通过1x1的卷积将channel数变成k2,每个pixel所对应的k2维向量就是我们所想要k×k卷积的一部分值。
- 在channel维度上,通过GAP直接变成一维向量,通过一个SE block的squeeze过程,在实验中实际的squeeze ratio 设为0.2,也就是图中的σ,最后将tensor的channel数变成k2×c个,相当于是不同channel的一个attention值。
- 对于上述两个过程计算的结果,通过BN进行归一化后,将两部分结果按位相乘,这样就可以对原来的特征图每一个pixel每一个channel都有一个通过attention后的卷积核,达到动态的效果,相当于每一步的卷积核都是通过feature map决定的,极大的减少了卷积核的参数
- 可以说对于原始的动态卷积来说,就是对不同的像素点采用不同的卷积核处理,所需要的filter参数量为c′×c×k×k×h×w,现在的这个方法对此进行解耦后,将其简化为channel维度上的c×k×k和spatial维度上的k×k×h×w,减少了相当多的参数
- 这个DDF模块可以替换ResNet block中的3x3卷积
Result
- 从数据上来,看其参数量比普通卷积小,时间复杂度上和Depth-wise Conv类似
pytorch实测
conv > ddf > dwconv
Inference time of conv on size torch.Size([2, 256, 200, 300]) is 12.393740892410278 ms (min 10.938405990600586).
Inference time of dw_conv on size torch.Size([2, 256, 200, 300]) is 0.8601689338684082 ms (min 0.7729530334472656).
Inference time of ddf_layer on size torch.Size([2, 256, 200, 300]) is 3.479689359664917 ms (min 3.3104419708251953).
- 在分类任务上的结果也很好,和普通ResNet比参数量和计算量都减少了很多
总结
- 卷积核的参数可学习化的dwconv
- 不适合端侧推理框架