GAN模型網絡結構+實驗效果演化
- 1.GAN
- 1.1網絡結構
- 1.2實驗結果
- 2.DCGAN
- 2.1網絡結構
- 2.2實驗結果
- 3.WGAN
- 3.1網絡結構
- 3.2實驗結果
- 4.WGAN-GP
- 4.1網絡結構
- 4.2實驗結果
- 5.WGAN-SN
- 5.1網絡結構
- 5.2實驗結果
- 小結
1.GAN
文章: https://arxiv.org/pdf/1406.2661.pdf
代碼: Pylearn2, theano, https://github.com/goodfeli/adversarial
1.1網絡結構
多層感知機器(沒有在文章中找到)
G: ReLU, sigmoid
D:maxout, dropout
1.2實驗結果
1.數據集:MNIST,the Toronto Face Database (TFD) , CIFAR-10
2.Gaussian Parzen window 擬合樣本,輸出對應的log-likelihood.
3.直接展示了在三個圖像集合上的效果,最右遍一列顯示的是與第二列最相似的訓練樣本(具體如何衡量相近,需要查論文)
a) MNIST,b) TFD, c) CIFAR-10 (fully connected model), d) CIFAR-10 (convolutional discriminatorand “deconvolutional” generator)
訓練次數呢?
這時候的cifar數據集基本不能看·
2.DCGAN
文章:https://arxiv.org/pdf/1511.06434.pdf
代碼:https://pytorch.org/tutorials/beginner/dcgan_faces_tutorial.html,pytorch 官網DCAGAN教程,示例是人臉圖像生成
2.1網絡結構
P3:網絡結構表
1.去除所有的poling層
2.D,G中都使用batchnorm
3.移除全聯接結構
4.G激活函數:ReLU+Tanh(最后一層)
5.D激活函數:LeakyReLU(所有層)
2.2實驗結果
Lsun–視覺效果,300萬張圖像
Cifar10-分類實驗
人臉加減法實驗
3.WGAN
文章:https://arxiv.org/pdf/1701.07875.pdf
代碼:https://github.com/martinarjovsky/WassersteinGAN,作者github 提供的代碼,pytorch
3.1網絡結構
p9:以DCGAN為baseline, baseline 損失使用-logD 技巧
lipschitz約束實現:clip D網絡參數
3.2實驗結果
Lsun-bedromm 穩定性視覺實驗
WGAN本身是為了提高GAN模型訓練的穩定性而生的。文章強調的兩個優點啊:有意義的loss+穩定訓練過程。同一作者的后續文章(improved Training of Wasserstein GANs) 圖3,展示了clip 版本WGAN IS指標確實比不上DCGAN。
4.WGAN-GP
文章:https://arxiv.org/pdf/1704.00028.pdf
代碼:https://github.com/igul222/improved_wgan_training,作者github 提供的代碼,tensorflow(明明是同一個作者寫的平臺還不一樣)
自己復現代碼時使用的是:https://github.com/eriklindernoren/PyTorch-GAN/tree/master/implementations WGAN_GP中寫的GP方法。
4.1網絡結構
1.G網絡帶BN,D網絡不實用Batch normalization, 轉而使用 layer Normalization
2.clip 會使優化變得困難,懲罰D網絡的梯度,使其不至于太大
3.在cifar-10 數據集合上D和G都使用resnet 結構
4.2實驗結果
WGAN-GP能看出來一個輪廓,算是比較好的一個視覺效果了。
本人用pytroch 復現WGAN_GP ,參考了作者梯度懲罰的源碼(https://github.com/igul222/improved_wgan_training.)主體代碼是在WGAN的基礎上(https://github.com/martinarjovsky/WassersteinGAN),注釋了CLIP部分的代碼,在D損失函數的計算上增加了梯度懲罰項目(計算方式參考了網上的實現博文)。雖然生成的圖像視覺指標輪廓不錯,但是IS曲線(與baseline-WGAN 相比)并沒特別的優勢。
現在WGAN實現的時候,D網絡的更新次數在100/5之間切換,直接換成5 試一試
倉庫:https://github.com/caogang/wgan-gp (1000star)是pytorch復現的WGAN_GP具體效果沒有考察。
// 梯度懲罰的計算法函數
def compute_gradient_penalty(D, real_samples, fake_samples):"""Calculates the gradient penalty loss for WGAN GP"""# Random weight term for interpolation between real and fake samplesalpha = torch.Tensor(np.random.random((real_samples.size(0), 1, 1, 1))).cuda()# Get random interpolation between real and fake samples# print(real_samples.size(),fake_samples.size())# interpolates = (alpha * real_samples + ((1 - alpha) * fake_samples)).requires_grad_(True)interpolates = (alpha * fake_samples + ((1 - alpha) * real_samples)).requires_grad_(True)d_interpolates = D(interpolates)# d_interpolates = d_interpolates.resize(d_interpolates.size()[0],1)fake = Variable(torch.Tensor(real_samples.shape[0], 1).fill_(1.0), requires_grad=False).cuda()# Get gradient w.r.t. interpolatesgradients = torch.autograd.grad(outputs=d_interpolates,inputs=interpolates,grad_outputs=fake,create_graph=True,retain_graph=True,only_inputs=True,)[0]gradients = gradients.view(gradients.size(0), -1)gradient_penalty = ((gradients.norm(2, dim=1) - 1) ** 2).mean()return gradient_penalty
...
// 判別器的損失函數的計算
gradient_penalty = utils.compute_gradient_penalty(netD,inputv_real,inputv_fake)
gradient_penalty *= lambda_gp
gradient_penalty.backward()
errD = errD_real - errD_fake - gradient_penalty
optimizerD.step()
d_iterations += 1
5.WGAN-SN
文章:https://arxiv.org/pdf/1802.05957.pdf
代碼:https://pytorch.org/docs/stable/generated/torch.nn.utils.spectral_norm.html?highlight=nn%20utils%20spectra#torch.nn.utils.spectral_norm,pytorch 官網上實現了D網絡參數譜正則化的代碼,直接在定義層的時候調用就可以了。
5.1網絡結構
D卷積結構,沒有BN
G卷積結構+BN
(沒有LN的情況)
5.2實驗結果
cifar-10 上的結構,雖然也只能是看一個大致輪廓,但是,效果還是比較好的。
小結
1.BN 在mini-batch 較小或者RNN等動態網絡里效果不好,因為少量樣本的均值和方差無法反應整體的情況。BN強調了mini-batch 樣本之間的聯系。D網絡本身是將一個輸入映射到一個得分輸出,不應該考慮樣本之間的聯系,所以不應該使用BN,在WGAN-GP中轉而使用layer-normalization,對同一個樣本的各個通道做歸一化。
2.網絡越深,其生成能力越強,WGAN-GP論文中cifar-10 IS可以達到7左右,WGAN-Sn中也可以達到6.41,都是因為網絡結構不同,所以在淺層只有卷積的G(DCGAN,WGAN)想要達到那么高的IS一般是不可能的。
3.嘗試人臉生成數據集合the Toronto Face Database (TFD)
4.整理一下各個實驗的G訓練次數。
5.stack gan 的網絡結構基本還行。在做GP實驗的時候,至少得吧BN該成LN,再看看SN中是如何做的。
涉及WGAN的論文總共三篇:
WGAN前作:Towards Principled Methods for Training Generative Adversarial Networks
論文鏈接:https://arxiv.org/abs/1701.04862
WGAN:Wasserstein GAN
論文鏈接:https://arxiv.org/abs/1701.07875
WGAN后作:Improved Training of Wasserstein GANs
論文鏈接:https://arxiv.org/abs/1704.00028v3
都是神人Ishaan Gulrajani 寫的,連GAN之父Ian Goodfellow都十分驚嘆WGAN的改進內容。
神員各種類型GAN代碼實現(TensorFlow框架):https://github.com/LynnHo/AttGAN-Tensorflow
這三篇論文理論性都比較強,尤其是第一篇,涉及到比較多的理論公式推導。知乎鄭華濱的兩個論述,Wasserstein GAN最新進展:從weight clipping到gradient penalty,更加先進的Lipschitz限制手法在理論方面已經做了一個很好的介紹。不過對于很多數學不太好的同學(包括我自己),看著還是不太好理解,所以這里盡量站在做工程的角度,理一下這三篇文章的思路,這樣可以對作者的思路有一個比較清晰的理解。