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 相关文章推荐
Python3实现的腾讯微博自动发帖小工具
Nov 11 Python
Python ValueError: invalid literal for int() with base 10 实用解决方法
Jun 21 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
Aug 04 Python
详解pandas.DataFrame中删除包涵特定字符串所在的行
Apr 04 Python
python中调试或排错的五种方法示例
Sep 12 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
Feb 18 Python
Python实现扫码工具的示例代码
Oct 09 Python
基于Python中Remove函数的用法讨论
Dec 11 Python
用python读取xlsx文件
Dec 17 Python
Python命令行参数argv和argparse该如何使用
Feb 08 Python
Python之多进程与多线程的使用
Feb 23 Python
Python 循环读取数据内存不足的解决方案
May 25 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反射类ReflectionClass用法分析
2016/05/12 PHP
PHP实现多图上传(结合uploadify插件)思路分析
2016/11/30 PHP
javascript编程起步(第五课)
2007/02/27 Javascript
JavaScript网页制作特殊效果用随机数
2007/05/22 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
jquery实现仿JqueryUi可拖动的DIV实例
2015/07/31 Javascript
浅谈javascript的Touch事件
2015/09/27 Javascript
js实现文本框输入文字个数限制代码
2015/12/25 Javascript
jQuery使用zTree插件实现树形菜单和异步加载
2016/02/25 Javascript
简单实现轮播图效果的实例
2016/07/15 Javascript
Vue.js实现拖放效果的实例
2016/09/30 Javascript
bootstrap modal弹出框的垂直居中
2016/12/14 Javascript
Node.js中多进程模块Cluster的介绍与使用
2017/05/27 Javascript
JS 判断某变量是否为某数组中的一个值的3种方法(总结)
2017/07/10 Javascript
Angular指令之restict匹配模式的详解
2017/07/27 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
JS尾递归的实现方法及代码优化技巧
2019/01/19 Javascript
vue中更改数组中属性,在页面中不生效的解决方法
2019/10/30 Javascript
python开发之thread线程基础实例入门
2015/11/11 Python
深入理解Python变量与常量
2016/06/02 Python
Flask web开发处理POST请求实现(登录案例)
2018/07/26 Python
如何在Django项目中引入静态文件
2019/07/26 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
2020/04/11 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
2020/09/28 Python
AmazeUI中各种的导航式菜单与解决方法
2020/08/19 HTML / CSS
国家地理在线商店:Shop National Geographic
2018/06/30 全球购物
英国最受欢迎的价格比较网站之一:MoneySuperMarket
2018/12/19 全球购物
C#可否对内存进行直接的操作
2015/02/26 面试题
美工的岗位职责
2013/11/14 职场文书
《胖乎乎的小手》教学反思
2014/02/26 职场文书
优秀公益广告词大全
2014/03/19 职场文书
学党史心得体会
2014/09/05 职场文书
2014年个人师德工作总结
2014/12/04 职场文书
交通安全主题班会
2015/08/12 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书
Python使用BeautifulSoup4修改网页内容
2022/05/20 Python