TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的


Posted in Python onApril 20, 2020

今天来介绍一下Tensorflow里面的反卷积操作,网上反卷积的用法的介绍比较少,希望这篇教程可以帮助到各位

反卷积出自这篇论文:Deconvolutional Networks,有兴趣的同学自行了解

首先无论你如何理解反卷积,请时刻记住一点,反卷积操作是卷积的反向

如果你随时都记住上面强调的重点,那你基本就理解一大半了,接下来通过一些函数的介绍为大家强化这个观念

conv2d_transpose(value, filter, output_shape, strides, padding="SAME", data_format="NHWC", name=None)

除去name参数用以指定该操作的name,与方法有关的一共六个参数:
第一个参数value:指需要做反卷积的输入图像,它要求是一个Tensor
第二个参数filter:卷积核,它要求是一个Tensor,具有[filter_height, filter_width, out_channels, in_channels]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,卷积核个数,图像通道数]
第三个参数output_shape:反卷积操作输出的shape,细心的同学会发现卷积操作是没有这个参数的,那这个参数在这里有什么用呢?下面会解释这个问题
第四个参数strides:反卷积时在图像每一维的步长,这是一个一维的向量,长度4
第五个参数padding:string类型的量,只能是"SAME","VALID"其中之一,这个值决定了不同的卷积方式
第六个参数data_format:string类型的量,'NHWC'和'NCHW'其中之一,这是tensorflow新版本中新加的参数,它说明了value参数的数据格式。'NHWC'指tensorflow标准的数据格式[batch, height, width, in_channels],'NCHW'指Theano的数据格式,[batch, in_channels,height, width],当然默认值是'NHWC'

开始之前务必了解卷积的过程,参考我的另一篇文章:https://3water.com/article/177798.htm

首先定义一个单通道图和3个卷积核

x1 = tf.constant(1.0, shape=[1,3,3,1])
kernel = tf.constant(1.0, shape=[3,3,3,1])

先别着急!我们不直接用反卷积函数,而是再定义一些图

x2 = tf.constant(1.0, shape=[1,6,6,3])
x3 = tf.constant(1.0, shape=[1,5,5,3])

x2是6×6的3通道图,x3是5×5的3通道图
好了,接下来对x3做一次卷积操作

y2 = tf.nn.conv2d(x3, kernel, strides=[1,2,2,1], padding="SAME")

所以返回的y2是一个单通道的图,如果你了解卷积过程,很容易看出来y2是[1,3,3,1]的Tensor,y2的结果如下:

[[[[ 12.]
  [ 18.]
  [ 12.]]
 
 [[ 18.]
  [ 27.]
  [ 18.]]
 
 [[ 12.]
  [ 18.]
  [ 12.]]]]

又一个很重要的部分!tf.nn.conv2d中的filter参数,是[filter_height, filter_width, in_channels, out_channels]的形式,而tf.nn.conv2d_transpose中的filter参数,是[filter_height, filter_width, out_channels,in_channels]的形式,注意in_channels和out_channels反过来了!因为两者互为反向,所以输入输出要调换位置

既然y2是卷积操作的返回值,那我们当然可以对它做反卷积,反卷积操作返回的Tensor,应该和x3的shape是一样的(不难理解,因为是卷积的反过程)

y3 = tf.nn.conv2d_transpose(y2,kernel,output_shape=[1,5,5,3], strides=[1,2,2,1],padding="SAME")

好,现在返回的y3果然是[1,5,5,3]的Tensor,结果如下:

[[[[ 12. 12. 12.]
  [ 30. 30. 30.]
  [ 18. 18. 18.]
  [ 30. 30. 30.]
  [ 12. 12. 12.]]
 
 [[ 30. 30. 30.]
  [ 75. 75. 75.]
  [ 45. 45. 45.]
  [ 75. 75. 75.]
  [ 30. 30. 30.]]
 
 [[ 18. 18. 18.]
  [ 45. 45. 45.]
  [ 27. 27. 27.]
  [ 45. 45. 45.]
  [ 18. 18. 18.]]
 
 [[ 30. 30. 30.]
  [ 75. 75. 75.]
  [ 45. 45. 45.]
  [ 75. 75. 75.]
  [ 30. 30. 30.]]
 
 [[ 12. 12. 12.]
  [ 30. 30. 30.]
  [ 18. 18. 18.]
  [ 30. 30. 30.]
  [ 12. 12. 12.]]]]

这个结果是怎么得来的?可以用一张动图来说明,图片来源:反卷积的真正含义

TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的

看起来,tf.nn.conv2d_transpose的output_shape似乎是多余的,因为知道了原图,卷积核,步长显然是可以推出输出图像大小的,那为什么要指定output_shape呢?
看这样一种情况:

y4 = tf.nn.conv2d(x2, kernel, strides=[1,2,2,1], padding="SAME")

我们把上面的x2也做卷积,获得shape为[1,3,3,1]的y4如下:

[[[[ 27.]
  [ 27.]
  [ 18.]]
 
 [[ 27.]
  [ 27.]
  [ 18.]]
 
 [[ 18.]
  [ 18.]
  [ 12.]]]]

[1,6,6,3]和[1,5,5,3]的图经过卷积得到了相同的大小,[1,3,3,1]
让我们再反过来看,那么[1,3,3,1]的图反卷积后得到什么呢?产生了两种情况。所以这里指定output_shape是有意义的,当然随意指定output_shape是不允许的,如下情况程序会报错:

y5 = tf.nn.conv2d_transpose(x1,kernel,output_shape=[1,10,10,3],strides=[1,2,2,1],padding="SAME")

以上是stride为2的情况,为1时也类似,当卷积核大于原图时,默认用VALID方式(用SAME就无意义了)参考下图:

程序清单:

import tensorflow as tf
 
x1 = tf.constant(1.0, shape=[1,3,3,1])
 
x2 = tf.constant(1.0, shape=[1,6,6,3])
 
x3 = tf.constant(1.0, shape=[1,5,5,3])
 
kernel = tf.constant(1.0, shape=[3,3,3,1])
 
 
 
y1 = tf.nn.conv2d_transpose(x1,kernel,output_shape=[1,6,6,3],
  strides=[1,2,2,1],padding="SAME")
 
y2 = tf.nn.conv2d(x3, kernel, strides=[1,2,2,1], padding="SAME")
 
y3 = tf.nn.conv2d_transpose(y2,kernel,output_shape=[1,5,5,3],
  strides=[1,2,2,1],padding="SAME")
 
y4 = tf.nn.conv2d(x2, kernel, strides=[1,2,2,1], padding="SAME")
 
'''
Wrong!!This is impossible
y5 = tf.nn.conv2d_transpose(x1,kernel,output_shape=[1,10,10,3],strides=[1,2,2,1],padding="SAME")
'''
sess = tf.Session()
tf.global_variables_initializer().run(session=sess)
x1_decov, x3_cov, y2_decov, x2_cov=sess.run([y1,y2,y3,y4])
print(x1_decov.shape)
print(x3_cov.shape)
print(y2_decov.shape)
print(x2_cov.shape)

到此这篇关于TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的 的文章就介绍到这了,更多相关TensorFlow tf.nn.conv2d_transpose 反卷积内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python获取网页上图片下载地址的方法
Mar 11 Python
利用python爬取散文网的文章实例教程
Jun 18 Python
python中装饰器级连的使用方法示例
Sep 29 Python
Python数据分析之获取双色球历史信息的方法示例
Feb 03 Python
win8下python3.4安装和环境配置图文教程
Jul 31 Python
python画微信表情符的实例代码
Oct 09 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
Feb 10 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
Jun 10 Python
python要安装在哪个盘
Jun 15 Python
基于Python3读写INI配置文件过程解析
Jul 23 Python
python 高阶函数简单介绍
Feb 19 Python
python 指定源路径来解决import问题的操作
Mar 04 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
python列表的逆序遍历实现
Apr 20 #Python
python sitk.show()与imageJ结合使用常见的问题
Apr 20 #Python
You might like
PHP中文URL编解码(urlencode()rawurlencode()
2010/07/03 PHP
PHP has encountered a Stack overflow问题解决方法
2014/11/03 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
2019/03/07 PHP
offsetHeight在OnLoad中获取为0的现象
2013/07/22 Javascript
Javascript实现滚动图片新闻的实例代码
2013/11/27 Javascript
jQuery实现的网页右下角tab样式在线客服效果代码
2015/10/23 Javascript
JS与Ajax Get和Post在使用上的区别实例详解
2016/06/08 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
JavaScript中ES6字符串扩展方法
2016/08/26 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
2017/03/31 Javascript
vue构建单页面应用实战
2017/04/10 Javascript
一次围绕setTimeout的前端面试经验分享
2017/06/15 Javascript
vue+vuecli+webpack中使用mockjs模拟后端数据的示例
2017/10/24 Javascript
实现jquery放大镜的两种方法
2018/02/22 jQuery
详解jQuery中的easyui
2018/09/02 jQuery
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
js实现无缝轮播图插件封装
2020/07/31 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
[43:03]完美世界DOTA2联赛PWL S2 PXG vs Magma 第二场 11.21
2020/11/24 DOTA
使用python检测手机QQ在线状态的脚本代码
2013/02/10 Python
python控制台英汉汉英电子词典
2020/04/23 Python
关于Python中定制类的比较运算实例
2019/12/19 Python
python实现多进程按序号批量修改文件名的方法示例
2019/12/30 Python
HTML5中在title标题标签里设置小图标的方法
2020/06/23 HTML / CSS
武汉瑞得软件笔试题
2015/10/27 面试题
音乐学个人的自荐书范文
2013/11/26 职场文书
迎八一活动主题
2014/01/31 职场文书
总经理司机岗位职责
2014/02/06 职场文书
法制宣传月活动总结
2014/04/29 职场文书
小学生保护环境倡议书
2014/05/15 职场文书
三严三实学习心得体会
2014/10/13 职场文书
创业计划书之闲置物品置换中心
2019/12/25 职场文书
使用Python通过企业微信应用给企业成员发消息
2022/04/18 Python
Nginx文件已经存在全局反向代理问题排查记录
2022/07/15 Servers