Multi-Scale Context Aggregation by Dilated Convolution 对空洞卷积(扩张卷积)、感受野的理解

        dilated convolution是针对图像语义分割问题中下采样会降低图像分辨率、丢失信息而提出的一种卷积思路。

        在基于FCN思想的语义分割问题中,输出图像的size要和输入图像的size一致。但是FCN中由于有若干stride>1的池化层,所以越到较高的网络层,单位像素中包含的原始图像的信息就越多,也就是感受野越大,但这是以通过池化降低分辨率、损失原始图像中的信息作为代价而得来的;由于pooling层的存在,后面层的feature map的size会越来越小,但由于需要计算loss等原因,最后输出图像的size要和输入图像的size保持一致,所以在FCN中的后段网络层中,必须对feature map进行上采样操作,将缩小的feature map再还原到原始尺寸,在这个过程中,不可能将在池化过程中丢失的信息完全还原回来,这样就造成了信息的丢失、语义分割的精度降低。

        若如果不加pooling层,在较小的卷积核尺寸的前提下,感受野会很小;但如果为了增大感受野,在中段的网络层中使用size较大的卷积核计算量又会暴增,内存扛不住!因为中段的channel一般会非常大,比如1024、2018,跟最开始rgb图像的3个channel比起来,增大了几百倍。

Dilated Convolution的提出

       加pooling层,损失信息,降低精度;不加pooling层,感受野变小,模型学习不到全局信息...怎么办?

        ====> 我们先做一个决定:不要pooling层。没有pooling层,后续网络层中,较小size的卷积核的感受野会很小,没有全局视野;

        ====> 既然小size的卷积核感受野小,那就增大卷积核的size;

        ====> 但卷积核size越大,计算量就会随之加大;

        ====> 那可不可以让卷积核增大,使感受野增大,但计算量不变呢?

        ====> 有啊,把原本紧密贴着的卷积核变得"蓬松"一些,但卷积核需要计算的点不变,也就是蓬松出来的位置全填进去0,还按照卷积核原本的计算方式计算就)可以了。

        ====> 这样,由于卷积核的"蓬松",感受野变大了,又由于卷积核中的有效计算点不变,所以计算量不变。除此之外,每层的feature map的size都不变,所以图像信息都保存了下来一举三得,OK!妥了!

       

        文章中的卷积核的dilated和感受野有一个关系,按我自己的理解可以写成下面这个形式(和文章中的原始公式实际上是同样的含义)

F(dilated) = [pow(2, (dilated / 2) +2) - 1] × [pow(2, (dilated / 2) +2) - 1]

其中,dilated表示卷积核中每个计算点自己的"半径", F(dilated)就是卷积核的感受野尺寸。比如上图中(a),dilated=1,F(dilated) = 3×3;图(b)中,dilated=2,F(dilated)=7×7;图(c)中,dilated=4, F(dilated)=15×15。


Dilated Convolution感受野指数级增长

        对于经典卷积核情况,比如用3*3卷积核经过1、2层卷积层,在第3层中得到1个Feature点,那么第3层这个Feature点换算回第1层覆盖了多少个Feature点呢?

                                                           第3层:

 

                                                  第2层:


                                               第1层:


也就是从size上来讲,2层3*3卷积转换相当于1层5*5卷积。但对于dilated=2,3*3卷积核来讲,还按照上面3层计算:

第1层:


第2层:


第3层:


从size上来讲,2层3*3卷空洞卷积转换相当于1层13*13卷积.

### 关于膨胀卷积的学术论文 膨胀卷积Dilated Convolution),也称为扩张卷积空洞卷积,在深度学习领域被广泛应用于图像处理、自然语言处理以及时间序列分析等领域。其核心思想是在不增加参数数量的情况下扩大感受野,从而捕获更大范围的空间上下文信息。 #### 膨胀卷积的核心概念 膨胀卷积通过在滤波器权重之间插入零值来扩展卷积核的感受野[^4]。这种技术最早出现在文献中用于解决语义分割问题,并逐渐推广到其他任务。具体而言,膨胀因子 \(r\) 定义了卷积操作之间的间隔大小。当 \(r=1\) 时,膨胀卷积退化为标准卷积;而更大的 \(r\) 值则允许网络捕捉更广的上下文信息而不显著增加计算成本。 以下是几篇重要的关于膨胀卷积的研究工作: --- #### 重要学术论文推荐 1. **Multi-Scale Context Aggregation by Dilated Convolutions** - 这篇文章首次提出了利用多尺度膨胀卷积聚合不同层次特征的思想[^5]。作者展示了如何通过调整膨胀率有效地提取多层次空间信息,这对于密集预测任务尤为重要。 2. **Wavenet: A Generative Model for Raw Audio** - WaveNet 是一种基于一维膨胀卷积的时间序列生成模型[^6]。该研究证明了膨胀卷积能够高效建模长时间依赖关系,尤其适用于音频合成等场景。 3. **Deeplab Series (V1, V2, V3+, etc.)** - DeepLab 系列文章深入探讨了膨胀卷积在语义分割中的应用[^7]。这些工作中引入了 ASPP(Atrous Spatial Pyramid Pooling)模块,进一步增强了对复杂背景的理解能力。 4. **Densely Connected Dilated Neural Network For Speech Enhancement** - 此论文探索了将稠密连接与膨胀卷积相结合的方法以提升语音增强效果[^8]。研究表明这种方法可以在保持较低延迟的同时提高信号质量。 5. **Understanding Convolution for Semantic Segmentation** - 文章从理论角度剖析了传统卷积与膨胀卷积的区别及其适用场景[^9]。对于初学者理解膨胀卷积的工作机制非常有帮助。 --- #### 实现示例:PyTorch 中的膨胀卷积 下面是一个简单的 PyTorch 实现例子,展示如何定义带膨胀系数的二维卷积层: ```python import torch.nn as nn class DilatedConvLayer(nn.Module): def __init__(self, in_channels, out_channels, kernel_size, dilation_rate): super(DilatedConvLayer, self).__init__() self.dilated_conv = nn.Conv2d( in_channels=in_channels, out_channels=out_channels, kernel_size=kernel_size, dilation=dilation_rate, padding=(kernel_size - 1) * dilation_rate // 2 ) def forward(self, x): return self.dilated_conv(x) # 使用实例 layer = DilatedConvLayer(in_channels=3, out_channels=64, kernel_size=3, dilation_rate=2) input_tensor = torch.randn(1, 3, 32, 32) output = layer(input_tensor) print(output.shape) ``` 上述代码片段创建了一个具有指定膨胀率的二维卷积层并测试输入张量经过该层后的输出尺寸变化情况。 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值