扩张卷积(Dilated Convolution)——详细介绍

472 阅读6分钟

扩张卷积,也被称为Atrous卷积带孔的卷积,首次由论文 "Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs "曝光。扩张卷积背后的想法是 "膨胀 "内核,进而跳过一些点。我们可以从一般的公式和一些可视化中看到区别。

内容表

  1. 扩张卷积的介绍
  2. Tensorflow中的扩张卷积
  3. 扩张卷积的作用
  4. 扩张卷积。背景模块的结果
  5. 扩张卷积的复杂度分析
  6. 扩张卷积的用处

我们现在将深入研究扩张卷积。

扩张卷积的介绍

下面的卷积代表了标准的离散卷积。

discrete-convolution

我们看到,内核查找了输入的所有点。离散卷积的数学公式是。

dis

这代表稀释卷积。

dilated-convolution

你可以清楚地看到,内核跳过了我们输入中的一些点。扩张卷积的数学公式是:。

dil

我们可以看到,求和与离散卷积不同。总和s+lt=p中的l告诉我们,我们将在卷积过程中跳过一些点。当l=1时,我们最终会得到正常的离散卷积。当l>1时,卷积是一个扩张的卷积。参数l被称为扩张率,它告诉我们要扩大内核的程度。当我们增加l的值时,内核元素之间有l-1的间隙。下面的图片向我们展示了三种不同的扩张卷积,其中l的值分别为1、2和3。

N-dilated-convolution

红点代表我们在卷积后得到的图像是3×3像素的。我们看到,所有三个扩张卷积的输出都有相同的尺寸,但模型所观察到的感受野却完全不同。感受区只是告诉我们红点能 "看穿 "多远。当l=1时,它是3×3,当l=2时是5×5,而当l=3时是7×7。感受野的增加意味着我们能够观察到更多的东西,而不需要任何额外的费用!

Tensorflow中的扩张卷积

Tensorflow有一个内置的函数用于扩张卷积(或反转卷积)。扩张卷积函数的语法是。

tf.nn.atrous_conv2d(
    value, filters, rate, padding, name=None
)

这将计算一个2-D的阿特拉斯卷积,有一个给定的4-D过滤张量。

速率参数定义了扩张率(l)。如果速率参数等于1,它将执行常规的2-D卷积。如果速率参数大于1,它就执行非线性卷积,在高度宽度维度上每隔速率像素对输入值进行采样。

如果我们用一组上采样的滤波器对输入值进行卷积,通过在高度宽度维度上的两个连续的滤波器值之间插入速率-1的零来产生,那么扩张卷积是类似的。

当它们相互堆叠在一起时,卷积的效率最高。一系列具有相同速率参数、"SAME "填充和奇数高度/宽度的滤波器的atrous_conv2d操作。

    net = atrous_conv2d(net, filters1, rate, padding="SAME")
    net = atrous_conv2d(net, filters2, rate, padding="SAME")
    ...
    net = atrous_conv2d(net, filtersK, rate, padding="SAME")

在计算和内存方面,可以等效地更便宜地执行。

    pad = ...  # padding so that the input dims are multiples of rate
    net = space_to_batch(net, paddings=pad, block_size=rate)
    net = conv2d(net, filters1, strides=[1, 1, 1, 1], padding="SAME")
    net = conv2d(net, filters2, strides=[1, 1, 1, 1], padding="SAME")
    ...
    net = conv2d(net, filtersK, strides=[1, 1, 1, 1], padding="SAME")
    net = batch_to_space(net, crops=pad, block_size=rate)

因为每一对连续的space_to_batchbatch_to_space有相同的block_size。因此,只要它们各自的填充物作物输入是相同的,它们就会相互抵消。

扩张卷积的作用

在论文 "Multi-scale context aggregation by dilated convolutions "中,作者建立了一个由多层扩张卷积组成的网络。他们在每一层都以指数形式增加扩张率l。结果,虽然参数的数量只随层数线性增长,但有效感受野却随层数呈指数级增长!

在本文中,我们制作了一个由7个层组成的上下文模块,这些层应用3 x 3的卷积,扩张率的值不同。

扩张率为1、1、2、4、8、16和1。最后的卷积是1×1的卷积,以确保通道的数量与输入的相同。这意味着输入和输出有相等数量的通道。

在表格的底部,我们可以看到两种不同类型的输出通道。基本和高级。基本语境模块在整个模块中只有一个通道(1C),而高级语境模块的通道数量从第一层的1C增加到倒数第二层(第七层)的32C。

扩张卷积。情境模块的结果

该模型在PASCAL VOC 2012数据集上进行了测试。VGG-16被作为前端模块使用。以下是该模型的设置。

  • VGG-16的最后两个池化层和步进层被完全删除,并插入了上下文模块(上文已讨论)。
  • 中间特征图的填充也被移除。
  • 对输入特征图的填充宽度为33。
  • 使用了考虑输入和输出的通道数的权重初始化,而不是标准的随机初始化。

aaa

我们可以看到,扩张的卷积在测试集上的表现比之前的FCN-8s和DeepLabV1要好大约5%。此外,还观察到平均IoU(交集大于联盟)为67.6%。

扩张卷积的复杂性分析

对于任何扩张的卷积。

  • 一个点积的时间复杂度为O(d),即简单的d次乘法和d-1次加法。
  • 由于我们执行了k个点积,这相当于O(k.d)
  • 接下来,在层级上,我们在输入上应用我们的内核n - k + 1次。如果n>>k,这相当于O(n.k.d)
  • 最后,如果我们假设有d个内核,我们的扩张卷积的最终时间复杂性将是O(n.k.d^2)。

扩张卷积的用处

以下是使用扩张卷积的优势。

  1. 由于扩张卷积在接收场的背景下支持指数扩展,所以不会有分辨率的损失。
  2. 扩张卷积使用 "l "作为扩张率的参数。当我们增加'l'的值时,它允许我们有一个更大的感受野,这真的很有帮助,因为我们能够查看更多的数据点,从而节省计算和内存成本。

虽然扩张卷积提供了一种廉价的方法来增加感受野,并有助于节省计算成本,但这种方法的主要缺点
是需要学习大量的额外参数。

通过OpenGenus的这篇文章,你一定对扩张卷积有了完整的了解。请欣赏。

阅读这些研究论文。