分组卷积(Group Convolution)与深度可分离卷积(Depthwise Separable Convolution)

常规卷积

输入input[1, 3, 64, 64], kernel[3, 4, 3, 3], stride=1, padding=0, 输出output[1, 4, 62,62]

import torch
x = torch.rand(1, 3, 64, 64)
m = torch.nn.Conv2d(3, 4, kernel_size=3, stride=1)
y = m(x)

分组卷积(Group Convolution)与深度可分离卷积(Depthwise Separable Convolution)_第1张图片


分组卷积

分组卷积(Group Convolution)与深度可分离卷积(Depthwise Separable Convolution)_第2张图片
如上图,左边是常规卷积,假设input_features[1, 12, Hi, Wi], output_features[1, 6, Ho, Wo],此时需要的kernel[12, 6, K, K], 卷积核的总参数量为12*6*K*K;右边为分组卷积,分组即将input_features进行分组,假设这里将input_features分为三组,每组有四个维度,那么每一组的input_features[1, 4, Hi, Wi], 输出的output_features[1, 2, Ho, Wo],此时每组需要的Kernel[4, 2, K, K], 每组的卷积核参数总量为4*2*K*K, 一共有三组,所以分组卷积时卷积核总的参数量为4*2*K*K*3。参数量是常规卷积的1/3。假设分组卷积分为G组,那么参数量就变为常规卷积的1/G。

示例:

import torch.nn.functional as F
k = torch.rand(256, 1, 4, 4)
x = torch.rand(1, 256, 24, 24)
y1 = F.conv2d(x, k, groups=256)

分组卷积的作用
  1. 减少参数量
  2. 有时候可以起到正则化的效果
  3. Depthwise Convolution,参见MobileNet和Xception等
  4. Global Depthwise Convolution 参考:https://www.cnblogs.com/shine-lee/p/10243114.html



深度可分离卷积

深度可以分离卷积是讲卷积过程分为Depthwise Convolution与Pointwise Convolution进行。

Depthwise Convolution

Depthwise Convolution其实就是分组卷积的分组数跟input_features的channel数一样的时候,然后一个卷积核负责一个通道,一个通道只被一个卷积核卷积(拿分组卷积中的例子来说的话,就是分为12组)。
分组卷积(Group Convolution)与深度可分离卷积(Depthwise Separable Convolution)_第3张图片
Depthwise Convolution完成后的Feature map数量与输入层的通道数相同,无法扩展Feature map。而且这种运算对输入层的每个通道独立进行卷积运算,没有有效的利用不同通道在相同空间位置上的feature信息。因此需要Pointwise Convolution来将这些Feature map进行组合生成新的Feature map。
此段原文链接:https://blog.csdn.net/tintinetmilou/article/details/81607721

Pointwise Convolution

Pointwise Convolution中的kernel[K, N, 1, 1], 这里K的大小跟上一层的通道数是一致的,实现了深度方向的加权组合。
分组卷积(Group Convolution)与深度可分离卷积(Depthwise Separable Convolution)_第4张图片

参考:
https://www.cnblogs.com/shine-lee/p/10243114.html
https://blog.csdn.net/tintinetmilou/article/details/81607721

你可能感兴趣的:(计算机视觉)