扩张卷积,也被称为Atrous卷积或带孔的卷积,首次由论文 "Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs "曝光。扩张卷积背后的想法是 "膨胀 "内核,进而跳过一些点。我们可以从一般的公式和一些可视化中看到区别。
内容表。
- 扩张卷积的介绍
- Tensorflow中的扩张卷积
- 扩张卷积的作用
- 扩张卷积。背景模块的结果
- 扩张卷积的复杂度分析
- 扩张卷积的用处
我们现在将深入研究扩张卷积。
扩张卷积的介绍
下面的卷积代表了标准的离散卷积。
我们看到,内核查找了输入的所有点。离散卷积的数学公式是。
这代表稀释卷积。
你可以清楚地看到,内核跳过了我们输入中的一些点。扩张卷积的数学公式是:。
我们可以看到,求和与离散卷积不同。总和s+lt=p中的l告诉我们,我们将在卷积过程中跳过一些点。当l=1时,我们最终会得到正常的离散卷积。当l>1时,卷积是一个扩张的卷积。参数l被称为扩张率,它告诉我们要扩大内核的程度。当我们增加l的值时,内核元素之间有l-1的间隙。下面的图片向我们展示了三种不同的扩张卷积,其中l的值分别为1、2和3。
红点代表我们在卷积后得到的图像是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_batch和batch_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。
- 使用了考虑输入和输出的通道数的权重初始化,而不是标准的随机初始化。
我们可以看到,扩张的卷积在测试集上的表现比之前的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)。
扩张卷积的用处
以下是使用扩张卷积的优势。
- 由于扩张卷积在接收场的背景下支持指数扩展,所以不会有分辨率的损失。
- 扩张卷积使用 "l "作为扩张率的参数。当我们增加'l'的值时,它允许我们有一个更大的感受野,这真的很有帮助,因为我们能够查看更多的数据点,从而节省计算和内存成本。
虽然扩张卷积提供了一种廉价的方法来增加感受野,并有助于节省计算成本,但这种方法的主要缺点
是需要学习大量的额外参数。
通过OpenGenus的这篇文章,你一定对扩张卷积有了完整的了解。请欣赏。
阅读这些研究论文。
- Liang-Chieh Chen, George Papandreou, Iasonas Kokkinos, Kevin Murphy和Alan L. Yuille的《利用深度卷积网和全连接CRF进行语义图像分割》。
- Fisher Yu和Vladlen Koltun的 "扩张卷积的多尺度语境聚合"。