2017-10-16 1 views
0

Je travaille sur GAN basé sur DCGAN.tensorflow GAN, 'is_train = Faux' ou 'opt.minimize (var_list = specific_vars)'?

J'ai entendu dire que le générateur et le discriminateur ont besoin de geler leur variable pendant qu'un autre s'entraîne.

Donc, je l'ai fait de cette façon avant.

G    = generator(batch_size, z, in_h) 
D, D_logits = discriminator(X) 
D_, D_logits_ = discriminator(G, reuse=True) 

# Variable Grouping 
t_vars = tf.trainable_variables() 
d_var = [var for var in t_vars if 'discriminator' in var.name] 
g_var = [var for var in t_vars if 'generator' in var.name] 

op_D = tf.train.AdamOptimizer(learning_rate=learning_rate_D, 
          beta1=beta1).minimize(D_loss, var_list=d_var) 
op_G = tf.train.AdamOptimizer(learning_rate=learning_rate_G, 
          beta1=beta1).minimize(G_loss, var_list=g_var) 

Et ceci est mon modèle

def generator(batch_size, z, im_size, is_train=True): 
with tf.variable_scope('generator', reuse=not is_train): 

    alpha = 0.2 
    #half_size, quat_size = im_size//2, im_size//4 

    x1 = tf.layers.dense(z, 4*4*1024) 

    x1 = tf.reshape(x1, (-1, 4, 4, 1024)) 
    x1 = tf.layers.batch_normalization(x1, training=is_train) 
    x1 = tf.maximum(alpha*x1, x1) # leaky relu 
    # 4*4*256 now 

    x2 = tf.layers.conv2d_transpose(x1, 512, 5, strides=2, padding='same') 
    x2 = tf.layers.batch_normalization(x2, training=is_train) 
    x2 = tf.maximum(alpha*x2, x2) 
    # 8*8*512 now 

    x3 = tf.layers.conv2d_transpose(x2, 256, 5, strides=2, padding='same') 
    x3 = tf.layers.batch_normalization(x3, training=is_train) 
    x3 = tf.maximum(alpha*x3, x3) 
    # 16*16*256 now 

    x4 = tf.layers.conv2d_transpose(x3, 128, 5, strides=2, padding='same') 
    x4 = tf.layers.batch_normalization(x4, training=is_train) 
    x4 = tf.maximum(alpha*x4, x4) 
    # 32*32*128 now 

    logits = tf.layers.conv2d_transpose(x4, in_ch, 5, strides=2, padding='same') 
    logits = tf.reshape(logits, (batch_size, im_size, im_size, in_ch)) 
    # 64*64*3 now 

    out = tf.tanh(logits) 

    return out 


def discriminator(image, reuse=False, is_train=True): 
with tf.variable_scope('discriminator', reuse=reuse): 

    alpha = 0.2 
    dr_rate = 0.3 
    #input 64*64*3 

    x1 = tf.layers.conv2d(image, 64, 5, strides=2, padding='same') 
    x1 = tf.maximum(alpha*x1, x1) 
    x1 = tf.layers.dropout(x1, rate=dr_rate, training=is_train) 
    # now 32*32*64 

    x2 = tf.layers.conv2d(x1, 128, 5, strides=2, padding='same') 
    x2 = tf.layers.batch_normalization(x2, training=is_train) 
    x2 = tf.maximum(alpha*x2, x2) 
    x2 = tf.layers.dropout(x2, rate=dr_rate, training=is_train) 
    # now 16*16*128 

    x3 = tf.layers.conv2d(x2, 256, 5, strides=2, padding='same') 
    x3 = tf.layers.batch_normalization(x3, training=is_train) 
    x3 = tf.maximum(alpha*x3, x3) 
    x3 = tf.layers.dropout(x3, rate=dr_rate, training=is_train) 
    # now 8*8*256 

    x4 = tf.layers.conv2d(x3, 512, 5, strides=2, padding='same') 
    x4 = tf.layers.batch_normalization(x4, training=is_train) 
    x4 = tf.maximum(alpha*x4, x4) 
    x4 = tf.layers.dropout(x4, rate=dr_rate, training=is_train) 
    # now 4*4*512 

    flat = tf.reshape(x4, (-1, 4*4*512)) 
    logits = tf.layers.dense(flat, 1) 
    out = tf.sigmoid(logits) 

    return out, logits 

s'il vous plaît ignorer indentations de portée. Si je fais le second discriminateur is_train = False, le résultat change.

D_, D_logits_ = discriminator(G, reuse=True, is_train=False) 

comme ceci. il semble que G ne puisse pas bien apprendre après avoir changé is_train = False.

Quelqu'un sait pourquoi? Je pense que ce code optimise seulement 'g_var' pendant op_G,

donc le changement de 'is_train' du discriminateur ne devrait pas affecter les résultats.

Répondre

1

La mise en place de la deuxième version du discriminateur est essentielle pour que les GAN fonctionnent correctement. Si le discriminateur n'est pas capable de mettre à jour ses poids en fonction de la sortie du générateur, il n'apprendra jamais à distinguer le réel du faux, donc il ne fournira jamais de retour significatif pour que le générateur puisse apprendre. En définissant la deuxième copie du discriminateur comme n'étant pas entraînable, vous essayez d'entraîner Classifier sur un problème à deux classes en lui montrant uniquement l'une des classes.

Pour référence, vous pouvez voir here comment la bibliothèque TFGAN de TensorFlow configure les réseaux de générateur/discriminateur.