TensorFlow空洞卷积实现:tf.nn.atrous_conv2d参数解析与实验演示

拾光
拾光
发布时间:2026-10-13| 6人浏览过
原创

本文深入解析TensorFlow中tf.nn.atrous_conv2d函数的实现原理,重点讲解rate参数如何控制采样间隔以扩大感受野。通过对比rate=1与普通卷积,以及rate=2在SAME和VALID模式下的输出差异,直观展示空洞卷积机制。文章包含完整代码示例与结果分析,帮助开发者掌握该技术在语义分割中的应用。

实验环境与背景介绍

实验环境配置为TensorFlow版本1.2.0,Python版本2.7。

功能介绍

关于空洞卷积的理论基础,可参考以下文献,此处不作展开:

1.Long J, Shelhamer E, Darrell T, et al. Fully convolutional networks for semantic segmentation[C]. Computer Vision and Pattern Recognition, 2015.

2.Yu, Fisher, and Vladlen Koltun. “Multi-scale context aggregation by dilated convolutions.” arXiv preprint arXiv:1511.07122 (2015).

3.如何理解空洞卷积(dilated convolution)?

核心概念可概括为:在不使用池化层(pooling)的前提下扩大感受野,因为池化操作会导致信息损失。

为方便阅读,补充以下相关链接:

【TensorFlow】tf.nn.conv2d是怎样实现卷积的?

【TensorFlow】tf.nn.conv2d_transpose是怎样实现反卷积的?

tf.nn.atrous_conv2d参数详解

首先展示函数定义:


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

除name参数用于指定操作名称外,该方法主要涉及四个关键参数:

value: 指需要进行卷积操作的输入图像,必须是一个4维Tensor,形状为[batch, height, width, channels],具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数]。

filters: 相当于CNN中的卷积核,必须是一个4维Tensor,形状为[filter_height, filter_width, channels, out_channels],具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数]。注意这里第三维channels必须与参数value的第四维一致。

rate: 要求是一个int型的正数。常规卷积操作包含stride(即卷积核的滑动步长),但空洞卷积没有stride参数,这一点需特别注意。取而代之的是rate参数。rate参数的作用是定义在输入图像上进行卷积时的采样间隔。可以理解为在卷积核中插入了(rate-1)数量的“0”,使原卷积核出现许多“洞”,从而增大对原图像的采样间隔。具体插入方式详见后文详细描述。当rate=1时,无0插入,该函数退化为普通卷积。

padding: string类型的量,只能是”SAME”或”VALID”其中之一,该值决定了边缘填充的方式。

至此参数介绍完毕。部分读者可能会疑问“stride”参数去哪了?实际上,该函数默认stride=1,即滑动步长固定为1且不可更改。

函数返回一个Tensor。当填充方式为“VALID”时,返回形状为[batch,height-2*(filter_width-1),width-2*(filter_height-1),out_channels]的Tensor;当填充方式为“SAME”时,返回形状为[batch, height, width, out_channels]的Tensor。这一结果的推导暂不展开,我们将通过一段程序直观演示空洞卷积的效果。

空洞卷积实验与结果分析

实验部分

首先创建一张包含2个通道的图像。


img = tf.constant(value=[[[[1],[2],[3],[4]],[[1],[2],[3],[4]],[[1],[2],[3],[4]],[[1],[2],[3],[4]]]],dtype=tf.float32)
img = tf.concat(values=[img,img],axis=3)

接着使用一个3*3大小的卷积核进行卷积操作。


filter = tf.constant(value=1, shape=[3,3,2,5], dtype=tf.float32)
out_img = tf.nn.atrous_conv2d(value=img, filters=filter, rate=1)

构建好img和filter后,即可执行卷积运算。


out_img = tf.nn.conv2d(input=img, filter=filter, strides=[1,1,1,1], padding='VALID')

输出5个channel,设置rate=1,此时空洞卷积等效于普通卷积。分别在SAME和VALID模式下输出结果如下:

接下来调整rate=2,继续运行程序。


out_img = tf.nn.atrous_conv2d(value=img, filters=filter, rate=2, padding='SAME')

查看最终输出结果。

[[[[ 16. 16. 16. 16. 16.] [ 24. 24. 24. 24. 24.] [ 16. 16. 16. 16. 16.] [ 24. 24. 24. 24. 24.]]

[[ 16. 16. 16. 16. 16.] [ 24. 24. 24. 24. 24.] [ 16. 16. 16. 16. 16.] [ 24. 24. 24. 24. 24.]]

[[ 16. 16. 16. 16. 16.] [ 24. 24. 24. 24. 24.] [ 16. 16. 16. 16. 16.] [ 24. 24. 24. 24. 24.]]

[[ 16. 16. 16. 16. 16.] [ 24. 24. 24. 24. 24.] [ 16. 16. 16. 16. 16.] [ 24. 24. 24. 24. 24.]]]]

该结果是如何生成的?通过一张示意图进一步解释。

从图中可见,当rate=2时,通过插入“0”,卷积核由3*3膨胀至5*5。再观察“VALID”模式下的情况:

程序直接报错。原因是此时卷积核的尺寸已超过原图像尺寸,导致越界。

至此,相信大家对空洞卷积已有了基本理解。那么,当填充方式为“VALID”时,返回形状为[batch,height-2*(filter_width-1),width-2*(filter_height-1),out_channels]的Tensor,这一结论相信大家已能自行证明。

完整代码清单


import tensorflow as tf


img = tf.constant(value=[[[[1],[2],[3],[4]],[[1],[2],[3],[4]],[[1],[2],[3],[4]],[[1],[2],[3],[4]]]],dtype=tf.float32)
img = tf.concat(values=[img,img],axis=3)
filter = tf.constant(value=1, shape=[3,3,2,5], dtype=tf.float32)
out_img1 = tf.nn.atrous_conv2d(value=img, filters=filter, rate=1, padding='SAME')
out_img2 = tf.nn.atrous_conv2d(value=img, filters=filter, rate=1, padding='VALID')
out_img3 = tf.nn.atrous_conv2d(value=img, filters=filter, rate=2, padding='SAME')

#error
#out_img4 = tf.nn.atrous_conv2d(value=img, filters=filter, rate=2, padding='VALID')

with tf.Session() as sess:
  print 'rate=1, SAME mode result:'
  print(sess.run(out_img1))

  print 'rate=1, VALID mode result:'
  print(sess.run(out_img2))

  print 'rate=2, SAME mode result:'
  print(sess.run(out_img3))

  # error
  #print 'rate=2, VALID mode result:'
  #print(sess.run(out_img4))

到此这篇关于Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的文章就介绍到这了,更多相关Tensorflow tf.nn.atrous_conv2d空洞卷积内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。