当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python tf.nn.atrous_conv2d用法及代码示例


Atrous 卷积(也称为空洞卷积或扩张卷积)。

用法

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

参数

  • value float 类型的 4-D Tensor 。它需要采用默认的"NHWC" 格式。它的形状是 [batch, in_height, in_width, in_channels]
  • filters 4-D Tensorvalue 具有相同类型和形状 [filter_height, filter_width, in_channels, out_channels]filters ' in_channels 尺寸必须与 value 的尺寸匹配。 Atrous 卷积等效于具有有效高度 filter_height + (filter_height - 1) * (rate - 1) 和有效宽度 filter_width + (filter_width - 1) * (rate - 1) 的上采样滤波器的标准卷积,通过沿 filters 空间维度上的连续元素插入 rate - 1 零来产生。
  • rate 一个正的 int32。我们在 heightwidth 维度上对输入值进行采样的步幅。等效地,我们通过在heightwidth 维度上插入零来对过滤器值进行上采样的速率。在文献中,有时将相同的参数称为 input stridedilation
  • padding 一个字符串,或者'VALID'或者'SAME'.填充算法。看这里了解更多信息。
  • name 返回张量的可选名称。

返回

  • A Tensor与相同类型value.输出形状与'VALID'填充是:
    [batch, height - 2 * (filter_width - 1),
     width - 2 * (filter_height - 1), out_channels].

    带有'SAME' 填充的输出形状为:

    [batch, height, width, out_channels].

抛出

  • ValueError 如果输入/输出深度与 filters ' 形状不匹配,或者填充不是 'VALID''SAME'

此函数是更通用的 tf.nn.convolution 的更简单包装,并且仅用于向后兼容。您可以使用 tf.nn.convolution 执行 1-D、2-D 或 3-D 空洞卷积。

给定 4-D valuefilters 张量,计算 2-D atrous 卷积,也称为空洞卷积或扩张卷积。如果 rate 参数等于 1,则执行常规 2-D 卷积。如果 rate 参数大于 1,它将执行空洞卷积,在 heightwidth 维度中每个 rate 像素对输入值进行采样。这相当于将输入与一组上采样滤波器进行卷积,通过在 heightwidth 维度的滤波器的两个连续值之间插入 rate - 1 零,因此名称为空洞卷积或带孔的卷积(法语单词 trous 在英语中的意思是孔)。

进一步来说:

output[batch, height, width, out_channel] =
    sum_{dheight, dwidth, in_channel} (
        filters[dheight, dwidth, in_channel, out_channel] *
        value[batch, height + rate*dheight, width + rate*dwidth, in_channel]
    )

Atrous 卷积允许我们明确控制在全卷积网络中计算特征响应的密集程度。它与双线性插值结合使用,在语义图像分割、光流计算或深度估计等密集预测任务中提供了conv2d_transpose 的替代方案。它还允许我们在不增加参数数量或计算量的情况下有效地扩大过滤器的视野。

有关 atrous 卷积的说明以及如何将其用于密集特征提取,请参阅:(Chen et al., 2015)。 (Yu et al., 2016) 进一步研究了相同的操作。以前以不同方式有效使用空洞卷积的作品包括 (Sermanet et al., 2014) 和 (Giusti et al., 2013)。 Atrous 卷积也与multi-rate 信号处理中的so-called 高贵身份密切相关。

有许多不同的方法可以实现空洞卷积(参见上面的参考文献)。这里的实现减少了

atrous_conv2d(value, filters, rate, padding=padding)

到以下三个操作:

paddings = ...
    net = space_to_batch(value, paddings, block_size=rate)
    net = conv2d(net, filters, strides=[1, 1, 1, 1], padding="VALID")
    crops = ...
    net = batch_to_space(net, crops, block_size=rate)

高级用法。请注意以下优化:具有相同 rate 参数、'SAME' padding 和奇数高度/宽度的过滤器的 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)

因为当它们各自的paddingscrops输入相同时,一对具有相同block_size的连续space_to_batchbatch_to_space操作会抵消。

参考:

Multi-Scale 通过扩张卷积进行上下文聚合:Yu et al., 2016 (pdf) Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs: Chen et al., 2015 (pdf) OverFeat - Integrated Recognition, Localization and Detection using Convolutional Networks : Sermanet et al., 2014 (pdf) Fast Image Scanning with Deep Max-Pooling Convolutional Neural Networks: Giusti et al., 2013 (pdf)

相关用法


注:本文由纯净天空筛选整理自tensorflow.org大神的英文原创作品 tf.nn.atrous_conv2d。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。