一、常规卷积操作
假设有一个3×3大小的卷积层,其输入通道为3、输出通道为4。
那么一般的操作就是用4个(333)的卷积核来分别同输入数据卷积,得到的输出是只有一个通道的数据。之所以会得到一通道的数据,是因为刚开始3×3×3的卷积核的每个通道会在输入数据的每个对应通道上做卷积,然后叠加每一个通道对应位置的值,使之变成了单通道,那么4个卷积核一共需要(3×3×3)×4 =108个参数。
二、深度可分离卷积操作
1.Depthwise Convolution(逐层)
Depthwise Convolution的一个卷积核负责一个通道,一个通道只被一个卷积核卷积。上面所提到的常规卷积每个卷积核是同时操作输入图片的每个通道。同样是对于一张5×5像素、三通道彩色输入图片(shape为5×5×3),Depthwise Convolution首先经过第一次卷积运算,不同于上面的常规卷积,DW完全是在二维平面内进行。卷积核的数量与上一层的通道数相同(通道和卷积核一一对应)。所以一个三通道的图像经过运算后生成了3个Feature map(如果有same padding则尺寸与输入层相同为5×5),Depthwise Convolution完成后的Feature map数量与输入层的通道数相同,无法扩展Feature map。而且这种运算对输入层的每个通道独立进行卷积运算,没有有效的利用不同通道在相同空间位置上的feature信息。因此需要Pointwise Convolution来将这些Feature map进行组合生成新的Feature map。
2.Pointwise Convolution(逐像素)
Pointwise Convolution的运算与常规卷积运算非常相似,它的卷积核的尺寸为 1×1×M,M为上一层的通道数。所以这里的卷积运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map。有几个卷积核就有几个输出Feature map。
3.优点
(1)运用深度可分离卷积比普通卷积减少了所需要的参数。
(2)重要的是深度可分离卷积将以往普通卷积操作同时考虑通道和区域改变成,卷积先只考虑区域,然后再考虑通道。实现了通道和区域的分离。
三、空洞卷积
1.pooling层的作用:
(1)不变性(平移、旋转、尺度缩放)
增大了感受野。例如一个0,开始被1616的图表示,pooling后能够被44的图表示。如果遇到了2*2的卷积核,就能够多框进去一些信息。
(2)减少参数量,防止过拟合
2.空洞卷积
在图像分割领域,图像输入到CNN中,FCN先像传统的CNN那样对图像做卷积再pooling,降低图像尺寸的同时增大感受野,但是由于图像分割预测是pixel-wise的输出,所以要将pooling后较小的图像尺寸upsampling到原始的图像尺寸进行预测。一种普遍的认识是,pooling下采样操作导致的信息丢失是不可逆的。通常的分类识别模型,只需要预测每一类的概率,所以我们不需要考虑pooling会导致损失图像细节信息的问题,但是做像素级的预测时(譬如语义分割),就要考虑到这个问题了。**所以就要有一种卷积代替pooling的作用(成倍的增加感受野),而空洞卷积就是为了做这个的。**dilated的好处是不做pooling损失信息的情况下,加大了感受野,让每个卷积输出都包含较大范围的信息。
上图是一个扩张率为2的3×3卷积核,感受野与5×5的卷积核相同,而且仅需要9个参数。你可以把它想象成一个5×5的卷积核,每隔一行或一列删除一行或一列。dilated conv不是在像素之间padding空白的像素,而是在已有的像素上,skip掉一些像素,或者输入不变,对conv的kernel参数中插一些0的weight,达到一次卷积看到的空间范围变大的目的。
**在相同的计算条件下,空洞卷积提供了更大的感受野。**空洞卷积经常用在实时图像分割中。当网络层需要较大的感受野,但计算资源有限而无法提高卷积核数量或大小时,可以考虑空洞卷积。
3.空洞卷积感受野的计算:
四、分组卷积(group convolution)
1.原理
图中将输入数据分成了2组(组数为g),需要注意的是,这种分组只是在深度上进行划分,即某几个通道编为一组,这个具体的数量由(C1/g)决定。因为输出数据的改变,相应的,卷积核也需要做出同样的改变。即每组中卷积核的深度也就变成了(C1/g),而卷积核的大小是不需要改变的,此时每组的卷积核的个数就变成了(C2/g)个,而不是原来的C2了。然后用每组的卷积核同它们对应组内的输入数据卷积,得到了输出数据以后,再用concatenate的方式组合起来,最终的输出数据的通道仍旧是C2。也就是说,分组数g决定以后,那么我们将并行的运算g个相同的卷积过程,每个过程里(每组),输入数据为H1×W1×C1/g,卷积核大小为h1×w1×C1/g,一共有C2/g个,输出数据为H2×W2×C2/g。
2.优点
极大地减少了参数。比如当输入通道为256,输出通道也为256,kernel size为3×3,不做Group conv参数为256×3×3×256。实施分组卷积时,若group为8,每个group的input channel和output channel均为32,参数为8×32×3×3×32,是原来的八分之一。而Group conv最后每一组输出的feature maps应该是以concatenate的方式组合。
Alex认为group conv的方式能够增加 filter之间的对角相关性,而且能够减少训练参数,不容易过拟合,这类似于正则的效果。
五、转置卷积(transposed Convolutions)
1.原理
又名反卷积(deconvolution)【此处的反卷积不是数学意义上的反卷积】或是分数步长卷积(fractially straced convolutions)
之所以叫转置卷积是因为,它其实是把我们平时所用普通卷积操作中的卷积核做一个转置,然后把普通卷积的输出作为转置卷积的输入,而转置卷积的输出,就是普通卷积的输入。
普通卷积计算过程:
卷积核大小为3x3,步长为2,padding为1的普通卷积。卷积核在红框位置时输出元素1,在绿色位置时输出元素2。我们可以发现,输入元素a仅和一个输出元素有运算关系,也就是元素1,而输入元素b和输出元素1, 2均有关系。同理c只和一个元素2有关,而d和1,2,3,4四个元素都有关。那么在进行转置卷积时,依然应该保持这个连接关系不变。
转置卷积(反卷积)的计算过程
根据前面的分析,我们需要将上图中绿色的特征图作为输入,蓝色的特征图作为输出,并且保证连接关系不变。也就是说,a只和1有关,b和1,2两个元素有关,其它类推。怎么才能达到这个效果呢?我们可以先用0给绿色特征图做插值,插值的个数就是使相邻两个绿色元素的间隔为卷积的步长,同时边缘也需要进行与插值数量相等的补0。如下图:
这时候卷积核的滑动步长就不是2了,而是1,步长体现在了插值补0的过程中。
一般在CNN中,转置卷积用于对特征图进行上采样,比如我们想要将特征图扩大2倍,那么就可以使用步长为2的转置卷积。但是且慢!为什么我们这里2x2的输入,只得到了3x3的输出呢?说好的扩大2倍呢?不应该是4x4么?
2.输出图尺寸计算:
假设我们做转置卷积的输入特征图大小为 n×n,卷积核大小为k×k,后面为了表示方便,我们直接使用边长来表示大小。
步长stride为s,那么转置卷积需要在四周每个边缘补0的数量为s−1,边缘和内部插空补0后输入特征图大小变为
s×n+s−1
使用大小为kk的卷积核进行卷积(滑动步长为1),得到的输出特征图大小为:
h=(h-1)s-2padding+k+output padding