本文主要介绍常见的几种卷积的概念和计算方法,主要包括:卷积、空洞卷积、深度卷积、逐点卷积、空间可分离卷积、深度可分离卷积。

卷积(convolution)

讨论卷积之前先介绍一下相关的概念:

卷积核

卷积核(convolution kernel):也叫滤波器(Filter),就是一个nxn的矩阵,矩阵的成员就是我们要训练的权重值,整个图片使用一个卷积核这也就实现了共享权重。卷积核的值不需要提前设计,只需要初始化,然后通过训练进行优化,这也就是模型训练要做的事情。

padding填充

为了避免一些边界上的值在计算时取不到会在图像的外面填充一些数据,在另一篇文章中已经介绍过了:https://blog.csdn.net/itlilyer/article/details/107288176

步长 stride

在做卷积过程中需要按照滑动窗口的方式来对整个图片的像素点进行卷积操作,步长就是每次滑动的元素个数,分为横向和纵向。

卷积计算

卷积的计算过程就是讲图像的像素点与卷积核对应位置相乘然后再将乘积相加得到的结果,这就是单步的卷积计算过程。在通过滑动窗口遍历整个图片的像素点就可以得到特征图(Feature Map)。
在这里插入图片描述

空洞卷积(dilated convolution)

论文链接:https://arxiv.org/abs/1511.07122
空洞卷积是为了解决标准卷积在分割领域出现的内部数据结构丢失和空间层级化数据丢失提出的解决方案。空洞卷积也叫扩张卷积或者膨胀卷积,简单来说就是在卷积核元素之间加入一些空格(零)来扩大卷积核的过程。
主要作用:1.扩大感受野;2.捕捉多尺度的上下文信息。
在这里插入图片描述(a)图对应3x3的1-dilated conv,和普通的卷积操作一样,

(b)图对应3x3的2-dilated conv,实际的卷积kernel size还是3x3,但是空洞为1,也就是对于一个7x7的图像patch,只有9个红色的点和3x3的kernel发生卷积操作,其余的点略过。也可以理解为kernel的size为7x7,但是只有图中的9个点的权重不为0,其余都为0。(有两种实现方式,第一,卷积核填充0,第二,输入等间隔采样。) 可以看到虽然kernel size只有3x3,但是这个卷积的感受野已经增大到了7x7(如果考虑到这个2-dilated conv的前一层是一个1-dilated conv的话,那么每个红点就是1-dilated的卷积输出,所以感受野为3x3,所以1-dilated和2-dilated合起来就能达到7x7的conv)

©图是4-dilated conv操作,同理跟在两个1-dilated和2-dilated conv的后面,能达到15x15的感受野。对比传统的conv操作,3层3x3的卷积加起来,stride为1的话,只能达到(kernel-1)*layer+1=7的感受野,也就是和层数layer成线性关系,而dilated conv的感受野是指数级的增长。

深度卷积(depthwise Conv)

深度卷积就是对每个channel单独进行卷积操作,输出的feature map的channle和之前是一样的。

逐点卷积(pointwise Conv)

逐点卷积就是执行1x1卷积,来进行单点上的特征提取。

空间可分离卷积

主要在卷积核上操作。例如将一个3x3的卷积拆分成1x3和3x1两个卷积

深度可分离卷积(depthwise separable Convolution)

主要是将普通的卷积操作划分为两个步骤:深度卷积(depthwise Conv)和逐点卷积(pointwise Conv)

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐