GAN的反卷积
GAN里面生成器的常用的反卷积的函数已经在tensorflow里面为大家写好,在layers,nn两个包里面都有三种维度的反卷积函数。
1首先说一下反卷积就是一个上采样的过程
2:layers里面常用的函数是tf.layers.conv2d_transpose,官网上所给标准的反卷积函数的定义。
conv2d_transpose(
inputs,
filters,
kernel_size,
strides=(1, 1),
padding='valid',
data_format='channels_last',
activation=None,
use_bias=True,
kernel_initializer=None,
bias_initializer=tf.zeros_initializer(),
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
trainable=True,
name=None,
reuse=None )
接下来看一下里面各个参数的具体意思,及可能需要传的参数
1 inputs:输入值是一个张量,在GAN里面一般可以是一个一维向量的噪声,一般通过全连接之后reshape成你所需要的多维数组,例如100维的噪声全连接为1024*4*4大小一维数组,然后reshape成1024*4*4的单位数组。也可以是多位的数组。
2 filters:控制你下一层你生成的数组的维度,例如上面的1024.
3 kernel_size:代表卷积核的大小。是两个整数的元组或列表(见Python里面定义这两个),也可以是一个数
4 strides:卷积的步长。可以是一个元组或列表,或者一个数
5 padding:代表是否填充。有两个选项”valid” or “same”
6 data_format:是输入维度的顺序。一个是:channels_last(默认),(batch, height, width, channels);另一个是:channels_first,(batch, channels, height, width)
7 reuse:特别注意!!!重用前一层名字相同的权重。可能在反向传播的时候出问题。
`
def generator(x, isTrain=True, reuse=False):
with tf.variable_scope(‘generator’, reuse=reuse):
# 1st hidden layer
conv1 = tf.layers.conv2d_transpose(x, 1024, [4, 4], strides=(1, 1), padding='valid')
lrelu1 = tf.nn.relu(tf.layers.batch_normalization(conv1, training=isTrain), 0.2)
# 2nd hidden layer
conv2 = tf.layers.conv2d_transpose(lrelu1, 512, [4, 4], strides=(2, 2), padding='same')
lrelu2 = tf.nn.relu(tf.layers.batch_normalization(conv2, training=isTrain), 0.2)
# 3rd hidden layer
conv3 = tf.layers.conv2d_transpose(lrelu2, 256, [4, 4], strides=(2, 2), padding='same')
lrelu3 = tf.nn.relu(tf.layers.batch_normalization(conv3, training=isTrain), 0.2)
# 4th hidden layer
conv4 = tf.layers.conv2d_transpose(lrelu3, 128, [4, 4], strides=(2, 2), padding='same')
lrelu4 = tf.nn.relu(tf.layers.batch_normalization(conv4, training=isTrain), 0.2)
# output layer
conv5 = tf.layers.conv2d_transpose(lrelu4, 1, [4, 4], strides=(2, 2), padding='same')
o = tf.nn.tanh(conv5)
return o`
3.nn里面也有tf.nn.conv2d_transpose,官网的定义:
conv2d_transpose(
value,
filter,
output_shape,
strides,
padding='SAME',
data_format='NHWC',
name=None
)
和layers里面定义的有很多相似之处。
1.value:定义的和上面的data_format很相似,是一个四维的张量。一种是适配于NHWC数据格式的[batch, height, width, in_channels] 另一种是适配于NCHW的[batch, in_channels, height, width]
2.filter,strides,padding同上
3.output_shape:是一维的张量,代表输出的格式
4.data_format:和1中联系有两个值分别是NHWC,NCHW。
例子:
x1 = tf.ones(shape=[64,7,7,256]
w=tf.ones([3,3,128,256])
y = tf.nn.conv2d_transpose(x1, w, output_shape=[64,14,14,128], strides=[1,2,2,1], padding=’SAME’)