【GANs学习笔记】(二十一)InfoGAN

完整笔记:http://www.gwylab.com/note-gans.html
———————————————————————

Part3 GANs在特征提取上的应用

1. InfoGAN

     1.1 InfoGAN解决的问题

       我们知道GANs能实现从先验分布到目标分布的生成过程,通常GANs的输入是先验分布的随机抽样,这意味着GANs的输出也是随机的。现在我们不想让GANs随机生成图片,我们希望通过控制输入的参数去生成特定的图片。我们以手写数字图片的生成为例,我们希望调整输入的参数,从而能控制输出的数字,高度以及形状等。

首先得研究输入的每一个维度对输出的影响,先看下面这张图:

       这是我们在传统GANs上面做的实验,调整输入向量某一维度上的取值,得到了上面的输出。我们发现,随着输入的逐渐变化,输出的结果是变来变去且非常跳跃的,比如一开始输出7,随着调整又变成输出0,接着又变成输出7,似乎非常没有规律可言。

       为什么会出现这样的情况?为了直观地解释,我们假设输入的向量只有二维,我们本来希望输入向量对应的特征分布是下面这样的:

       因为如果是这样分布的话,改变一个参数对应输出图像的变化是非常规律的,我们就能非常有效地控制输出。但是实际上,因为GANs强大的拟合能力,它学习到的输入向量对应的特征分布可以非常复杂,就像下图这样:

       在这种情况下,输出图片的某个特征是由输入的很多维控制的,我们想要通过调整输入去控制这些特征就非常困难。为了解决这种问题,InfoGAN被提出了。

     1.2 InfoGAN的原理

       传统GANs的问题就是输入的向量对于输出的影响不明确,那现在我们人为地要求输入地向量对于输出的影响必须明确。InfoGAN的做法就是,把输入的向量z拆分成子向量c和子向量,其中子向量c就是明确地要对输出产生影响的部分。换言之,所有的输出都要受到c的影响,也就是所有的输出都含有c的信息,这等价于所有的输出都能通过一个classifier提取出原始的c的信息,如下图所示。

       上图的这个结构,类似于一个auto-encoder结构,它保证了所有的输出x都直接受到向量c的影响。但是这样的结构,不能够保证输出图像x的真实度,因此必须还得增加一个discriminator。这个discriminator同时也能防止generator的作弊行为:直接原封不动地把向量c放在输出x当中,这样classifier就能直接提取出信息c;因此增添discriminator是必要的。最终InfoGAN的结构图如下图所示:

       其中classifierdiscriminator因为是同一个输入,最初的几层layer可以参数共享。另外值得一提的是,这个向量c是个很神奇的存在,它的维数完全由人自己定,这取决于我们希望最终图片x被划分为多少类,那我们就用多少维的参数去决定。但是被划分的每一类具体长什么样,这完全是由generatorclassifier共同学习的,不过我们能够确定的是,最终得到的分类,一定是在特征差异最大的地方做的划分。

       为了理解向量c的作用,我们看一下InfoGAN在手写数字图片生成上的实验结果。

 

     1.3 InfoGAN的实验结果

       这是改变向量c的第1维产生的生成结果,我们发现,第1维的功能就是直接决定生成的数字;同时也符合,第一维是在特征差异最大的地方做划分的结果

       这是改变向量c的第2维产生的生成结果,第2维的功能是决定生成数字的倾斜角度。

       这是改变向量c的第3维产生的生成结果,第3维的功能是决定生成数字的粗细程度。

       综上,InfoGAN确实可以对生成结果作出稳定的划分,并且能通过控制输入去产生特定的输出结果。

猜你喜欢

转载自blog.csdn.net/a312863063/article/details/83575933