Pytorch之经典神经网络语义分割(3.1) —— 空洞卷积 Dilated conv/Atrous Conv (膨胀卷积/扩张卷积)(扩张率dilation rate) pytorch实现

article/2025/11/6 9:26:26

2016年提出的

空洞卷积广泛应用于语义分割与目标检测等任务中

空洞卷积(膨胀卷积/扩张卷积) Dilated/Atrous Convolution

空洞卷积是一种不增加参数量(运算量)同时增加输出单元感受野的一种方法。Atrous 卷积,就是带洞的卷积,卷积核是稀疏的

此外,空洞卷积还可以捕获多尺度上下文信息。通过设置不同的dilation rate,感受野就会不一样,也即获取了多尺度信息。多尺度信息在视觉任务中相当重要。

空洞卷积的概念是从语义分割任务中发展出来的,是为了解决基于FCN思想的语义分割中,输出图像的size要求和输入图像的size一致而需要upsample,但由于FCN中使用pooling操作来增大感受野同时降低分辨率,导致upsample无法还原由于pooling导致的一些细节信息的损失的问题而提出的。为了减小这种损失,自然需要移除pooling层,因此空洞卷积应运而生。

原先的 CNN architecture 是用一个“实心”的 kernal 去扫描 input data,然后使用 pooling 方法直接暴力的删掉其余 75% 的信息量,只留下 25% 的原汁原味,这样的做法在还没有精确到 pixel-wise 的情况时还是可以行的通的,一旦要归类到小至 pixel 等级的尺度时,pooling 对原 data 的破坏力足以让事情搞砸,试想一个原始数据被经过 Convolution 剥离出了其区域特征后,接着下一个环节被大刀阔斧般的砍去内部信息,并且永久无法复原,小物体信息无法重建 (假设有四个pooling layer 则任何小于 2^4 = 16 pixel 的物体信息在理论上将无法重建和分割)。这是在微小的 pixel 世界中无法接受的做法。

如果说 pooling 这种简单删减 data 让单位 output 中 Receptive Field 增大的方法不可行,就需要一个新的在不删减原始数据的情况下,直接让 Receptive Field 提升的办法:Dilated Convolution。简单的说,就是把原本“实心”的 kernal 元素之间按照一定规律插入 0 元素作为空格

空洞卷积向卷积层引入了一个称为 “扩张率(dilation rate)”的新参数,该参数定义了卷积核处理数据时各值的间距。

看下图可以对膨胀率有一个比较直观的理解

假设原始特征为feat0

首先使用扩张率为1的空洞卷积生成feat1,feat1上一点相对feat0感受野为3*3(如图a);

然后使用扩张率为2的空洞卷积处理feat1生成feat2(如图b),使第一次空洞卷积的卷积核大小等于第二次空洞卷积的一个像素点的感受野,图b即feat1上一个点综合了图a即feat0上3*3区域的信息,则生成的feat2感受野为7*7,即整个图b深色区域;

第三次处理同上,第二次空洞卷积的整个卷积核大小等于第三次空洞卷积的一个像素点的感受野,图c即feat2上每个点综合了feat0上7*7的信息(感受野),则采用扩张率为3的空洞卷积,生成的feat3每一个点感受野为15*15。

普通卷积的结果的size是

经过空洞卷积后的结果的size是

r是dilation

例子:7*7的feature map,kernel size = 3, padding = 0,stride = 1, dilation =2
标准卷积后大小F为(7-3+0)/1+1 = 5,Dilated卷积后大小F为[7-(3+2*1)+0]/1+1=3

空洞卷积存在的问题

潜在问题 1:The Gridding Effect

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

我们发现我们的 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)

 总结-空洞卷积(Dilated/Atrous Convolution) - 知乎

代码实现 nn.Conv2d(dialation)

dilation convolution的操作内置在nn.Conv2d里面了

正常的紧密的kernel,dialation=1(默认)

dialation=2的情况,就不是紧凑的了

手动实现

import torch
from torch import nn
import torch.nn.functional as F
import mathdef my_conv(input, kernel, stride=1, padding=0, bias=0, dilation=1):if padding > 0:input = F.pad(input, (padding,padding,padding,padding))batch_size, in_channel, input_h, input_w= input.shapeout_channel, _, kernel_h, kernel_w = kernel.shape#本来紧凑的输入,现在相邻点之间要插入dialation-1个空洞,共插入kernel_h-1次kernel_h = (kernel_h-1)*(dilation-1)+kernel_hkernel_w = (kernel_w-1)*(dilation-1)+kernel_woutput_h = math.floor((input_h - kernel_h) / stride + 1)output_w = math.floor((input_w - kernel_w) / stride + 1)output = torch.zeros(batch_size, out_channel, output_h, output_w)if bias is None:bias = torch.zeros(out_channel)for b in range(batch_size):for c in range(out_channel):for i in range(0, input_h - kernel_h + 1, stride):for j in range(0, input_w - kernel_w + 1, stride):region = input[b,:,i:i+kernel_h:dilation, j:j+kernel_w:dilation]output[b,c,int(i/stride), int(j/stride)] = torch.sum(region*kernel[c]) + bias[c]                return outputbatch_size = 4
in_channel = 4
out_channel = 16
dilation = 2
input = torch.rand(batch_size, in_channel ,5,5)
kernel = torch.rand(out_channel, in_channel, 3,3)
bias = torch.rand(out_channel)my_output = my_conv(input, kernel, padding=1, stride=2, bias=bias, dilation=dilation)
output = F.conv2d(input, kernel, padding=1, stride=2, bias=bias, dilation=dilation)assert torch.allclose(my_output, output)


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

相关文章

pytorch的函数中的dilation参数的作用

如果我们设置的dilation0的话,效果如图: 蓝色为输入,绿色为输出,可见卷积核为3*3的卷积核 如果我们设置的是dilation1,那么效果如图: 蓝色为输入,绿色为输出,卷积核仍为3*3&#x…

Pytorch nn.conv2d 的 参数 dilation =1 究竟是?

在pytorch 的 nn.conv2d 和 nn.ConvTranspose2d都有这个参数 dilation。而且默认参数值是 1。那么,当 dilation1 的时候,对应的究竟是 图1 还是 图2 ?是图2。 图1. 图2. 参考资料 Pytorch Tutorial

nn.Conv2d()中dilation参数的作用

nn.Conv2d()中dilation参数的作用 下面这张图很好的描述了这个参数的作用 优点: 这样每次进行单次计算时覆盖的面积(感受域)增大,最开始时3*3 9 然后是5*5 25最后是7*749,增加了感受域却并未增加计算量&#xff0c…

常规-分组-深度分离-分组深度分离卷积-参数量-计算量-dilation-python实现

不同的卷积操作 本文所用样本一般的卷积(常规的)分组卷积深度分离卷积逐通道卷积(depthwise conv)逐点卷积 (pointwise conv) 分组深度分离卷积上面卷积总结卷积的dilation 本文所用样本 x t o r c h . z …

深度学习中常用的几种卷积(下篇):膨胀卷积、可分离卷积(深度可分离、空间可分离)、分组卷积(附Pytorch测试代码)

卷积分类 一、膨胀卷积1.介绍2.调用方式3.实例4.缺点 二、可分离卷积1.空间可分离卷积1)介绍2)优点及缺点3)实例 2.深度可分离卷积1)介绍2)优点及缺点3)实例 三、分组卷积1.介绍2.调用方式以及nn.Conv2d的g…

tensorlfow 卷积操作解释

解释一下: tf.keras.layers.Conv2D(filters,kernel_size,strides=(1, 1),padding=valid,data_format=None,dilation_rate=(1, 1),groups=1,activation=None,use_bias=True,kernel_initializer=glorot_uniform,bias_initializer=zeros,kernel_regularizer=None,bias_regulariz…

dilation conv 和 deconv

最近工作要用到dilation conv,在此总结一下空洞卷积,并和deconv进行对比。 dilation conv 首先空洞卷积的目的是为了在扩大感受野的同时,不降低图片分辨率和不引入额外参数及计算量(一般在CNN中扩大感受野都需要使用s>1的con…

Halcon 形态学(膨胀(Dilation)、腐蚀(Erosion))

文章目录 1 形态学概念2 膨胀(Dilation) 算子介绍3 腐蚀(Erosion)算子介绍4 膨胀腐蚀 示例15 腐蚀膨胀 示例26 示例原图7 补充:结构元素概念1 形态学概念 图像的形态学处理是对图像的局部像素进行处理,用于从图像中提取有意义的局部图像细节。 通过改变局部区域的像素形态…

Torch 池化操作大全 MaxPool2d MaxUnpool2d AvgPool2d FractionalMaxPool2d LPPool2d AdaptivePool2d dilation详解

torch 池化操作 1 池化操作2 类型2.1 MaxPool2d()2.2 MaxUnPool2d()2.3 AvgPool2d()2.4 FractionalMaxPool2d()2.5LPPool2d()2.6AdaptiveMaxPool2d()2.7 AdaptiveAvgPool2d() 3 总结 自我学习记录,他人转载请注明出处 1 池化操作 作用: 提取图片重点特征…

nn.Conv2d中的dilation

参考链接:https://blog.csdn.net/jokerxsy/article/details/108614661 nn.Conv2d中的dilation dilation 1: dilation2:

nn.Conv1d\nn.Conv2d以及groups\dilation参数的理解

文章目录 nn.Conv1dnn.Conv2dnn.Conv2d中groups参数和dilation参数的理解groupsdilation 参考 nn.Conv1d 代码: nn.Conv1d(in_channels 16, out_channels 16, kernel_size (3,2,2), stride (2,2,1), padding [2,2,2])如果输入为: x torch.randn(10,16,30,32,34)则: 1…

剪胀角 angle of dilation

Abaqus选择库伦摩尔塑性模型的时候,需要选择摩擦角和剪胀角。摩擦角物理意义明确,但何为剪胀角?如何影响结果呢?(这两个问题,暂无统一解,Abaqus默认剪胀角最小是0.1) The angle of d…

3.TransposedConv2d实现 (含dilation)

[C 基于Eigen库实现CRN前向推理] 第三部分:TransposedConv2d实现 (含dilation) 前言:(Eigen库使用记录)第一部分:WavFile.class (实现读取wav/pcm,实现STFT)第二部分:Conv2d实现第三部分:Tran…

对卷积层dilation膨胀的作用的理解,caffe-ssd dilation Hole算法解析

先转一篇大佬的博客论文阅读笔记:图像分割方法deeplab以及Hole算法解析 下面是caffe-ssd的vgg16输出后的变化,减少了一个pooling,stride1,然后下一层采用了 dilation方法,作用按上面博客说是 既想利用已经训练好的模…

理解Dilation convolution

论文:Multi-scale context aggregation with dilated convolutions 简单讨论下dilated conv,中文可以叫做空洞卷积或者扩张卷积。首先介绍一下dilated conv诞生背景[4],再解释dilated conv操作本身,以及应用。 首先是诞生背景&a…

卷积膨胀 Dilation

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

卷积核膨胀(dilation)解析

本文转自http://blog.csdn.net/tangwei2014和https://blog.csdn.net/jiongnima/article/details/69487519,转载目的便于自己查看学习 第一位大神解析: deeplab发表在ICLR 2015上。论文下载地址: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的对应函数(Tensor通道排列顺序是:[batch, channel, height, width]): 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 的由来:4.2 Linux 与 Unix 的关系 5 安装 vm 和CentOS5.1 基本说明5.2 网络连接的理解 6 虚拟机克隆7 虚拟机快照8 虚拟机…