在GAN網絡的my implementation鑑頻器的輸出是一樣的東西2.05145e+07
這導致1 - disc_output
- >1-2.05145e+07=-2.05145e+07
(一個是負面的數量),因此導致log(1-2.05145e+07)
爲NaN。Tensorflow GAN鑑別器損耗的NaN因爲是負面的鑑相器輸出
我不是第一個遇到這種問題的人。一種解決方案是隻允許log
內的正值,如here。
有沒有人知道更好的解決方案呢?
也許有些不同的損失函數?
在GAN網絡的my implementation鑑頻器的輸出是一樣的東西2.05145e+07
這導致1 - disc_output
- >1-2.05145e+07=-2.05145e+07
(一個是負面的數量),因此導致log(1-2.05145e+07)
爲NaN。Tensorflow GAN鑑別器損耗的NaN因爲是負面的鑑相器輸出
我不是第一個遇到這種問題的人。一種解決方案是隻允許log
內的正值,如here。
有沒有人知道更好的解決方案呢?
也許有些不同的損失函數?
由於鑑別符返回概率值,因此其輸出必須介於0和1之間。在使用鑑別器輸出之前嘗試使用sigmoid
(https://www.tensorflow.org/api_docs/python/tf/sigmoid)。
另外,正如其他人一樣,我建議在數值不穩定的情況下使用tf.log(tf.maximum(x, 1e-9))
。
有一些標準技術可以避免日誌數值不穩定。例如,你經常關心的是丟失(這是日誌的一個函數),而不是日誌值本身。例如,與邏輯損失:
爲簡潔起見,讓x = logits
,z = labels
。物流損失是
Z * -log(乙狀結腸(X))+(1 - Z)* -log(1 - S形(X))
= MAX(X,0) - X * z + log(1 + exp(-abs(x)))
這些技巧已經在標準張量流損失(如tf.losses.sigmoid_cross_entropy
)中實現。請注意,在日誌中取最大值或最小值的簡單解決方案不是是一個很好的解決方案,因爲在飽和區域中沒有有意義的梯度:例如,d/dx[max(x, 0)] = 0 for x < 0
,這意味着不會出現梯度飽和區域。
TensorFlow有GAN支持tf.contrib.gan
。這些損失已經實現了所有的標準數值穩定技巧,並且避免了您必須重新創建輪子。
tfgan = tf.contrib.gan
tfgan.losses.minimax_discriminator_loss(...)
查看https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/gan瞭解更多詳情。
我試過'sigmoid'激活函數,但鑑別器的結果是'1',導致'log(1-1)'這同樣很糟糕。目前我使用'tf.log(tf.maximum(x,1e-9))',但我想知道有沒有更好的方法。 – Someone
我認爲這表明你的模型存在問題。鑑別器輸出表示給定樣本是真實的概率。在你的情況下,它將合成樣本的概率值「1」賦值,這是沒有意義的。 'tf.log(tf.maximum(x,1e-9))'只是防範數值不穩定性的一種預防措施,而不是解決這個問題的方法。 – eaksan
你讓我更仔細地看看我的模型,我發現了(其中一個)錯誤。所以你的接力幫助了我的論文。對這個提示有一千個感謝。我的鑑別器有兩個輸入,像[this](https://stackoverflow.com/questions/40318457/how-to-build-a-multiple-input-graph-with-tensor-flow)並添加兩個輸入子網原因問題是,如果我將它們相乘,它似乎工作正常。 – Someone