天天看点

Tensorflow——反卷积

目标——主要用来进行上采样,使图像形状变大

Tensorflow——反卷积

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

Arg:

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' 

注意: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的作用——不同的图像大小经过相同的卷积操作可能得到相同的图像,反卷积的output_shape就是指定具有这种性子的图片的反卷积后的形状

[1,6,6,3]和[1,5,5,3]的图经过卷积得到了相同的大小,[1,3,3,1],反卷积的output_shape可以指定为[1,6,6,3]和[1,5,5,3]

实例

#反卷积
import tensorflow as tf
import numpy as np
input=np.array([[[[1],[1],[1]],[[1],[1],[1]],[[1],[1],[1]]]])
print(input.shape)
#input=tf.Variable(input,dtype=tf.float32)
input=tf.constant(input,dtype=tf.float32)
weight=np.array([[[[1],[1],[1]],[[1],[1],[1]],[[1],[1],[1]]]])
weight=tf.Variable(weight,dtype=tf.float32)
weight=tf.constant(value=1,dtype=tf.float32,shape=[3,3,1,1])
#out=tf.nn.conv2d_transpose(input,filters=weight,output_shape=1,strides=[1,2,2,1])
out=tf.nn.conv2d_transpose(input,weight,[1,6,6,1],strides=[1,2,2,1])
print(out)
#init=tf.global_variables_initializer()
with tf.Session() as sess:
    #sess.run(init)
    out,weight=sess.run([out,weight])
    print(out)
    print(weight)
           

输出

Tensorflow——反卷积

继续阅读