CNN 中的多种卷积方法
各种卷积运算
- 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/M
个channel
,与之独立连接。然后各个group
卷积完成后将输出叠在一起concatenate
,作为这一层的输出channel
。(把feature maps
分给多个GPU
分别进行处理,最后把多个GPU
的结果进行融合。)如下图所示:
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有步幅(奇数)
- 扩张