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.