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之使用Python操作数据库(1)
Nov 25 Python
python使用tcp实现局域网内文件传输
Mar 20 Python
详解django+django-celery+celery的整合实战
Mar 19 Python
python解释器spython使用及原理解析
Aug 24 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
Dec 04 Python
python使用python-pptx删除ppt某页实例
Feb 14 Python
Python基于smtplib模块发送邮件代码实例
May 29 Python
详解python实现可视化的MD5、sha256哈希加密小工具
Sep 14 Python
多个版本的python共存时使用pip的正确做法
Oct 26 Python
Python爬虫教程之利用正则表达式匹配网页内容
Dec 08 Python
Python实现byte转integer
Jun 03 Python
Python如何导出导入所有依赖包详解
Jun 08 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
MOTOROLA 摩托罗拉 MODEL 66-XI五灯中波收音机
2021/03/02 无线电
php 文件状态缓存带来的问题
2008/12/14 PHP
深入解析fsockopen与pfsockopen的区别
2013/07/05 PHP
tp5(thinkPHP5框架)时间查询操作实例分析
2019/05/29 PHP
PHP中的self关键字详解
2019/06/23 PHP
如何解决Jquery库及其他库之间的$命名冲突
2013/09/15 Javascript
js控制页面控件隐藏显示的两种方法介绍
2013/10/09 Javascript
解析jquery中的ajax缓存问题
2013/12/19 Javascript
Javascript中的匿名函数与封装介绍
2015/03/15 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
2015/04/17 Javascript
CSS中position属性之fixed实现div居中
2015/12/14 Javascript
Angular的自定义指令以及实例
2016/12/26 Javascript
vuejs使用FormData实现ajax上传图片文件
2017/08/08 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
2018/06/19 Javascript
python实现划词翻译
2020/04/23 Python
一个超级简单的python web程序
2014/09/11 Python
python打开网页和暂停实例
2014/09/30 Python
python数据封装json格式数据
2018/03/04 Python
Python如何发布程序的详细教程
2018/10/09 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
pytorch中nn.Conv1d的用法详解
2019/12/31 Python
python 实现两个npy档案合并
2020/07/01 Python
手把手教你用纯css3实现轮播图效果实例
2017/05/04 HTML / CSS
澳大利亚拥有最佳跳伞降落点和最好服务的跳伞项目运营商:Skydive Australia
2018/03/05 全球购物
美国隐形眼镜零售商:LensPure
2019/03/10 全球购物
时尚休闲吧创业计划书
2014/01/25 职场文书
本科生导师推荐信范文
2014/05/18 职场文书
学校关爱留守儿童活动方案
2014/08/27 职场文书
幼儿教师暑期培训方案
2014/08/27 职场文书
政法干警核心价值观心得体会
2014/09/11 职场文书
2014红色之旅心得体会
2014/10/07 职场文书
党员批评与自我批评发言稿
2014/10/14 职场文书
刑事起诉书范文
2015/05/19 职场文书
博士论文答辩开场白
2015/06/01 职场文书
2016年教育局“我们的节日——端午节”主题活动总结
2016/04/01 职场文书
鲲鹏 CentOS 7 安装Python3.7
2022/05/11 Servers