各种卷积运算

  • group convolution(群卷积或分组卷积)
  • point-wise convolution (点卷积)
  • separable convolution(可分离卷积)
  • depth-wise convolution (深度卷积)
  • dilated convolution (空洞卷积、扩张卷积)
  • transposed convolution(转置卷积)

group convolution(群卷积或分组卷积)

假设上一层的feature map总共有N个,即通道数channel=N,也就是说上一层有N个卷积核。假设群卷积的群数目M。那么该群卷积层的操作就是,先将channel分成M份。每一个group对应N/Mchannel,与之独立连接。然后各个group卷积完成后将输出叠在一起concatenate,作为这一层的输出channel。(把feature maps分给多个GPU分别进行处理,最后把多个GPU的结果进行融合。)如下图所示:
group convolution

point-wise convolution (点卷积)

point-wise convolution是一种卷积操作,而且是一种特殊的卷积运算,代表着卷积核的大小是 1*1
1*1 卷积核的作用:

  • 实现跨通道信息的融合:加入当前层的特征矩阵为224x224x100,而下一层想要得到224x224x50,可以通过1x1的卷积核进行跨通道信息融合,当然这时也可以通过3x3或5x5的卷积核构建出符合下一层224x224x50的特征矩阵,但是使用1x1卷积核,起到了减少参数的目的。
  • 实现通道数的升维与降维:本来的通道数为100,而下一层的通道数为50,这时就起到了降维的作用。同理假如下一层的通道数为200,这时就是升维。
  • 增加网络的非线性:假如网络本来的通道数为100,而下一层的通道数也是100,这时加入1x1的卷积核并非没有作用,通过1x1卷积核可以增强网络的非线性能力,也可以简单的理解为网络变深了

separable convolution(可分离卷积)

任意指定一个channel,作为卷积核的大小,这样并不影响输入输出的特征图的长宽尺寸,仅仅改变了channel这一维度。举个例子,对于经典的卷积运算,如果说所需的参数量为256x3x3x256=589824。而对于可分离卷积,假设我们指定的卷积核是3x3x4,那首先是256x3x3x4=9216,接下来我们得到了4x256=1024个通道数,下一个过程将channel重新压缩回256,接着有1024x1x1x256=262144,整个过程就是9216+262144=271360。

depth-wise convolution (深度卷积)

深度卷积是拓展Separable convolution而来,可以让卷积核的channel维度等于1,这样就是深度卷积,意为在每一个channel上做卷积。值得注意的是,往往Separable convolution和depth-wise convolution是统称为depth-wise convolution。假设卷积核的shape是[filter_height, filter_width, in_channels, channel_multiplier],区别仅在于channel_multiplier。
depth-wise separable convolution = depth-wise convolution + point-wise convolution

dilated convolution (空洞卷积)

空洞卷积是解决pixel-wise输出模型的一种常用的卷积方式。一种普遍的认识是,pooling下采样操作导致的信息丢失是不可逆的,通常的分类识别模型,只需要预测每一类的概率,所以我们不需要考虑pooling会导致损失图像细节信息的问题,但是做像素级的预测时(譬如语义分割),就要考虑到这个问题了。
在这里插入图片描述
(a)图对应3x3的1-dilated convolution,就是典型的卷积
(b)图对应3x3的2-dilated convolution,实际的卷积kernel size还是3x3,但是空洞为1,相当于kernel的size为7x7,图中只有红色点的权重不为0,其余都为0,把3*3的感受野增大到了7x7。
(c)图是4-dilated convolution,能达到15x15的感受野。

transposed convolution(转置卷积)

转置的卷积在某种程度上来说是相似的,因为它和一个假设的反卷积层所产生的空间分辨率是相同的。但是,正在执行的实际数学运算在值上是不同的。转置卷积层执行的是常规卷积,但它会恢复其空间变换。

关于这一点你可能会感到困惑,所以让我们来看一个具体的示例。将一个5x5的图像馈送到卷积层。其步幅设置为2,padding禁用,内核为3x3。结果是产生一个2x2的图像。

如果我们想反转这个过程,我们需要反数学运算,以便从我们输入的每个像素中生成9个值。之后,我们以2步幅的设置来遍历输出图像。这将是一个反卷积。

而转置卷积将不会进行此类操作。唯一的共同之处在于它保证输出也将是一个5x5的图像,同时仍然执行正常的卷积运算。为了实现这一点,我们需要在输入上执行一些漂亮的padding。

正如你现在可以想象的,这一步并不会从上面扭转这个过程。 至少不包括数值。

它只是在以往的基础上重建空间分辨率并执行卷积操作。这可能不是数学的反演,但是对于Encoder-Decoder架构来说,它仍然非常有用。这样,我们可以将图像的缩放与卷积相结合,而不是将两个过程单独分开进行。

卷积操作的动态图展示

  • 无padding无步幅
  • 随机padding无步幅
  • 半padding无步幅
  • 全padding无步幅
  • 无padding无步幅转置
  • 随机padding无步幅转置
  • 半padding无步幅转置
  • 全padding无步幅转置
  • 无padding有步幅
  • 有padding有步幅
  • 有padding有步幅(奇数)
  • 扩张

联系作者