阅读(9.3k) 书签 (0)

TensorFlow函数:tf.nn.atrous_conv2d

2019-01-31 11:28 更新

tf.nn.atrous_conv2d函数

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

定义在:tensorflow/python/ops/nn_ops.py.

请参阅指南:神经网络>卷积运算

Atrous卷积.

此函数是更通用的tf.nn.convolution的更简单的包装器,仅用于向后兼容.您可以使用tf.nn.convolution来执行1-D,2-D或3-D动态卷积.

在给定4-D value和filters张量的情况下,计算二维动态卷积,也称为带孔的卷积或扩大的卷积.如果rate参数等于1,则执行常规的2-D卷积.如果rate参数大于1,则执行带孔的卷积,对height和width维度中的每个rate像素采样输入值.这相当于用一组上采样滤波器将输入卷积,这些滤波器是通过沿着height和width维度在滤波器的两个连续值之间插入rate - 1零来产生的,因此名称是atrous卷积或带孔的卷积.

进一步来说:

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卷积及其如何用于密集特征提取的描述,请参阅:使用深度卷积网络和完全连接的CRF进行语义图像分割.通过扩张卷积的多尺度上下文聚合中进一步研究相同的操作.以前以不同方式有效使用atrous卷积,包含:OverFeat:使用卷积网络进行集成识别,定位和检测以及使用深度最大池汇聚神经网络的快速图像扫描.

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

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)

因为当它们各自的paddings和crops输入相同时,一对具有相同block_size的连续的space_to_batch和batch_to_space操作会抵消.

参数:

  • value:类型为float的4-D Tensor,它需要采用默认的“NHWC”格式,它的形状是[batch, in_height, in_width, in_channels].
  • filters:4-D Tensor与value具有相同类型并且形状为[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.我们在整个height和width维度上对输入值进行采样的步幅.等效地,我们通过在height和width维度上插入零来上采样过滤器值的速率.在文献中,有时称相同的参数为input stride或dilation.
  • padding:一个字符串,'VALID'或者'SAME',填充算法.
  • name:返回张量的可选名称.

返回:

与value具有相同类型的Tensor.带有'VALID``填充的输出形状是:

[batch, height - 2 * (filter_width - 1),
 width - 2 * (filter_height - 1), out_channels]

带'SAME'填充的输出形状是:

[batch, height, width, out_channels]

可能引发的异常:

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