前面已经介绍GAN是以对抗的形式逼近概率分布。但直接使用该方法,对随着判别器越来越好而生成器无法与其对抗,进行形成梯度消失的问题。WGAN和LSGAN都是试图使用不同的距离度量,从而构建一个不仅稳定,同时还能快速收敛的生成对抗网络。
1. LSGAN介绍
WGAN使用的是Wasserstein理论来构建度量距离。而LSGAN使用另一种方法,使用更加平滑和非饱和梯度的损失函数——最小乘二来代替原来的Sigmod交叉熵。这是由于L2正则独有的特性,在数据偏离目标时会有一个与其偏离距离成比例的惩罚,再将其拉回来,从而使数据的偏离不会越来越远。
LSGAN的loss简单很多,直接将传统GAN中的softmax变成平方差即可。
- 判别器的loss:D_loss=tf.reduce_sum(tf.square(D(real_X)-1) + tf.square(D(random_Y))/2
- 生成器的loss:G_loss=tf.reduce_sum(tf.square(D(random_Y)-1)/2
x = tf.placeholder(tf.float32, [None, n_input])
y = tf.placeholder(tf.int32, [None])
z_con = tf.random_normal((batch_size, con_dim))#2列
z_rand = tf.random_normal((batch_size, rand_dim))#38列
z = tf.concat(axis=1, values=[tf.one_hot(y, depth = classes_dim), z_con, z_rand])#50列
# 模拟数据gen
gen = generator(z)
genout= tf.squeeze(gen, -1)
# 判别器
disc_real, class_real, _ = discriminator(x)
disc_fake, class_fake, con_fake = discriminator(gen)
pred_class = tf.argmax(class_fake, dimension=1)
# 判别器loss:真实数据真,模拟数据假
loss_d = tf.reduce_sum(tf.square(disc_real-1) + tf.square(disc_fake))/2
# 生成器loss:模拟数据为假
loss_g = tf.reduce_sum(tf.square(disc_fake-1))/2
# 标签loss
loss_cf = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=class_fake, labels=y))#class ok 图片对不上
loss_cr = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=class_real, labels=y))#生成的图片与class ok 与输入的class对不上
loss_c =(loss_cf + loss_cr) / 2
# 隐含信息loss
loss_con =tf.reduce_mean(tf.square(con_fake-z_con))
# 获得各个网络中各自的训练参数
t_vars = tf.trainable_variables()
d_vars = [var for var in t_vars if 'discriminator' in var.name]
g_vars = [var for var in t_vars if 'generator' in var.name]
disc_global_step = tf.Variable(0, trainable=False)
gen_global_step = tf.Variable(0, trainable=False)
train_disc = tf.train.AdamOptimizer(0.0001).minimize(loss_d + loss_c + loss_con, var_list = d_vars, global_step = disc_global_step)
train_gen = tf.train.AdamOptimizer(0.001).minimize(loss_g + loss_c + loss_con, var_list = g_vars, global_step = gen_global_step)