一文看懂膨胀(空洞)卷积(含代码)

这篇具有很好参考价值的文章主要介绍了一文看懂膨胀(空洞)卷积(含代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:本文的个别内容、图片出自各个博客,但是因时间较久目前找不到原作者链接,如有需要,烦请各位原作者联系我。

目录

一、什么是膨胀卷积?为什么要用膨胀卷积

二、膨胀卷积的特点(优点)

三、膨胀卷积特点的理解

1、先看特点②:可以保证输出的特征映射(feature map)的大小保持不变

2、膨胀卷积特点1:增大了卷积核的感受野

 四、膨胀卷积的问题

4.1 gridding effect

4.2长距离的信息有时是不相关的

五、多层膨胀卷积设计规则HDC(解决四中的问题)

 5.1理解第一条规则

 5.2理解第二条规则

 5.3理解第三条规则

5.4满足HDC原则的膨胀率设定及应用中的图片分割效果

附录1:膨胀卷积代码

附录2:HDC绘制膨胀卷积代码


一、什么是膨胀卷积?为什么要用膨胀卷积

胀卷积(最早由MULTI-SCALE CONTEXT AGGREGATION BY DILATED CONVOLUTIONS(基于膨胀卷积的多尺度上下文融合.2015)

最初的提出是为了解决图像分割的问题而提出的,常见的图像分割算法通常使用池化层和卷积层来增加感受野(Receptive Filed),同时也缩小了特征图尺寸(resolution),然后再利用上采样还原图像尺寸,特征图缩小再放大的过程造成了精度上的损失,因此需要一种操作可以在增加感受野的同时保持特征图的尺寸不变,从而代替下采样和上采样操作。

二、膨胀卷积的特点(优点)

保持参数个数不变的情况下增大了卷积核的感受野,让每个卷积输出都包含较大范围的信息;

同时它可以保证输出的特征映射(feature map)的大小保持不变。

三、膨胀卷积特点的理解

1、先看特点②:可以保证输出的特征映射(feature map)的大小保持不变

对于一维信号来说:

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

 拿一维信号来看,黑色代表padding

(a)是普通的卷积,步长2,卷积核3

(b)是普通卷积,步长1,卷积核3,可以看到输入特征为7个,经过线性加权求和之后,输出的特征为7个

(c)是膨胀卷积,步长1,卷积核3,膨胀率2,可以看到输入特征为7个,经过线性加权求和之后,输出的特征为7个

可以看出经过膨胀卷积输出的特征映射(feature map)的大小和普通卷积一致,保持不变,有无空洞卷积,并不影响输出特征图的尺寸,也就是说输出特征图的尺寸和空洞数无关

对于二维信号来说:

影响输出特征图尺寸的因素有输入特征图的尺寸 (H,W) ,卷积核的大小 (FH,FW) ,填充 P ,步长 S

设输出特征图尺寸(OH,OW

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

 有无空洞卷积,并不影响输出特征图的尺寸,也就是说输出特征图的尺寸和空洞数无关

2、膨胀卷积特点1:增大了卷积核的感受野

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

普通卷积3×3

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

 膨胀卷积3×3

从上面两个图可以看出,卷积核不变,但是其感受野明显变化

2.1膨胀处理后的等效卷积核

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

kernel size=3, stride=1 dilation rate 分别为 1, 2

设膨胀卷积的卷积核大小 kernel size =  k ,膨胀率/空洞数 dilated rate =  d  ,其 等效 kernel size = k’ 

k’ = k + (k - 1) * (d - 1)        ------------------------------(计算公式)

K’ = 3 + (3 - 1) * (2 - 1) = 5-------------------------------(图b的计算)

这里需要说明一下,经过膨胀处理后其卷积核数量不会变化,即原始为3×3,膨胀后还是3×3。为什么有一个等效,就是虽然膨胀后还是3×3,但是因其膨胀了,在计算感受野时其感受野是等效于一个5×5的卷积核。为了便于之后计算感受野,所以这里提出了等效卷积核。

2.2感受野计算

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

             kernel size=3, stride=1 dilation rate 分别为 1, 2, 4 的三个不同的膨胀卷积

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

 注:RF2对应的是图(a),RF3对应的图(b),RF4对应图(c)

        计算RF2时,那个数字1为默认的原始图片感受野是1

图abc的整个计算过程如下:

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

 四、膨胀卷积的问题

4.1 gridding effect

设定一个多层膨胀卷积如下图所示

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

如下是每一层的过程:(从下往上看(从图4.4往图4.2看))

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

 图4.2 layer4

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

 图4.3 layer3

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

  图4.4 layer2

 #有数字的块(非0块)表示在经过膨胀卷积后使用到了这个像素块

#块里面的数字表示经过一系列的膨胀卷积之后该块的累计使用次数。(很好计算的,自己画一下就能知道)

经过三次膨胀卷积后得到了图4.2的右边,可以看出来,当多层膨胀卷积的膨胀率相同时(本例子均为2),在感受野内出现使用次数为0的像素块,即会出现使用的原始数据不连续从而导致信息的丢失。

4.2长距离的信息有时是不相关的

膨胀卷积扩大了感受野,因此可以取得长距离信息(在图像中这是有利于大目标分析的),但是有些长距离信息和当前点是完全不相关的,会影响数据的一致性(对于小目标不太友好)。

五、多层膨胀卷积设计规则HDC(解决四中的问题)

参考文章:Understanding Convolution for Semantic Segmentation

1.第二层的两个非零元素之间的最大距离小于等于该层卷积核的大小

2.将膨胀系数设置为锯齿形状。[1,2,3,1,2,3,1,2,3]

3.膨胀系数的公约数不能大于1[2,4,8]不合理

 HDC目标:经过一系列膨胀卷积后完全覆盖底层特征图,并且该区域没有任何孔洞或者缺失边缘

 5.1理解第一条规则

第二层的两个非零元素之间的最大距离小于等于该层卷积核的大小

 膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

这个Mi怎么来的,在(63条消息) 语义分割--Understand Convolution for Semantic Segmentation_DFann的博客-CSDN博客

这一篇博客中,作者询问了Understanding Convolution for Semantic Segmentation文章的一作

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

 对第一条规则举例①:

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

 Mi是第i层两个非0元素之间的最大距离,ri是第i层的膨胀率

前面已经说明,对于最后一层,Mi = r i,所以计算时,M3 = r3 = 5 ,r2 = 2,得出1,其他同

M2 = 2,满足第二层的两个非零元素之间的最大距离小于等于该层卷积核的大小

 对第一条规则举例②:

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

 膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

 (卷积核均为3×3,左边膨胀率[1,2,5],右边膨胀率[1,2,9],跑出这个图的代码见附录

通过规则1,还可以得出膨胀率必须从1开始的结论。

我们希望在高层特征图的每个像素可以利用到底层特征图的感受野内的所有像素,那么M应该等于1。M=1意味着非零元素之间是相邻的(没有间隙的),M等于1,所以r“被迫”为1

 5.2理解第二条规则

将膨胀系数设置为锯齿形状(1,2,3,1,2,3)

在我们的网络中,膨胀率的分配遵循锯齿波状启发式:许多层被分组在一起,形成具有不断增加膨胀率的波的“上升边缘”,下一组重复相同的模式。例如,对于所有膨胀率r = 2的层,我们将3层作为一个组,并将它们的膨胀率分别改变为1、2和3。通过这样做,顶层可以从更广泛的像素范围内访问信息,它们位于与原始配置相同的区域内。这个过程在所有的层中都重复进行,从而使顶层的感受野保持不变。           

                         ---------Understanding Convolution for Semantic Segmentation原文翻译

 5.3理解第三条规则

膨胀系数的公约数不能大于1

如果公约数大于1,仍然会出现gridding effect问题

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

上图是膨胀率为[2,4,8],出现了gridding effect (代码见附录)

综上:多层膨胀卷积膨胀率的设计规范为

1.第二层的两个非零元素之间的最大距离小于等于该层卷积核的大小

2.将膨胀系数设置为锯齿形状。[1,2,3,1,2,3,1,2,3]

3.膨胀系数的公约数不能大于1[2,4,8]不合理

5.4满足HDC原则的膨胀率设定及应用中的图片分割效果

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

(不满足HDC设计的膨胀率) 

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

(满足HDC设计的膨胀率)

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

(普通标准多层卷积) 

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络( 满足和不满足HDC原则的图片分割效果)

附录1:膨胀卷积代码

一维膨胀卷积:

#一维膨胀卷积
conv1 = torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

二维膨胀卷积:

#二维膨胀卷积
conv2 = nn.Conv2d(in_planes, out_planes, kernel_size=kernel_size, stride=stride, padding=padding, dilation=dilation, groups=groups, bias=bias)

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

当dilation = 1为一般卷积,dilation > 1为膨胀卷积

注意:膨胀卷积时的padding和膨胀率dilation取值有关系

一维时:

N是一个批处理大小,C表示多个通道, L 是信号序列的长度,若想输入和输出尺寸不变,则可以通过下式反解出padding

膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

 二维时:

  • o = output=32
  • i = input =32
  • p = padding=?  #未知量,需求
  • k = kernel_size=3
  • s = stride=1
  • d = dilation=2
  • 膨胀卷积,深度学习知识,python,计算机视觉,深度学习,人工智能,神经网络

 由上面的特征图计算公式,如果想保证输入和输出尺寸一致,利用上面公式反解出p

代入已知量得到方程式:

32=(32+2xpadding-2x(3-1)-1)/1+1

解方程得到:

padding=2文章来源地址https://www.toymoban.com/news/detail-782387.html

附录2:HDC绘制膨胀卷积代码

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap

def dilated_conv_one_pixel(center: (int, int),
                           feature_map: np.ndarray,
                           k: int = 3,
                           r: int = 1,
                           v: int = 1):
    """
    膨胀卷积核中心在指定坐标center处时,统计哪些像素被利用到,
    并在利用到的像素位置处加上增量v
    Args:
        center: 膨胀卷积核中心的坐标
        feature_map: 记录每个像素使用次数的特征图
        k: 膨胀卷积核的kernel大小
        r: 膨胀卷积的dilation rate
        v: 使用次数增量
    """
    assert divmod(3, 2)[1] == 1

    left_top = (center[0] - ((k - 1) // 2) * r, center[1] - ((k - 1) // 2) * r)
    for i in range(k):
        for j in range(k):
            feature_map[left_top[1] + i * r][left_top[0] + j * r] += v

def dilated_conv_all_map(dilated_map: np.ndarray,
                         k: int = 3,
                         r: int = 1):
    """
    根据输出特征矩阵中哪些像素被使用以及使用次数,
    配合膨胀卷积k和r计算输入特征矩阵哪些像素被使用以及使用次数
    Args:
        dilated_map: 记录输出特征矩阵中每个像素被使用次数的特征图
        k: 膨胀卷积核的kernel大小
        r: 膨胀卷积的dilation rate
    """
    new_map = np.zeros_like(dilated_map)
    for i in range(dilated_map.shape[0]):
        for j in range(dilated_map.shape[1]):
            if dilated_map[i][j] > 0:
                dilated_conv_one_pixel((j, i), new_map, k=k, r=r, v=dilated_map[i][j])

    return new_map

def plot_map(matrix: np.ndarray):
    plt.figure()

    c_list = ['white', 'blue', 'red']
    new_cmp = LinearSegmentedColormap.from_list('chaos', c_list)
    plt.imshow(matrix, cmap=new_cmp)

    ax = plt.gca()
    ax.set_xticks(np.arange(-0.5, matrix.shape[1], 1), minor=True)
    ax.set_yticks(np.arange(-0.5, matrix.shape[0], 1), minor=True)

    plt.colorbar()

    thresh = 5
    for x in range(matrix.shape[1]):
        for y in range(matrix.shape[0]):

            info = int(matrix[y, x])
            ax.text(x, y, info,
                    verticalalignment='center',
                    horizontalalignment='center',
                    color="white" if info > thresh else "black")
    ax.grid(which='minor', color='black', linestyle='-', linewidth=1.5)
    plt.show()
    plt.close()

def main():

    dilated_rates = [2,4,8]

    size = 30
    m = np.zeros(shape=(size, size), dtype=np.int32)
    center = size // 2
    m[center][center] = 1

    for index, dilated_r in enumerate(dilated_rates[::-1]):
        new_map = dilated_conv_all_map(m, r=dilated_r)
        m = new_map
    print(m)
    plot_map(m)

if __name__ == '__main__':
    main()

到了这里,关于一文看懂膨胀(空洞)卷积(含代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【基础知识】一文看懂深度优先算法和广度优先算法

    先上个图 现在我们要访问图中的每个节点,即图的遍历。 图的遍历是指,从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历。 我们根据访问节点的顺序与方式(根据搜索方

    2024年02月09日
    浏览(38)
  • 深度学习之 11 空洞卷积的实现

    本文是接着上一篇深度学习之 11 卷积神经网络实现_水w的博客-CSDN博客 目录 空洞卷积 1 优点与适用性 2 存在的问题  ◼  空洞卷积存在网格效应  ◼  远距离的点之间的信息可能不相关  ◼  解决方法   ◼  满足HDC条件的空洞卷积叠加演示:dilation rate [1, 2, 5] with 3 x

    2024年02月11日
    浏览(37)
  • YOLOv8 深度解析!一文看懂,快速上手实操(附实践代码)

    关注并星标 从此不迷路 计算机视觉研究院 公众号ID |ComputerVisionGzq 学习群 |扫码在主页获取加入方式 开源地址:https://github.com/ultralytics/ultralytics 计算机视觉研究院专栏 作者:Edison_G YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本,目前支持图

    2024年02月09日
    浏览(48)
  • 【LlamaIndex 教程】一文看懂LlamaIndex用法,为LLMs学习私有知识

    我是卷了又没卷,薛定谔的卷的AI算法工程师「 陈城南 」(全网平台同名)~ 担任某大厂的算法工程师,带来最新的前沿AI知识,分享 AI 有趣工具和实用玩法 ,包括 ChatGPT、AI绘图等,欢迎 大家交流 ~ 交流「cchengnan113」备注「AI交流」可进裙 知乎「陈城南」 :https://www.zhihu

    2024年02月06日
    浏览(46)
  • 大数据深度学习卷积神经网络CNN:CNN结构、训练与优化一文全解

    本文全面探讨了卷积神经网络CNN,深入分析了背景和重要性、定义与层次介绍、训练与优化,详细分析了其卷积层、激活函数、池化层、归一化层,最后列出其训练与优化的多项关键技术:训练集准备与增强、损失函数、优化器、学习率调整、正则化技巧与模型评估调优。

    2024年02月01日
    浏览(44)
  • 一文看懂卷积运算(convolution)与互相关运算(cross-correlation)的区别

    目录 互相关运算定义 互相关运算图示 互相关运算完整计算示例 卷积数学定义 卷积运算图示 卷积与互相关运算区别 深度学习中的卷积为何能用互相关运算代替 在二维互相关运算中,卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑

    2024年02月02日
    浏览(34)
  • 卷积、空洞卷积、反卷积与空洞反卷积的计算公式(全)

    经常使用的卷积有卷积、空洞卷积、反卷积与空洞反卷积的,下面总结了他们的计算公式。 卷积神将网络的计算公式为: N=(W-F+2P)/S+1 其中 N:输出大小 W:输入大小 F:卷积核大小 P:填充值的大小 S:步长大小 d = dilation 1、感受野计算。假定原来的卷积核大小为 k,那么塞入

    2024年02月16日
    浏览(38)
  • YOLOv8 深度详解!一文看懂,快速上手

    YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本,目前支持图像分类、物体检测和实例分割任务,在还没有开源时就收到了用户的广泛关注。 考虑到 YOLOv8 的优异性能,MMYOLO 也在第一时间组织了复现,由于时间仓促,目前 MMYOLO 的 Dev 分支已经支持

    2024年02月03日
    浏览(59)
  • 一文看懂开源许可证丨开源知识科普

    编者按: 在很多人眼中, 「开源」是一个时髦且有情怀的词汇, 始终伴随有理想主义色彩, 因此不少公司开始给自己贴上\\\"开源\\\"标签。但一个优秀的开源项目远远不止是简单的公开源代码, 而是需要将其当作公司战略进行贯彻, 才能架设起牢不可破的信任桥梁。 PingCAP 从第一行代

    2023年04月08日
    浏览(64)
  • 动手学深度学习—卷积神经网络(原理解释+代码详解)

    多层感知机对图像处理是百万维度,模型不可实现。 如果要在图片中找到某个物体,寻找方法应该和物体位置无关。 适合 计算机视觉 的神经网络架构: 平移不变性 :不管检测对象出现在图像中的哪个位置,神经网络前几层应该对相同图像区域有相似的反应。 局部性 :神

    2024年02月14日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包