Tensorflow笔记——tf.nn.conv2d_transpose反卷积

tf.nn.conv2d_transpose反卷积(转置卷积)

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

接下来介绍一下反卷积的函数
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,具体含义是[卷积核的高度,卷积核的宽度,卷积核个数,图像通道数]
注意: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反过来了!因为两者互为反向,所以输入输出要调换位置

第三个参数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’

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

#x1是一张3*3的单通道的图像
x1 = tf.constant(1.0, shape=[1,3,3,1])
#3个3*3的卷积核
kernel = tf.constant(1.0, shape=[3,3,3,1])
#x2是一张6*6的3通道的图像
x2 = tf.constant(1.0, shape=[1,6,6,3])
#x3是一张5*5的3通道的图像
x3 = tf.constant(1.0, shape=[1,5,5,3])

首先对x3做一次卷积

注意:反卷积是卷积的逆过程,其参数代表了正向卷积的过程,如:注意此时的参数padding="VALID"反映的是正向卷积过程不进行填充,但是在上采样反卷积过程中,是一直存在填充0的。

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

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

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

既然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.]]]]

看起来,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,8,18,3],strides=[1,2,2,1],padding="SAME")
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值