理解Dilation convolution

article/2025/11/6 12:58:00

论文:Multi-scale context aggregation with dilated convolutions

简单讨论下dilated conv,中文可以叫做空洞卷积或者扩张卷积。首先介绍一下dilated conv诞生背景[4],再解释dilated conv操作本身,以及应用。

首先是诞生背景,在图像分割领域,图像输入到CNN(典型的网络比如FCN[3])中,FCN先像传统的CNN那样对图像做卷积再pooling,降低图像尺寸的同时增大感受野,但是由于图像分割预测是pixel-wise的输出,所以要将pooling后较小的图像尺寸upsampling到原始的图像尺寸进行预测(upsampling一般采用deconv反卷积操作,deconv可参见知乎答案如何理解深度学习中的deconvolution networks?),之前的pooling操作使得每个pixel预测都能看到较大感受野信息。因此图像分割FCN中有两个关键,一个是pooling减小图像尺寸增大感受野,另一个是upsampling扩大图像尺寸。在先减小再增大尺寸的过程中,肯定有一些信息损失掉了,那么能不能设计一种新的操作,不通过pooling也能有较大的感受野看到更多的信息呢?答案就是dilated conv。

下面看一下dilated conv原始论文[4]中的示意图:

(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。 可以看到虽然kernel size只有3x3,但是这个卷积的感受野已经增大到了7x7(如果考虑到这个2-dilated conv的前一层是一个1-dilated conv的话,那么每个红点就是1-dilated的卷积输出,所以感受野为3x3,所以1-dilated和2-dilated合起来就能达到7x7的conv),(c)图是4-dilated conv操作,同理跟在两个1-dilated和2-dilated conv的后面,能达到15x15的感受野。对比传统的conv操作,3层3x3的卷积加起来,stride为1的话,只能达到(kernel-1)*layer+1=7的感受野,也就是和层数layer成线性关系,而dilated conv的感受野是指数级的增长。

dilated的好处是不做pooling损失信息的情况下,加大了感受野,让每个卷积输出都包含较大范围的信息。在图像需要全局信息或者语音文本需要较长的sequence信息依赖的问题中,都能很好的应用dilated conv,比如图像分割[3]、语音合成WaveNet[2]、机器翻译ByteNet[1]中。

下面再阐述下deconv和dilated conv的区别:

deconv的具体解释可参见如何理解深度学习中的deconvolution networks?,deconv的其中一个用途是做upsampling,即增大图像尺寸。而dilated conv并不是做upsampling,而是增大感受野。

可以形象的做个解释:

对于标准的k*k卷积操作,stride为s,分三种情况:

(1) s>1,即卷积的同时做了downsampling,卷积后图像尺寸减小;

(2) s=1,普通的步长为1的卷积,比如在tensorflow中设置padding=SAME的话,卷积的图像输入和输出有相同的尺寸大小;

(3) 0<s<1,fractionally strided convolution,相当于对图像做upsampling。比如s=0.5时,意味着在图像每个像素之间padding一个空白的像素后,stride改为1做卷积,得到的feature map尺寸增大一倍。

而dilated conv不是在像素之间padding空白的像素,而是在已有的像素上,skip掉一些像素,或者输入不变,对conv的kernel参数中插一些0的weight,达到一次卷积看到的空间范围变大的目的。

当然将普通的卷积stride步长设为大于1,也会达到增加感受野的效果,但是stride大于1就会导致downsampling,图像尺寸变小。大家可以从以上理解到deconv,dilated conv,pooling/downsampling,upsampling之间的联系与区别,欢迎留言沟通交流。

 

[1] Kalchbrenner, Nal, et al. "Neural machine translation in linear time." arXiv preprint arXiv:1610.10099 (2016).

[2] Oord, Aaron van den, et al. "Wavenet: A generative model for raw audio." arXiv preprint arXiv:1609.03499 (2016).

[3] Long J, Shelhamer E, Darrell T, et al. Fully convolutional networks for semantic segmentation[C]. Computer Vision and Pattern Recognition, 2015.

[4] Yu, Fisher, and Vladlen Koltun. "Multi-scale context aggregation by dilated convolutions." arXiv preprint arXiv:1511.07122(2015).

作者:谭旭

链接:https://www.zhihu.com/question/54149221/answer/192025860

 

####################################################################################

Dilated/Atrous Convolution 或者是 Convolution with holes 从字面上就很好理解,是在标准的 convolution map 里注入空洞,以此来增加 reception field。相比原来的正常convolution,dilated convolution 多了一个 hyper-parameter 称之为 dilation rate 指的是kernel的间隔数量(e.g. 正常的 convolution 是 dilatation rate 1)。

不过光理解他的工作原理还是远远不够的,要充分理解这个概念我们得重新审视卷积本身,并去了解他背后的设计直觉。以下主要讨论 dilated convolution 在语义分割 (semantic segmentation) 的应用。

重新思考卷积: Rethinking Convolution

在赢得其中一届ImageNet比赛里VGG网络的文章中,他最大的贡献并不是VGG网络本身,而是他对于卷积叠加的一个巧妙观察。

This (stack of three 3 × 3 conv layers) can be seen as imposing a regularisation on the 7 × 7 conv. filters, forcing them to have a decomposition through the 3 × 3 filters (with non-linearity injected in between).

这里意思是 7 x 7 的卷积层可以看做 3 个 3 x 3 的卷积层的叠加后的正则。而这样的设计不仅可以大幅度的减少参数,其本身带有正则性质的 convolution map 能够更容易学一个 generlisable, expressive feature space。这也是现在绝大部分基于卷积的深层网络都在用小卷积核的原因。

<img data-rawheight="618" src="https://pic1.zhimg.com/50/v2-ee6f0084ca22aa8dc3138462ee4c24df_hd.jpg" data-size="normal" data-rawwidth="1422" class="origin_image zh-lightbox-thumb" width="1422" data-original="https://pic1.zhimg.com/v2-ee6f0084ca22aa8dc3138462ee4c24df_r.jpg">

然而 Deep CNN 对于其他任务还有一些致命性的缺陷。较为著名的是 up-sampling 和 pooling layer 的设计。这个在 Hinton 的演讲里也一直提到过。

主要问题有:

  1. Up-sampling / pooling layer (e.g. bilinear interpolation) is deterministic. (a.k.a. not learnable)
  2. 内部数据结构丢失;空间层级化信息丢失。
  3. 小物体信息无法重建 (假设有四个pooling layer 则 任何小于 2^4 = 16 pixel 的物体信息将理论上无法重建。)

在这样问题的存在下,语义分割问题一直处在瓶颈期无法再明显提高精度, 而 dilated convolution 的设计就良好的避免了这些问题。

空洞卷积的拯救之路:Dilated Convolution to the Rescue

题主提到的这篇文章 MULTI-SCALE CONTEXT AGGREGATION BY DILATED CONVOLUTIONS 可能(?) 是第一篇尝试用 dilated convolution 做语义分割的文章。后续图森组和 Google Brain 都对于 dilated convolution 有着更细节的讨论,推荐阅读:Understanding Convolution for Semantic Segmentation Rethinking Atrous Convolution for Semantic Image Segmentation 。

对于 dilated convolution, 我们已经可以发现他的优点,即内部数据结构的保留和避免使用 down-sampling 这样的特性。但是完全基于 dilated convolution 的结构如何设计则是一个新的问题。

潜在问题 1:The Gridding Effect

假设我们仅仅多次叠加 dilation rate 2 的 3 x 3 kernel 的话,则会出现这个问题:

<img data-rawheight="370" src="https://pic1.zhimg.com/50/v2-478a6b82e1508a147712af63d6472d9a_hd.jpg" data-size="normal" data-rawwidth="1154" class="origin_image zh-lightbox-thumb" width="1154" data-original="https://pic1.zhimg.com/v2-478a6b82e1508a147712af63d6472d9a_r.jpg">

我们发现我们的 kernel 并不连续,也就是并不是所有的 pixel 都用来计算了,因此这里将信息看做 checker-board 的方式会损失信息的连续性。这对 pixel-level dense prediction 的任务来说是致命的。

潜在问题 2:Long-ranged information might be not relevant.

我们从 dilated convolution 的设计背景来看就能推测出这样的设计是用来获取 long-ranged information。然而光采用大 dilation rate 的信息或许只对一些大物体分割有效果,而对小物体来说可能则有弊无利了。如何同时处理不同大小的物体的关系,则是设计好 dilated convolution 网络的关键。

通向标准化设计:Hybrid Dilated Convolution (HDC)

对于上个 section 里提到的几个问题,图森组的文章对其提出了较好的解决的方法。他们设计了一个称之为 HDC 的设计结构。

第一个特性是,叠加卷积的 dilation rate 不能有大于1的公约数。比如 [2, 4, 6] 则不是一个好的三层卷积,依然会出现 gridding effect。

第二个特性是,我们将 dilation rate 设计成 锯齿状结构,例如 [1, 2, 5, 1, 2, 5] 循环结构。

第三个特性是,我们需要满足一下这个式子: M_i=\max[M_{i+1}-2r_i,M_{i+1}-2(M_{i+1}-r_i),r_i]

其中 r_i 是 i 层的 dilation rate 而 M_i 是指在 i 层的最大dilation rate,那么假设总共有n层的话,默认 M_n=r_n 。假设我们应用于 kernel 为 k x k 的话,我们的目标则是 M_2 \leq k ,这样我们至少可以用 dilation rate 1 即 standard convolution 的方式来覆盖掉所有洞。

一个简单的例子: dilation rate [1, 2, 5] with 3 x 3 kernel (可行的方案)

<img data-rawheight="612" src="https://pic1.zhimg.com/50/v2-3e1055241ad089fd5da18463903616cc_hd.jpg" data-size="normal" data-rawwidth="1766" class="origin_image zh-lightbox-thumb" width="1766" data-original="https://pic1.zhimg.com/v2-3e1055241ad089fd5da18463903616cc_r.jpg">

而这样的锯齿状本身的性质就比较好的来同时满足小物体大物体的分割要求(小 dilation rate 来关心近距离信息,大 dilation rate 来关心远距离信息)。

这样我们的卷积依然是连续的也就依然能满足VGG组观察的结论,大卷积是由小卷积的 regularisation 的 叠加。

以下的对比实验可以明显看出,一个良好设计的 dilated convolution 网络能够有效避免 gridding effect.

<img data-rawheight="688" src="https://pic4.zhimg.com/50/v2-b2b6f12a4c3d244c4bc7eb33814a1f0d_hd.jpg" data-size="normal" data-rawwidth="1448" class="origin_image zh-lightbox-thumb" width="1448" data-original="https://pic4.zhimg.com/v2-b2b6f12a4c3d244c4bc7eb33814a1f0d_r.jpg">

多尺度分割的另类解:Atrous Spatial Pyramid Pooling (ASPP)

在处理多尺度物体分割时,我们通常会有以下几种方式来操作:

<img data-rawheight="440" src="https://pic4.zhimg.com/50/v2-0510889deee92f6290b5a43b6058346d_hd.jpg" data-size="normal" data-rawwidth="1664" class="origin_image zh-lightbox-thumb" width="1664" data-original="https://pic4.zhimg.com/v2-0510889deee92f6290b5a43b6058346d_r.jpg">

然仅仅(在一个卷积分支网络下)使用 dilated convolution 去抓取多尺度物体是一个不正统的方法。比方说,我们用一个 HDC 的方法来获取一个大(近)车辆的信息,然而对于一个小(远)车辆的信息都不再受用。假设我们再去用小 dilated convolution 的方法重新获取小车辆的信息,则这么做非常的冗余。

基于港中文和商汤组的 PSPNet 里的 Pooling module (其网络同样获得当年的SOTA结果),ASPP 则在网络 decoder 上对于不同尺度上用不同大小的 dilation rate 来抓去多尺度信息,每个尺度则为一个独立的分支,在网络最后把他合并起来再接一个卷积层输出预测 label。这样的设计则有效避免了在 encoder 上冗余的信息的获取,直接关注与物体之间之内的相关性。

总结

Dilated Convolution 个人认为想法简单,直接且优雅,并取得了相当不错的效果提升。他起源于语义分割,大部分文章也用于语义分割,具体能否对其他应用有价值姑且还不知道,但确实是一个不错的探究方向。有另外的答主提到WaveNet, ByteNet 也用到了 dilated convolution 确实是一个很有趣的发现,因为本身 sequence-to-sequence learning 也是一个需要关注多尺度关系的问题。则在 sequence-to-sequence learning 如何实现,如何设计,跟分割或其他应用的关联是我们可以重新需要考虑的问题。

作者:刘诗昆

链接:https://www.zhihu.com/question/54149221/answer/323880412


http://chatgpt.dhexx.cn/article/vGxP7GmG.shtml

相关文章

卷积膨胀 Dilation

参考&#xff1a;卷积的dilation操作 如果我们设置的dilation0的话&#xff0c;效果如图: 蓝色为输入&#xff0c;绿色为输出&#xff0c;可见卷积核为3*3的卷积核 如果我们设置的是dilation1&#xff0c;那么效果如图: 蓝色为输入&#xff0c;绿色为输出&#xff0c;卷积核仍…

卷积核膨胀(dilation)解析

本文转自http://blog.csdn.net/tangwei2014和https://blog.csdn.net/jiongnima/article/details/69487519&#xff0c;转载目的便于自己查看学习 第一位大神解析&#xff1a; deeplab发表在ICLR 2015上。论文下载地址&#xff1a;Semantic Image Segmentation with Deep Conv…

【DL】卷积膨胀 Dilation

Backto DeepLearning Index dilation dilation 是对 kernel 进行膨胀,多出来的空隙用 0 padding。用于克服 stride 中造成的 失真问题。 对应关系是 k d = ( k − 1 ) d + 1 k_{d} = (k -1)\times d + 1 kd​

Pytorch中dilation(Conv2d)参数详解

目录 一、Conv2d 二、Conv2d中的dilation参数 一、Conv2d 首先我们看一下Pytorch中的Conv2d的对应函数&#xff08;Tensor通道排列顺序是&#xff1a;[batch, channel, height, width]&#xff09;&#xff1a; torch.nn.Conv2d(in_channels, out_channels, kernel_size, str…

Linux的入门

文章目录 1 Linux应用场景2 Linux的应用领域2.1 个人桌面的应用2.2 服务器领域2.3 嵌入式领域 3 Linux 介绍4 Linux 和 Unix 的关系4.1 Linux 的由来&#xff1a;4.2 Linux 与 Unix 的关系 5 安装 vm 和CentOS5.1 基本说明5.2 网络连接的理解 6 虚拟机克隆7 虚拟机快照8 虚拟机…

Linux 快速入门到实战【一】

一、操作系统概述 1. 计算机原理 ​ 现代计算机大部分都是基于冯.诺依曼结构&#xff0c;该结构的核心思想是将程序和数据都存放在计算机中&#xff0c;按存储器的存储程序首地址执行程序的第一条指令&#xff0c;然后进行数据的处理计算。 ​ 计算机应包括运算器、控制器、…

linux快速入门 --- 常用指令 学习

目录 为什么要学Linux&#xff1f; Linux的安装 安装 使用finalshell连接虚拟机 了解一下Linux的目录结构&#xff08;不需要记忆&#xff09; Linux中常用的命令&#xff08;重点&#xff09; Linux命令初体验--几个常用命令 Linux命令格式 显示指定目录下的内容 ls和…

Linux命令快速入门

Linux命令初体验----01几个常用命令 序号命令对应英文作用1lslist查看当前目录下的内容2pwdprint work directory查看当前所在目录3cd[目录名]change directory切换目录4touch[文件名]touch如果文件不存在&#xff0c;新建文件5mkdir[目录名]make directory创建目录6rm[文件名…

如何快速入门并轻松简单的学习Linux?

首先&#xff0c;写这篇文章的初衷是写给那些想学习linux&#xff0c;并真正想用它做些有意义事情的人。希望能帮助初学者找到正确的学习linux思维或者方向。 1、做好思想准备 如果你想系统的学习linux&#xff0c;你必须做好思想准备。如果你真正想系统的学习linux&#xff0c…

linux基础-快速入门

主要内容介绍 1、LINUX操作系统安装及初始化配置&#xff08;熟悉&#xff09;&#xff1b; 2、LINUX操作系统目录组成结构及文件级增删改查操作&#xff08;重点&#xff09;&#xff1b; 3、LINUX操作系统用户、权限管理&#xff08;重点&#xff09;&#xff1b; 4、开源软…

Linux快速入门打开你的学习之道

附Java/C/C/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全&#xff1a; 书单导航页&#xff08;点击右侧 极客侠栈 即可打开个人博客&#xff09;&#xff1a;极客侠栈 ①【Java】学习之路吐血整理技术书从入门到进阶最全50本&#xff08;珍藏版) ②【算法…

快速入门:LINUX基础 ——教你使用 linux 操作

文章目录 一、LINUX介绍二、环境搭建三、如何在LINUX下做开发1.LINUX 中—vi的使用 四、LINUX常用初级指令介绍和使用五、Linux虚拟机和windows间的文件传输方式LINUX和WINDOWS文件共享 六、VMware虚拟接网络连接的三种方式LINUX虚拟机网络配置&#xff1a; 七、Linux线程概念引…

Linux 入门

Linux 入门 一、Linux简介 1.Linux介绍 Linux 是一种自由和开放源码的类 UNIX 操作系统。 Linux 英文解释为 Linux is not Unix。 Linux 是在 1991 由林纳斯托瓦兹在赫尔辛基大学上学时创立的&#xff0c;主要受到 Minix 和 Unix 思想的启发。 Linux 内核最初只是由芬兰人…

【Linux快速入门】文件目录操作

文章目录 概念1. Linux文件系统概述2. Linux文件目录结构3. Linux文件和目录操作3.1 文件操作3.1.1 创建文件3.1.2 复制文件3.1.3 移动文件3.1.4 删除文件3.1.5 查看文件3.1.6 输出指令3.1.7 >和>>指令 3.2 目录操作3.2.1 创建目录3.2.2 复制目录3.2.3 移动目录3.2.4 …

liunx快速入门

文章目录 第一章、Liunx基础知识1.1 Liunx和Windows和区别1、操作和配置:2、Liunx命令提示符&#xff1a;3、Liunx命令格式&#xff1a;4、Liunx和Windows的用户和密码&#xff1a;5、Liunx中用户和组&#xff1a;6、Liunx和Windows浏览文件&#xff1a;7、Liunx和Windows软件的…

入门必备 | 零基础如何快速入门Linux?

-------首先我们还是来普及以下概念&#xff0c;讲点虚的。现在是图形系统的天下&#xff0c;windows我们用了20年。成功归功与它图形界面&#xff0c;你会点鼠标吗你会敲键盘吗?所以你会上网会聊天会玩游戏了。 第一步 选个linux系统 -------现在发行的Linux系统很多redhat&a…

[Linux](2)快速入门Linux基础指令

文章目录 ls 指令(list files)pwd 指令(print work directory)cd 指令(change directory)定位文件(路径)cd 指令的使用 touch 指令mkdir 指令(make directory)rmdir 指令、rm 指令(remove)man 指令cp 指令(copy file)mv 指令(move file)cat 指令(concatenate)more 指令、less 指…

快速入门linux基本操作大全

Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和Unix的多用户、多任务、 支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和 64位硬件。Linux继承了Unix以网络为核心的设计思想&#xff0c;是一个性能…

【Linux】快速入门法宝~你值得拥有

查阅命令帮助信息 man man是manual的缩写&#xff0c;是Linux提供的一个手册&#xff0c;包含了绝大部分的命令、函数的详细使用 man的操作建 操作键功能说明空格键显示手册的下一屏内容回车键一次滚动手册页的一行b回滚一屏f前滚一屏q退出/内容搜索/后面的内容↑、↓向上或向…

Linux 系统如何快速入门?分享民工哥总结的经验

我应该如何入门Linux系统运维&#xff1f;Linux系统运维到底需要学哪些技术&#xff1f;怎么学&#xff1f;系统、服务报错了&#xff0c;如何处理&#xff1f;为什么监控系统不报警&#xff0c;或报警没有通知…&#xff1f;数据库丢数据了&#xff0c;如何恢复&#xff1f;如…