李宏毅 HW6 作业及WGAN解析

HW06

代码

任务描述: 用GAN来生成卡通人物头像。

sample code 使用DCGAN,网络框架如下,训练也像正常训练GAN一样
李宏毅 HW6 作业及WGAN解析_第1张图片

WGAN

这个是本次任务的核心内容,GAN其实是不太好训练的,WGAN可以让这个过程变的容易一下。我大致阐述一下我关于WGAN的理解,具体的更详细的解释建议看李宏毅老师的课程。这部分讲的真的很好。
GAN的目的就是训练一个生成器,能够生成图片以假乱真,GAN用JS divergence 来衡量生成图片和真实图片之间的距离,生成器的目标就是要最小化这个距离,但是使用JS divergence会遇到一个问题,如下图:
李宏毅 HW6 作业及WGAN解析_第2张图片
当生成数据 P G P_G PG和真实数据 P d a t a Pdata Pdata完全没有重合的时候,它们的KL divergence始终为最大值log2,但是我们可以观察到图一和图二生成数据和真实数据的相似度显然不一样,这也就说明了KL divergence不能用来衡量生成数据与真实数据的相似程度了。同时,在这种情况下,Discriminate会很容易区分真实数据和生成数据(因为它们没有重叠,非常容易找到一条线将它们分开),并且在之后的迭代过程中就不会更新了(因为loss始终为-log2),那么Discrimate的正确率始终为1,你也不知道GAN训练的好坏。(一个好的GAN的Discriminate的正确率应该为0.5左右)。
既然一切的问题都是由JS divergence引起的,那么换个度量不就行了吗?
WGAN的想法正是如此。WGAN 使用Wasserstein distence作为生成数据和真实数据之间的距离度量。
这个度量在其没有重叠时也会根据它们的分布给出距离。然后是代码实现,因为若完全实现Wasserstein distence的话,计算量太大,因此一般实现WGAN是在原有的基础上应用四个技巧就可以模拟实现WGAN。如下:
李宏毅 HW6 作业及WGAN解析_第3张图片
体现在hw6的代码里面表现如下:
1. 去掉判别器最后一层的sigmoid层
李宏毅 HW6 作业及WGAN解析_第4张图片
2. 计算损失函数的时候不要加上log。
在这里插入图片描述
3. 将判别器的参数限制为两个常数之间的范围内。clip_value=0.01
. 在这里插入图片描述
4. 使用RMSProp 或者 SGD作为optimizer。
李宏毅 HW6 作业及WGAN解析_第5张图片

实验结果

不知道为什么JudgeBoi上我的得分刷新一下就会变,很不可靠,所以给大家看一下生成效果吧。
李宏毅 HW6 作业及WGAN解析_第6张图片

你可能感兴趣的:(深度学习,人工智能,机器学习)