DCGAN:鉴别器过于强大太快,无法让发电机学习

时间:2017-06-01 17:02:07

标签: python tensorflow dcgan

我正在尝试使用this version of the DCGAN code(在Tensorflow中实现)和我的一些数据。我遇到了鉴别器变得过于强大的问题,发电机无法学习任何东西。

现在,通常会针对GAN的问题推荐一些技巧:

  • 批量标准化(DCGAN代码已经存在)

  • 为发电机提供先机。

我通过每1个鉴别器允许10次迭代生成器来做后者的某些版本(不仅仅是在开始时,而是在整个训练期间),这就是它的外观: Loss functions of generator and discriminator

在这种情况下添加更多的生成器迭代只能通过减慢不可避免的速度 - 鉴别器变得过于强大并抑制生成器学习。

因此,我想就是否有另一种方法可以帮助解决过于强烈的歧视者问题提出建议?

2 个答案:

答案 0 :(得分:2)

总结这个主题 - 通用建议是:

  • 尝试使用模型参数(例如学习率)
  • 尝试为输入数据添加更多变种
  • 尝试调整生成器和鉴别器的架构 网络。

然而,在我的情况下,问题是数据缩放:我已经将输入数据的格式从最初的.jpg更改为.npy并且在途中丢失了重新缩放。请注意this DCGAN-tensorflow code将输入数据重新调整为[-1,1]范围,并调整模型以使用此范围。

答案 1 :(得分:2)

我认为有几种方法可以减少鉴别器:

  1. 在鉴别器功能中尝试使用leaky_relu和dropout:

    def leaky_relu(x, alpha, name="leaky_relu"): return tf.maximum(x, alpha * x , name=name)

  2. 这是完整的定义:

    def discriminator(images, reuse=False):
    
    # Implement a seperate leaky_relu function
    def leaky_relu(x, alpha, name="leaky_relu"):
        return tf.maximum(x, alpha * x , name=name)
    
    # Leaky parameter Alpha 
    alpha = 0.2
    
    # Add batch normalization, kernel initializer, the LeakyRelu activation function, ect. to the layers accordingly
    with tf.variable_scope('discriminator', reuse=reuse):
        # 1st conv with Xavier weight initialization to break symmetry, and in turn, help converge faster and prevent local minima.
        images = tf.layers.conv2d(images, 64, 5, strides=2, padding="same", kernel_initializer=tf.contrib.layers.xavier_initializer())
        # batch normalization
        bn = tf.layers.batch_normalization(images, training=True)
        # Leaky relu activation function
        relu = leaky_relu(bn, alpha, name="leaky_relu")
        # Dropout "rate=0.1" would drop out 10% of input units, oppsite with keep_prob
        drop = tf.layers.dropout(relu, rate=0.2)
    
        # 2nd conv with Xavier weight initialization, 128 filters.
        images = tf.layers.conv2d(drop, 128, 5, strides=2, padding="same", kernel_initializer=tf.contrib.layers.xavier_initializer())
        bn = tf.layers.batch_normalization(images, training=True)
        relu = leaky_relu(bn, alpha, name="leaky_relu")
        drop = tf.layers.dropout(relu, rate=0.2)
    
        # 3rd conv with Xavier weight initialization, 256 filters, strides=1 without reshape
        images = tf.layers.conv2d(drop, 256, 5, strides=1, padding="same", kernel_initializer=tf.contrib.layers.xavier_initializer())
        #print(images)
        bn = tf.layers.batch_normalization(images, training=True)
        relu = leaky_relu(bn, alpha, name="leaky_relu")
        drop = tf.layers.dropout(relu, rate=0.2)
    
    
        flatten = tf.reshape(drop, (-1, 7 * 7 * 128))
        logits = tf.layers.dense(flatten, 1)
        ouput = tf.sigmoid(logits)  
    
        return ouput, logits
    
    1. 在鉴别器丢失中添加标签平滑以防止鉴别器变强。根据d_loss性能增加平滑值。

      d_loss_real = tf.reduce_mean( tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits_real, labels=tf.ones_like(d_model_real)*(1.0 - smooth)))