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中对list去重的多种方法
Sep 18 Python
python获取当前用户的主目录路径方法(推荐)
Jan 12 Python
Python Pywavelet 小波阈值实例
Jan 09 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
Apr 15 Python
PyQt5 QTable插入图片并动态更新的实例
Jun 18 Python
Python3+Appium实现多台移动设备操作的方法
Jul 05 Python
对Django项目中的ORM映射与模糊查询的使用详解
Jul 18 Python
解决python web项目意外关闭,但占用端口的问题
Dec 17 Python
python中count函数简单用法
Jan 05 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
Aug 03 Python
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
Nov 11 Python
Django框架中表单的用法
Jun 10 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 处理图片的类实现代码
2009/10/23 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
2014/11/03 PHP
PHP中实现crontab代码分享
2015/03/26 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
在PHP中实现使用Guzzle执行POST和GET请求
2019/10/15 PHP
Javascript remove 自定义数组删除方法
2009/10/20 Javascript
javascript 主动派发事件总结
2011/08/09 Javascript
关于递归运算的顺序测试代码
2011/11/30 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
JavaScript获取多个数组的交集简单实例
2013/11/11 Javascript
JS实现slide文字框缩放伸展效果代码
2015/11/05 Javascript
简单理解JavaScript中的封装与继承特性
2016/03/19 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
2016/09/06 Javascript
jquery,js简单实现类似Angular.js双向绑定
2017/01/13 Javascript
angular过滤器实现排序功能
2017/06/27 Javascript
Angularjs实现上传图片预览功能
2017/09/01 Javascript
vue.js如何将echarts封装为组件一键使用详解
2017/10/10 Javascript
Vue 中使用富文本编译器wangEditor3的方法
2019/09/26 Javascript
JavaScript将数组转换为链表的方法
2020/02/16 Javascript
[00:35]可解锁地面特效
2018/12/20 DOTA
使用Python编写vim插件的简单示例
2015/04/17 Python
Python字符串拼接、截取及替换方法总结分析
2016/04/13 Python
20招让你的Python飞起来!
2016/09/27 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
Python通过正则库爬取淘宝商品信息代码实例
2020/03/02 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
HTML5中的拖放实现详解
2017/08/23 HTML / CSS
西班牙电子产品购物网站:Electronicamente
2018/07/26 全球购物
环境科学专业个人求职信
2013/09/26 职场文书
大学生军训自我评价分享
2013/11/09 职场文书
机械设计毕业生自荐信
2014/02/02 职场文书
企业精细化管理实施方案
2014/03/23 职场文书
祖国在我心中演讲稿450字
2014/09/05 职场文书
2014年化验室工作总结
2014/11/21 职场文书
安全生产协议书
2016/03/22 职场文书
Django与数据库交互的实现
2021/06/03 Python