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解析json实例方法
Nov 19 Python
python实现html转ubb代码(html2ubb)
Jul 03 Python
Python自动化运维_文件内容差异对比分析
Dec 13 Python
使用实现XlsxWriter创建Excel文件并编辑
May 04 Python
Python+Pandas 获取数据库并加入DataFrame的实例
Jul 25 Python
Python类的继承用法示例
Jan 31 Python
实例详解Matlab 与 Python 的区别
Apr 26 Python
python实现车牌识别的示例代码
Aug 05 Python
python设置代理和添加镜像源的方法
Feb 14 Python
pycharm实现在虚拟环境中引入别人的项目
Mar 09 Python
python怎么判断素数
Jul 01 Python
python 调整图片亮度的示例
Dec 03 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中用接口、抽象类、普通基类实现“面向接口编程”与“耦合方法”简述
2011/03/23 PHP
php汉字转拼音的示例
2014/02/27 PHP
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
url 编码 js url传参中文乱码解决方案
2010/04/11 Javascript
基于jquery的网站幻灯片切换效果焦点图代码
2013/09/15 Javascript
js实现日期级联效果
2014/01/23 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
js实现简洁大方的二级下拉菜单效果代码
2015/09/01 Javascript
学习JavaScript设计模式(封装)
2015/11/26 Javascript
js实现延时加载Flash的方法
2015/11/26 Javascript
JS模拟简易滚动条效果代码(附demo源码)
2016/04/05 Javascript
jQuery ajax应用总结
2016/06/02 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
2016/12/08 Javascript
JS实现的系统调色板完整实例
2016/12/21 Javascript
fetch 使用及如何接收JS传值
2017/11/11 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
2018/03/01 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
2019/11/01 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
ant-design-vue 快速避坑指南(推荐)
2020/01/21 Javascript
微信小程序使用 vant Dialog组件的正确方式
2020/02/21 Javascript
Python爬虫包 BeautifulSoup  递归抓取实例详解
2017/01/28 Python
python os.path模块常用方法实例详解
2018/09/16 Python
对web.py设置favicon.ico的方法详解
2018/12/04 Python
Python进阶:生成器 懒人版本的迭代器详解
2019/06/29 Python
Django+Uwsgi+Nginx如何实现生产环境部署
2020/07/31 Python
HTML5离线缓存Manifest是什么
2016/03/09 HTML / CSS
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
Superdry极度干燥美国官网:英国制造的服装品牌
2018/11/13 全球购物
香港通票:Hong Kong Pass
2019/02/26 全球购物
工程造价与财务管理专业应届生求职信
2013/10/06 职场文书
大学生家政服务项目创业计划书
2014/01/30 职场文书
工厂仓管员岗位职责范本
2014/07/17 职场文书
现场活动策划方案
2014/08/22 职场文书
高中生毕业评语
2014/12/30 职场文书
公司行政主管岗位职责
2015/04/09 职场文书