Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的


Posted in Python onApril 20, 2020

实验环境:tensorflow版本1.2.0,python2.7

介绍

关于空洞卷积的理论可以查看以下链接,这里我们不详细讲理论:

惯例先展示函数:

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

除去name参数用以指定该操作的name,与方法有关的一共四个参数:

value:
指需要做卷积的输入图像,要求是一个4维Tensor,具有[batch, height, width, channels]这样的shape,具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数]

filters:
相当于CNN中的卷积核,要求是一个4维Tensor,具有[filter_height, filter_width, channels, out_channels]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],同理这里第三维channels,就是参数value的第四维

rate:
要求是一个int型的正数,正常的卷积操作应该会有stride(即卷积核的滑动步长),但是空洞卷积是没有stride参数的,这一点尤其要注意。取而代之,它使用了新的rate参数,那么rate参数有什么用呢?它定义为我们在输入图像上卷积时的采样间隔,你可以理解为卷积核当中穿插了(rate-1)数量的“0”,把原来的卷积核插出了很多“洞洞”,这样做卷积时就相当于对原图像的采样间隔变大了。具体怎么插得,可以看后面更加详细的描述。此时我们很容易得出rate=1时,就没有0插入,此时这个函数就变成了普通卷积。

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

ok,完了,到这就没有参数了,或许有的小伙伴会问那“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模式下输出如下:

Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的

ok,调整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.]]]]

这个结果怎么出来的呢?再用一张图

Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的

这里我们看到rate=2时,通过穿插“0”,卷积核由3*3膨胀到了5*5。再看看“VALID”模式下,会发生什么?

Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的

直接报错了。因为卷积核的大小已经超过了原图大小

好了,看到这里相信大家对于空洞卷积有了基本的了解了。那么,填充方式为“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 相关文章推荐
python用ConfigObj读写配置文件的实现代码
Mar 04 Python
python持久性管理pickle模块详细介绍
Feb 18 Python
python如何让类支持比较运算
Mar 20 Python
Python实现判断给定列表是否有重复元素的方法
Apr 11 Python
python抓取网站的图片并下载到本地的方法
May 22 Python
Scrapy基于selenium结合爬取淘宝的实例讲解
Jun 13 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
Aug 30 Python
Python数据库小程序源代码
Sep 15 Python
Python多重继承之菱形继承的实例详解
Feb 12 Python
tensorflow常用函数API介绍
Apr 19 Python
keras多显卡训练方式
Jun 10 Python
python Autopep8实现按PEP8风格自动排版Python代码
Mar 02 Python
python argparse模块通过后台传递参数实例
Apr 20 #Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
Apr 20 #Python
Tensorflow tf.nn.depthwise_conv2d如何实现深度卷积的
Apr 20 #Python
解决python脚本中error: unrecognized arguments: True错误
Apr 20 #Python
python argparse传入布尔参数false不生效的解决
Apr 20 #Python
parser.add_argument中的action使用
Apr 20 #Python
Python ArgumentParse的subparser用法说明
Apr 20 #Python
You might like
php中get_cfg_var()和ini_get()的用法及区别
2015/03/04 PHP
javascript 对表格的行和列都能加亮显示
2008/12/26 Javascript
javascript使用smipleChart实现简单图表
2015/01/02 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
基于javascript代码实现通过点击图片显示原图片
2015/11/29 Javascript
JS使用post提交的两种方式
2015/12/03 Javascript
JS判断图片是否加载完成方法汇总(最新版)
2016/05/13 Javascript
浅析JS获取url中的参数实例代码
2016/06/14 Javascript
Javascript中arguments对象的详解与使用方法
2016/10/04 Javascript
JavaScript中的遍历详解(多种遍历)
2017/04/07 Javascript
基于vue+canvas的excel-like组件实例详解
2017/11/28 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
2018/08/31 Javascript
写gulp遇到的ES6问题详解
2018/12/03 Javascript
js打开word文档预览操作示例【不是下载】
2019/05/23 Javascript
layui 实现加载动画以及非真实加载进度的方法
2019/09/23 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
Python编程实战之Oracle数据库操作示例
2017/06/21 Python
Pyinstaller将py打包成exe的实例
2018/03/31 Python
使用python进行广告点击率的预测的实现
2019/07/04 Python
python 实现在一张图中绘制一个小的子图方法
2019/07/07 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
使用Python实现正态分布、正态分布采样
2019/11/20 Python
python+Django+pycharm+mysql 搭建首个web项目详解
2019/11/29 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
如何通过命令行进入python
2020/07/06 Python
详解Python IO编程
2020/07/24 Python
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
稀有和绝版书籍:Biblio.com
2017/02/02 全球购物
瑜伽服装品牌:露露柠檬(lululemon athletica)
2017/06/04 全球购物
纽约服装和生活方式品牌:Saturdays NYC
2017/08/13 全球购物
车间副主任岗位职责
2013/12/24 职场文书
治安消防安全责任书
2014/07/23 职场文书
一般纳税人申请报告
2015/05/18 职场文书
2021年最新用于图像处理的Python库总结
2021/06/15 Python
【海涛dota】偶遇拉娜娅 质量局德鲁伊第一视角解说
2022/04/01 DOTA