Python DCGANs:鉴别器变得太强太快,无法让生成器学习

Python DCGANs:鉴别器变得太强太快,无法让生成器学习,python,tensorflow,dcgan,Python,Tensorflow,Dcgan,我正在尝试使用(在Tensorflow中实现)我的一些数据。我遇到了鉴别器变得太强的问题,太快了,生成器无法学习任何东西 现在有一些技巧通常被推荐用于解决GANs的问题: 批量标准化(DCGANs代码中已有) 使发电机领先 我做了后者的一些版本,允许每1个鉴别器迭代10次generator(不仅在开始时,而且在整个培训过程中),这就是它的外观: 在这种情况下,增加更多的生成器迭代只会减缓不可避免的鉴别器变得太强,并抑制生成器学习 因此,我想就是否有其他方法可以帮助解决歧视性太强的问题征求意

我正在尝试使用(在Tensorflow中实现)我的一些数据。我遇到了鉴别器变得太强的问题,太快了,生成器无法学习任何东西

现在有一些技巧通常被推荐用于解决GANs的问题:

  • 批量标准化(DCGANs代码中已有)

  • 使发电机领先

我做了后者的一些版本,允许每1个鉴别器迭代10次generator(不仅在开始时,而且在整个培训过程中),这就是它的外观:

在这种情况下,增加更多的生成器迭代只会减缓不可避免的鉴别器变得太强,并抑制生成器学习


因此,我想就是否有其他方法可以帮助解决歧视性太强的问题征求意见?

总结一下这个主题-一般建议如下:

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

然而,在我的例子中,问题是数据缩放:我已经将输入数据的格式从初始的.jpg更改为.npy,并且在途中丢失了重缩放。请注意,将输入数据重新缩放到[-1,1]范围,并对模型进行了调整以使用此范围。

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

  • 尝试鉴别器功能中的泄漏和丢失:

    def leaky_relu(x,alpha,name=“leaky_relu”):
    返回tf.max(x,alpha*x,name=name)

  • 以下是完整的定义:

    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
    
  • 在鉴别器丢失中添加标签平滑,以防止鉴别器变强。根据d_损耗性能增加平滑值

    d_损失实际值=tf.reduce_平均值(
    tf.nn.sigmoid\u cross\u entropy\u with\u logits(logits=d\u logits\u real,labels=tf.ones\u like(d\u model\u real)*(1.0-平滑))


  • 当我尝试他们生成mnist数据的实现时,我最终得到了非常高的损失。但从输出来看,它们看起来仍然像数字(如果你稍微眯着眼睛),这取决于你的问题领域,有时生成器的输出“足够好”,尽管没有通过鉴别器的测试。