1. 程式人生 > >GAN的反捲積

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’)