參考tricks:
- keep calm and train GAN
- gan tricks
- 外國友人調DCGAN
- 為什么gan生成的圖片模糊的討論
- 為什么gan生成的圖片模糊2
- How can GANs be evaluated?
- https://towardsdatascience.com/mangagan-8362f06b9625
github 上一些參考repo
https://github.com/pavitrakumar78/Anime-Face-GAN-Keras
首先是看了李宏毅老師的課程,然后嘗試著做作業(yè)膜毁,用tensorflow來做,記錄一些坑灾票。代碼在github
一開始就是嘗試最原始的gan,loss也是用的最原始的loss來訓練。
- 訓練的時候可能會出現(xiàn)判別器loss快速降到0狮鸭,而生成器loss不斷上升的現(xiàn)象胡本,這樣的情況github上有人對此進行過討論:
- 對所有discriminator的輸入加上一個高斯白噪聲北苟,instance noise。
- 用soft label
-
我嘗試的方法是打瘪,在每次訓練迭代中計算生成器loss和判別器loss的差值友鼻,如果判別器loss大于生成器一定閾值以上,就訓練判別器闺骚,其他情況訓練生成器彩扔。這樣是能夠比較好的工作的。
'''
''' -
訓練過程中僻爽,生成器生成的圖片顯示會慢慢接近真實圖片虫碉,但隨著訓練的進行,慢慢又變成了隨機噪聲胸梆。
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
可能是因為我在discriminator中加了上面說的高斯白噪聲敦捧。這個噪聲的標準差應該隨著訓練而減小才對。嘗試過碰镜,這樣是有效的兢卵。通過觀察每次訓練迭代過程判別器對真實圖片和生成圖片的打分可以看到,到了訓練后期绪颖,判別器對于真實圖片的打分都到了0.8以下秽荤,這可能是后期生成器無法學習到真實分布的原因。因此在每次迭代中柠横,訓練判別器的條件不僅當判別器loss大于生成器loss超過某個閾值時窃款,還加上當判別器對真實圖片打分低于某個數(shù)值的時候。這樣一來牍氛,生成器生成的圖片就趨于收斂了晨继。這種情況下,
image.png
scheme_index = ii//1000 if ii < 10000 else -1
if train_d:
real_score,fake_score,_,dLoss,gLoss = sess.run([m_real_score,m_fake_score,d_trainer,d_loss,g_loss],
feed_dict={real_image:rib, inptG:nb,
gn_stddev:stddev_scheme[scheme_index], training:True})
else:
real_score,fake_score,_,dLoss,gLoss = sess.run([m_real_score,m_fake_score,g_trainer,d_loss,g_loss],
feed_dict={real_image:rib, inptG:nb,
gn_stddev:stddev_scheme[scheme_index], training:True})
if dLoss-gLoss > switch_threshold or real_score < real_score_threshold:
train_d = True
else: train_d = False
-
記錄一下搬俊,當我想把生成器的channel數(shù)改大的時候紊扬,發(fā)現(xiàn)loss值會變成nan曲饱,應該是過大的值。珠月。還不清楚怎么回事扩淀,調小一點就沒事,image.png
由于最終的結果還不是特別好啤挎,嘗試用優(yōu)化的GAN驻谆,如WGAN,這里有個參考實現(xiàn)庆聘,理論也有很多參考
-
WGAN->
image.png -
WGAN-GP->
image.png
image.png
image.png
稍微好一些胜臊,作用不是特別明顯,到目前為止作用最大的還是instance noise伙判。還沒有嘗試soft label象对,之后試試,不過由于改成了WGAN宴抚,實際上已經(jīng)不存在label一說了勒魔,所以soft label不知道怎么加上。
發(fā)現(xiàn)之前的網(wǎng)絡結構有一些問題:
- 在Generator的輸入dense層后面需要加激活
- bn置于激活層前面
- 使用lrelu代替relu
- 使用更多的channel
- 交替訓練的各自次數(shù)1:1(發(fā)現(xiàn)generator的loss往往更高)
更改之后:3e0a9d2..0e77ea5
效果如下
image.png
image.png
image.png
由于生成的圖片里有很多缺陷(artifact)菇曲,所以就查了很多相關資料冠绢,其中參考4和5都是關于這個的。
在訓練到一定程度的時候常潮,換成沒有加noise的輸入繼續(xù)訓練弟胀,并且調整學習率更小,這樣效果還行喊式,關鍵是細節(jié)多了很多孵户。(20190102-160705)(25af0e)
但是總是會出現(xiàn)壞點,于是就去查了原始數(shù)據(jù)集岔留,發(fā)現(xiàn)數(shù)據(jù)集里邊本身就含有很多有問題的數(shù)據(jù), 包括根本不是頭像的,奇怪的頭像的以及全身的圖像.占比大概在1/20左右,應該挺影響的.我一張一張的剔除了.重新訓練看看(3210591)夏哭,訓練大概20000次左右,效果一般贸诚,然后換0.0001學習率和1:1學習方庭,batchsize從64調到32,繼續(xù)訓練(5dd7b5d酱固,20190106-090041)
由于G_loss總是比較大,所以想著把一次更新中的D和G的更新次數(shù)設置為1:5看看头朱,結果好像生成的圖片有點崩壞啊运悲,而且loss也并沒有明顯的下降∠钆ィ可能問題還是數(shù)據(jù)集太diverse了:
還是換回了5:5訓練班眯,把lr值進一步縮小到5e-5:(20190108-094801)
感覺還是就這屎一樣的效果希停。要崩潰了!J鸢宠能!
重新訓練scratch,187af22(20190109-090711)調整了G的最后一層
打算改小lr進行fine tune磁餐,不過這個數(shù)據(jù)集這個網(wǎng)絡违崇,估計也就能train成這樣了。除非把數(shù)據(jù)集進一步優(yōu)化诊霹,把優(yōu)質的圖片篩出來