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显示进度条的方法
Sep 20 Python
利用python求解物理学中的双弹簧质能系统详解
Sep 29 Python
Django中使用Celery的教程详解
Aug 24 Python
python 通过麦克风录音 生成wav文件的方法
Jan 09 Python
在Pycharm中自动添加时间日期作者等信息的方法
Jan 16 Python
python使用Matplotlib改变坐标轴的默认位置
Oct 18 Python
Python爬虫实现vip电影下载的示例代码
Apr 20 Python
解决Keras 自定义层时遇到版本的问题
Jun 16 Python
python如何代码集体右移
Jul 20 Python
python3实现飞机大战
Nov 29 Python
python使用numpy中的size()函数实例用法详解
Jan 29 Python
Jupyter Notebook内使用argparse报错的解决方案
Jun 03 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实现的click captcha点击验证码类实例
2014/09/23 PHP
thinkphp实现发送邮件密码找回功能实例
2014/12/01 PHP
PHP Cookei记录用户历史浏览信息的代码
2016/02/03 PHP
php微信公众号开发模式详解
2016/11/28 PHP
phpStudy中升级MySQL版本到5.7.17的方法步骤
2017/08/03 PHP
jquery中$each()方法的使用指南
2015/04/30 Javascript
IE10中flexigrid无法显示数据的解决方法
2015/07/26 Javascript
js倒计时抢购实例
2015/12/20 Javascript
基于jQuery实现左右图片轮播(原理通用)
2015/12/24 Javascript
JavaScript笔记之数据属性和存储器属性
2016/03/31 Javascript
详解AngularJs中$resource和restfu服务端数据交互
2016/09/21 Javascript
微信小程序 点击控件后选中其它反选实例详解
2017/02/21 Javascript
利用Jasmine对Angular进行单元测试的方法详解
2017/06/12 Javascript
webpack本地开发环境无法用IP访问的解决方法
2018/03/20 Javascript
用react-redux实现react组件之间数据共享的方法
2018/06/08 Javascript
vue-cli系列之vue-cli-service整体架构浅析
2019/01/14 Javascript
ES6 Set结构的应用实例分析
2019/06/26 Javascript
vue 路由子组件created和mounted不起作用的解决方法
2019/11/05 Javascript
原生JS生成指定位数的验证码
2020/10/28 Javascript
wxpython 最小化到托盘与欢迎图片的实现方法
2014/06/09 Python
python中split方法用法分析
2015/04/17 Python
深入理解Python中的内置常量
2017/05/20 Python
python3获取当前文件的上一级目录实例
2018/04/26 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
2019/08/15 Python
python3 常见解密加密算法实例分析【base64、MD5等】
2019/12/19 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
Canvas 文本转粒子效果的实现代码
2019/02/14 HTML / CSS
饿了么订餐官网:外卖、网上订餐
2019/06/28 全球购物
澳大利亚在线购买葡萄酒:The Wine Collective
2020/02/20 全球购物
服装机修工岗位职责
2013/12/26 职场文书
cf战队收人广告词
2014/03/14 职场文书
小学阳光体育活动总结
2014/07/05 职场文书
群众路线问题查摆对照检查材料
2014/10/04 职场文书
机关单位工作失职检讨书
2014/11/20 职场文书
解决Golang中goroutine执行速度的问题
2021/05/02 Golang
Python机器学习三大件之一numpy
2021/05/10 Python