Dilated conv,中文叫做
空洞卷积
或者膨胀卷积
,起源于语义分割,本文记录相关内容。
膨胀卷积是为解决语义分割任务而提出的。因为深度学习的蓬勃发展,其也被迁移应用于语义分割领域。当时的SOTA方法多是基于卷积神经网络,但卷积神经网络当初是为图像分类任务而设计的。语义分割作为一种稠密预测(Dense Prediction)任务——语义分割是像素级的分类任务,与图像分类具有结构上的不同。这里的不同指的应该是,图像分类的网络只需输出相应的物体类别的概率,而语义分割网络则需要输出与原图像大小相同的图像。
图像分类任务为了获取足够的感受野(感受野的概念会在下文进行讲解),都会通过池化层或者大步长的卷积对图像和特征图进行下采样的操作,这样就减小了图像或者特征图的分辨率,这与语义分割的输出要求是相违背的。当时解决此问题主要有两种办法:
但膨胀卷积的作者对此两种方法提出疑问:网络中的下采样层对于语义分割任务来说真的是必要的吗?多尺度图像的输入是必要的吗?有没有什么办法可以在不改变图像分辨率的前提下获取足够的感受野,使得网络关注多尺度的上下文语义信息?
基于以上疑问,作者受到小波变换领域的膨胀概念,提出了膨胀卷积,并将其做成即插即用的模块,放入卷积神经网络中。如图1所示,经测试,取得了不错的效果。
膨胀卷积,顾名思义,是经过膨胀设计的卷积运算。
可以看出,膨胀卷积的卷积核是在普通卷积核的基础上扩大了尺寸,但是真正参与运算的卷积核单元没有变化(图中只有蓝色方块才是参与运算的单元,无色小方块中的元素用0填充。左半部分的普通卷积核尺寸为3×3,右半部分卷积核尺寸为5×5,但右半部分深蓝色的参与运算的元素依然是9 3×3 个),看到这里大家应该知道膨胀卷积是什么样的了。
可以看出,膨胀卷积其实是通过扩大卷积核尺寸的方式来增大感受野,同时既没有增大计算量,也没有降低特征图的分辨率。
膨胀卷积有一个超参数:膨胀因子S,通过膨胀因子我们可以控制卷积核的膨胀程度,上图中的膨胀因子为2。膨胀因子是如何控制卷积核的膨胀程度的呢?
参数含义:
K_c:K : 普通卷积核通过膨胀设计后的卷积核尺寸 K_o : 普通卷积核尺寸
上图中,普通卷积核尺寸3×3,S SS为2,那么膨胀之后的卷积核尺寸为5×5。
膨胀卷积核元素之间的间隔 = S-1,图中 S=2 ,行列元素间隔各为1。
感受野 是影响深度神经网络性能的重要因素之一。所以在平时深度神经网络的设计中要注意各层特征图的感受野,以确保在当前层能获得适合所解决任务需要的感受野大小,即特征图中包含了足够多原图的语义信息,从而发挥出深度神经网络的最佳性能。
感受野有比较科学的计算公式:
参数含义:
RF_{l+1} : 第 l+1 层的感受野 RF_{l} : 第 l 层的感受野 k : 第 l+1 的卷积核尺寸 S_l : 前 l 层的步长之积
注意: 当前层的步长并不影响当前层的感受野。
F_1 ,F _2 ,F _3 分别是第1,2,3层特征图。 F_1,F_2,F_3 是级联形式,即 F_1 是由原图得到的,F_2 是由 F_1 得到的,F_3 是由 F_2 得到的。每层特征图均采用步长为1的方式计算得到。根据上边计算感受野的公式可知:
作者在论文中给出的计算公式:
RF_{i+1} :第 i+1 层特征图的感受野
使得输出更为稠密,适应语义分割任务;
避免了使用 down-sampling 这样的特性;
在不降低分辨率的情况下,增大感受野。
gridding problem
,如果我们叠加多个相同的膨胀卷积,会发现感受野中有很多像素没有利用上(感受野的方阵中只有蓝色和红色方块参与计算,白色方块使用零填充,相当于没有参与运算),出现大量空洞。此时,会丢失数据之间的连续性及完整性,不利于学习。针对以上缺点,图森未来的研究人员对膨胀卷积进行了改进,并提出了Hybrid Dilated Convolution(HDC)。HDC主要有三个特性:
参数含义:
Pytorch中膨胀卷积和普通卷积共用一个API,只是通过膨胀因子的参数进行区分,膨胀因子设置为1时就是普通卷积。
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)
参数含义:
in_channels (int) – Number of channels in the input image
out_channels (int) – Number of channels produced by the convolution
kernel_size (int or tuple) – Size of the convolving kernel
stride (int or tuple, optional) – Stride of the convolution. Default: 1
padding (int, tuple or str, optional) – Padding added to all four sides of the input. Default: 0
padding_mode (string, optional) – ‘zeros’, ‘reflect’, ‘replicate’ or ‘circular’. Default: ‘zeros’
dilation (int or tuple, optional) – Spacing between kernel elements. Default: 1
groups (int, optional) – Number of blocked connections from input channels to output channels. Default: 1
bias (bool, optional) – If True, adds a learnable bias to the output. Default: True
dilation为膨胀因子,默认为1,即普通卷积。
文章链接:
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有