目录
一、普通卷积:(“卷积”就是“加权求和”)
1.以2D卷积为例,2D卷积是一个相当简单的操作
2.卷积后的尺寸大小转换公式
3.功能
4.各个指标比较(参数量、计算量、感受野)
5.代码实现
二、转置卷积(Convolution Transposed,又叫反卷积、解卷积)
1.概念或背景
2.卷积后的尺寸大小转换公式
3.功能
4.各个指标比较(参数量、计算量、感受野)
5.转置卷积用途
6.代码实现
三、膨胀卷积( Dilated Convolution,又叫空洞卷积、扩张卷积)
1.概念或背景
2.卷积后的尺寸大小转换公式
3.功能
4.各个指标比较(参数量、计算量、感受野)
5.膨胀卷积用途
6.代码实现
四、分组卷积(Group Convolution)
1.概念或背景
2.卷积后的尺寸大小转换公式
3.功能
4.各个指标比较(参数量、计算量、感受野)
5.分组卷积用途
6.代码实现
五、深度可分离卷积
1.逐通道卷积(Depthwise Convolution即DW卷积)
2.逐点卷积(Pointwise Convolution即PW卷积)
3.深度可分离卷积的功能
4.各个指标比较(参数量、计算量、感受野)
5.深度可分离卷积用途
6.代码实现
六、总结
什么是卷积?
卷积是指在滑动中提取特征的过程,可以形象地理解为用放大镜把每步都放大并且拍下来,再把拍下来的图片拼接成一个新的大图片的过程。
一、普通卷积:(“卷积”就是“加权求和”)
更详细请看笔者的博文:矩阵乘法实现卷积运算_caip12999203000的博客-CSDN博客_矩阵乘法实现卷积
1.以2D卷积为例,2D卷积是一个相当简单的操作
我们先从一个小小的权重矩阵,也就是卷积核(kernel)开始,让它逐步在二维输入数据上“扫描”。卷积核“滑动”的同时,计算权重矩阵和扫描所得的数据矩阵的乘积,然后把结果汇总成一个输出像素。
这里原理上使用的是滑动窗口,但也可以有更多高效的方法,例如:笔者的另外一篇文章,使用的是矩阵乘法实现的卷积运算。
2.卷积后的尺寸大小转换公式
(其中W1为输入矩阵大小,K为卷积核大小,P为向外填充的参数,S为步长,W2为输出的矩阵大小)
3.功能
特征图大小不变或缩小。根据公式通过调整P和S参数可实现特征图大小不变以及缩小。
4.各个指标比较(参数量、计算量、感受野)
(输入的通道数为M,尺寸为DF x DF ,输出通道数为N,卷积核大小为DK x DK ,忽略偏执b。)
5.代码实现
Pytorch(参考)
import torch.nn as nnimport torch# 输入值im = torch.randn(1, 1, 5, 5)# 普通卷积使用c = nn.Conv2d(1, 1, kernel_size=2, stride=2, padding=1)output = c(im)# 输出print("输入:\n",im.shape)print("输出:\n",output.shape)print("卷积核参数:\n",list(c.parameters()))
结果展示:
二、转置卷积(Convolution Transposed,又叫反卷积、解卷积)
更详细请看笔者的博文:转置卷积(Convolution Transposed又叫反卷积、解卷积)_caip12999203000的博客-CSDN博客
1.概念或背景
通常,对图像进行多次卷积运算后,特征图的尺寸会不断缩小。而对于某些特定任务 (如图像分割和图像生成等),需将图像恢复到原尺寸再操作。这个将图像由小分辨率映射到大分辨率的尺寸恢复操作,叫做上采样 (Upsample)。
2.卷积后的尺寸大小转换公式
(其中W1为输入矩阵大小,K为卷积核大小,P为向外填充的参数,S为步长,W2为输出的矩阵大小)
3.功能
特征图变大(上采样)。将低分辨率的特征图样上采样到原始图像的分辨率大小,以给出原始图片的分割结果。
4.各个指标比较(参数量、计算量、感受野)
(输入的通道数为M,尺寸为DF x DF ,输出通道数为N,卷积核大小为DK x DK ,忽略偏执b。)
5.转置卷积用途
1)在 DCGAN,生成器将随机值转变为一个全尺寸图片,此时需用到转置卷积。
2)在语义分割中,会在编码器中用卷积层提取特征,然后在解码器中恢复原先尺寸,从而对原图中的每个像素分类。该过程同样需用转置卷积。经典方法有 FCN 和 U-net。
3)CNN 可视化:通过转置卷积将 CNN 的特征图还原到像素空间,以观察特定特征图对哪些模式的图像敏感。
6.代码实现
Pytorch(参考)
import torch.nn as nnimport torch# 输入值im = torch.randn(1, 1, 5, 5)# 转置卷积使用c = nn.ConvTranspose2d(1, 1, kernel_size=2, bias=False)output = c(im)# 输出print("输入:\n",im.shape)print("输出:\n",output.shape)print("卷积核参数:\n",list(c.parameters()))
结果展示
三、膨胀卷积( Dilated Convolution,又叫空洞卷积、扩张卷积)
更详细请看笔者的博文:
膨胀卷积(Dilated convolutions)(又成空洞卷积、扩张卷积)_caip12999203000的博客-CSDN博客
1.概念或背景
膨胀卷积是在标准卷积的Convolution map的基础上注入空洞,以此来增加感受野(reception field)。因此,膨胀卷积在标准卷积的基础上又多了一个超参数(hyper-parameter)称之为膨胀率(dilation rate),该超参数指的是kernel的间隔数量。膨胀卷积是为解决语义分割任务而提出的。
2.卷积后的尺寸大小转换公式
(其中W1为输入矩阵大小,K为卷积核大小,P为向外填充的参数,S为步长,a为膨胀率,W2为输出的矩阵大小)
3.功能
增大感受野,卷积核中间填充0。在于普通卷积相同的计算条件下的情况下,该卷积可以增大特征图的感受野。另外,通过修改padding的大小,可以保证输入输出特征图的shape不变。
4.各个指标比较(参数量、计算量、感受野)
(输入的通道数为M,尺寸为DF x DF ,输出通道数为N, a为膨胀率,卷积核大小为DK x DK ,忽略偏执b。)
5.膨胀卷积用途
1)膨胀卷积(Dilated Convolution),广泛应用于语义分割与目标检测等任务中,语义分割中经典的deeplab系列与DUC对空洞卷积进行了深入的思考。目标检测中SSD与RFBNet,同样使用了空洞卷积。
2)ESPNet, ESP模块模块包含point-wise卷积和空洞卷积金字塔,每层具有不同的dilation rate,在参数量不增加的情况下,能够融合多尺度特征,相比于深度可分离卷积,深度可分离空洞卷积金字塔性价比更高。(参考)
6.代码实现
Pytorch(参考)
膨胀卷积中,padding与dilation所使用的因子需要是相同的,否则,可能会导致图像的尺寸会发生变化,就不是膨胀卷积了。
import torch.nn as nnimport torch# 输入值im = torch.randn(1, 1, 5, 5)# 膨胀卷积使用dilation=2 # 膨胀率c=nn.Conv2d(1, 1, kernel_size=2, stride=2,padding=dilation, bias=False, dilation=dilation)output = c(im)# 输出print("输入:\n",im.shape)print("输出:\n",output.shape)print("卷积核参数:\n",list(c.parameters()))
结果展示:
四、分组卷积(Group Convolution)
更详细请看笔者的博文:
组卷积和深度可分离卷积_caip12999203000的博客-CSDN博客
1.概念或背景
分组卷积(Group Convolution)顾名思义,在对特征图进行卷积的时候,首先对特征图分组再卷积。
2.卷积后的尺寸大小转换公式
(其中W1为输入矩阵大小,K为卷积核大小,P为向外填充的参数,S为步长,W2为输出的矩阵大小)
3.功能
1)减少参数量,分成G组,则该层的参数量减为原来的1/G。
2)分组卷积可以看做是对原来的特征图进行了一个dropout,有正则的效果。
4.各个指标比较(参数量、计算量、感受野)
(输入的通道数为M,尺寸为DF x DF ,输出通道数为N,卷积核大小为DK x DK ,g为组数,忽略偏执b。)
5.分组卷积用途
1)分组卷积,最早在AlexNet中出现,由于当时的硬件资源有限,训练AlexNet时卷积操作不能全部放在同一个GPU处理,因此作者把feature maps分给多个GPU分别进行处理,最有把多个GPU的结果进行融合。
2) IGCV1, 简单通道的分组,都是只有一个分组,而以IGCV(Interleaved Group Convolutions交替组卷积)系列为代表的模型采用了多个分组卷积结构级联的形式。(参考)
6.代码实现
Pytorch(参考)
import torch.nn as nnimport torchimport numpy as np# 输入值im = torch.randn(1, 4, 5, 5)# 分组卷积使用groups = 2 # 组数c=nn.Conv2d(4, 2, kernel_size=2, stride=2, padding=2, groups=groups, bias=False)output = c(im)# 输出print("输入:\n",im.shape)print("输出:\n",output.shape)print("卷积核参数:\n",list(c.parameters()))
结果展示:
五、深度可分离卷积
更详细请看笔者的博文:
组卷积和深度可分离卷积_caip12999203000的博客-CSDN博客
在计算资源受限制的移动端设备上,常规的卷积操作由于计算量大,经常难以满足实际运行速度的要求,这时深度可分离卷积(Depthwise Separable Convolution)就派上了用场。深度可分离卷积是由Depthwise(DW)卷积与Pointwise(PW)卷积组成。该结构和常规卷积类似,可用来提取特征,但相比常规卷积,其参数量和运算成本较低,所以在一些轻量级网络中经常用到此结构,如MobileNet、ShuffleNet。
1.逐通道卷积(Depthwise Convolution即DW卷积)
Depthwise Convolution的一个卷积核负责一个通道,一个通道只被一个卷积核卷积,这个过程产生的Feature Map通道数和输入的通道数一样。
2.逐点卷积(Pointwise Convolution即PW卷积)
Pointwise Convolution的运算与常规卷积非常相似,它的卷积核大小1x1xM,M为上一层的通道数,所以这里的卷积运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map。有几个卷积核就有几个Feature map,卷积核的shape即为:1 x 1 x 输入通道数 x 输出通道数)
3.深度可分离卷积的功能
可以看出运用深度可分离卷积比普通卷积减少了所需要的参数。重要的是深度可分离卷积将以往普通卷积操作同时考虑通道和区域改变成,卷积先只考虑区域,然后再考虑通道。实现了通道和区域的分离。
4.各个指标比较(参数量、计算量、感受野)
(输入的通道数为M,尺寸为DF x DF ,输出通道数为N, a为膨胀率,卷积核大小为DK x DK , n为卷积核的个数,忽略偏执b。)
5.深度可分离卷积用途
1)在一些轻量级网络中经常用到此结构,如MobileNet、ShuffleNet、SqueezeNet等
2) Xception,基 于Inception系列网络结构的基础上,结合depthwise separable convolution, 就是Xception。(参考)
6.代码实现
Pytorch
import torch.nn as nnimport torchimport numpy as np# 输入值im = torch.randn(1, 4, 5, 5)# 深度可分卷积使用hidden_channel = 4 # 组数out_channel = 1# DW卷积c1 = nn.Conv2d(hidden_channel, hidden_channel, kernel_size=2, stride=2, padding=2, groups=hidden_channel, bias=False)# PW卷积c2 = nn.Conv2d(hidden_channel, out_channel, kernel_size=1, bias=False)output1 = c1(im)output2 = c2(output1)# 输出print("输入:\n",im.shape)print("输出:\n",output2.shape)print("卷积核参数:\n",list(c2.parameters()))
结果展示:
六、总结
上面是笔者对于前面几个博客关于卷积的总结,分别从概念、背景、原理、参数量、计算量、感受野、各种卷积的优点以及在网络的应用展开讲解。如果您感觉有用的话,请点个,谢谢。