2017-06-01 21 views
-1

我想用我的一些數據使用this version of the DCGAN code(在Tensorflow中實現)。我遇到了鑑別器變得太強烈的問題,因爲發生器學習任何東西都太快。DCGANs:鑑別器變得太強太快,不能讓發生器學習

現在有通常建議對問題甘斯一些技巧:

  • 批標準化(已經存在於DCGANs代碼)

  • 給人一種先聲奪人發電機。

我做了後者的一些版本,允許每鑑別的110次迭代產生的(不只是在開始的時候,但在整個訓練),這就是它的外觀: Loss functions of generator and discriminator

在這種情況下添加更多的生成器迭代只有通過減慢不可避免的鑑別器變得太強並抑制生成器學習纔有助於。

因此,我想問一個關於是否有其他方式可以幫助太強大的鑑別器問題的建議?

回答

1

總結這個話題 - 通用的建議是:

  • 嘗試與模型參數打(如學習率,例如)
  • 嘗試加入更多的各種輸入數據
  • 嘗試調整網絡的發生器和鑑別器的體系結構。

但是,就我而言,問題在於數據縮放:我已經將輸入數據的格式從最初的.jpg更改爲.npy,並且在路上丟失了重新縮放。請注意,this DCGAN-tensorflow code將輸入數據重新調整爲[-1,1]範圍,並調整模型以使用該範圍。

0

當我嘗試他們的生成mnist數據的實現時,我得到了非常高的損失。但看着輸出,他們仍然看起來像數字(如果你稍微斜視)根據你的問題領域,有時儘管沒有通過鑑別器的測試,發生器的輸出「足夠好」。

+0

不幸的是我的情況下產生的數據都不好 - 我希望一些技巧,讓更多的發電機學習的機會或許能解決這個問題。 – Massyanya

0

我覺得有幾種方法可以減少判斷:

  1. 嘗試leaky_relu和輟學在鑑別功能:

    def leaky_relu(x, alpha, name="leaky_relu"): return tf.maximum(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 
  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)))