解決keras GAN訓練是loss不發生變化,accuracy一直為0.5的問題
1、Binary Cross Entropy
常用於二分類問題,當然也可以用於多分類問題,通常需要在網路的最後一層新增sigmoid進行配合使用,其期望輸出值(target)需要進行one hot編碼,另外BCELoss還可以用於多分類問題Multi-label classification.
定義:
For brevity,let x = output,z = target. The binary cross entropy loss is
loss(x,z) = - sum_i (x[i] * log(z[i]) + (1 - x[i]) * log(1 - z[i]))
對應的程式碼為:
def binary_crossentropy(t,o):
return -(t*tf.log(o+eps) + (1.0-t)*tf.log(1.0-o+eps))
2、Categorical cross-entropy
p are the predictions,t are the targets,i denotes the data point and j denotes the class.
適用於多分類問題,並使用softmax作為輸出層的啟用函式的情況。
補充知識:訓練GAN的一些小貼士
下面是我認識到自己犯過的一些錯誤,以及我從中學到的一些東西。所以,如果你是GANs的新手,並沒有看到在訓練方面取得很大的成功,也許看看以下幾個方面會有所幫助:
1、大卷積核和更多的濾波器
更大的卷積核覆蓋了前一層影象中的更多畫素,因此可以檢視更多資訊。5x5的核與CIFAR-10配合良好,在判別器中使用3x3核使判別器損耗迅速趨近於0。對於生成器,你希望在頂層的卷積層有更大的核,以保持某種平滑。在較低的層,我沒有看到改變核心大小的任何主要影響。
濾波器的數量可以大量增加引數的數量,但通常需要更多的濾波器。我在幾乎所有的卷積層中都使用了128個濾波器。使用較少的濾波器,特別是在生成器中,使得最終生成的影象過於模糊。因此,看起來更多的濾波器可以幫助捕獲額外的資訊,最終為生成的影象增加清晰度。
2、標籤翻轉(Generated=True,Real=False)
雖然一開始看起來很傻,但對我有用的一個主要技巧是更改標籤分配。
如果你使用的是Real Images = 1,而生成的影象= 0,則使用另一種方法會有所幫助。正如我們將在後面看到的,這有助於在早期迭代中使用梯度流,並幫助使梯度流動。
3、使用有噪聲的標籤和軟標籤
這在訓練判別器時是非常重要的。硬標籤(1或0)幾乎扼殺了早期的所有學習,導致識別器非常快地接近0損失。最後,我使用0到0.1之間的隨機數表示0標籤(真實影象),使用0.9到1.0之間的隨機數表示1標籤(生成的影象)。在訓練生成器時不需要這樣做。
此外,增加一些噪音的訓練標籤也是有幫助的。對於輸入識別器的5%的影象,標籤被隨機翻轉。比如真實的被標記為生成的,生成的被標記為真實的。
4、使用批歸一化是有用的,但是需要有其他的東西也是合適的
批歸一化無疑有助於最終的結果。新增批歸一化後,生成的影象明顯更清晰。但是,如果你錯誤地設定了卷積核或濾波器,或者識別器的損失很快達到0,新增批歸一化可能並不能真正幫助恢復。
5、每次一個類別
為了更容易地訓練GANs,確保輸入資料具有相似的特徵是很有用的。例如,與其在CIFAR-10的所有10個類中都訓練GAN,不如選擇一個類(例如,汽車或青蛙)並訓練GANs從該類生成影象。DC-GAN的其他變體在學習生成多個類的影象方面做得更好。例如,以類標籤為輸入,生成基於類標籤的影象。但是,如果你從一個普通的DC-GAN開始,最好保持事情簡單。
6、檢視梯度
如果可能的話,試著監控梯度以及網路中的損失。這些可以幫助你更好地瞭解訓練的進展,甚至可以幫助你在工作不順利的情況下進行除錯。
理想情況下,生成器應該在訓練的早期獲得較大的梯度,因為它需要學習如何生成真實的資料。另一方面,判別器並不總是在早期獲得較大的梯度,因為它可以很容易地區分真假影象。一旦生成器得到足夠的訓練,判別器就很難分辨真假影象。它會不斷出錯,並得到大的梯度。
以上這篇解決keras GAN訓練是loss不發生變化,accuracy一直為0.5的問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。