最近看了好多大神的博客之后越来越觉得自己写的简直不忍直视,不过后来发现不找点事情做就天天吃鸡打dota颓废的不行,,,,
这两个月天天搞gan,做了好多实验,有了点感觉,准备写几篇博客,算是一个总结,其中会附上自己做的一些实验,说说图像方面gan存在的问题、主要的模型等等,先从CGAN开始。
gan那篇论文里,作者用mlp的D和G在mnist,tfd,cifar10上做了实验,用卷积的D和反卷积的G在cifar10上做了实验,看上去效果是不错的,但是亲手做过实验的表示,作者很有可能是从几十张中选出了几张能看的,而且就我的实验结果来看,mode collapse的现象还是挺严重的,当然也可能我受制于硬件效果没那么好。文章在future work这一块列出了未来可以做的方向,其中就包括了五个月之后的这篇CGAN,也就是我今天要说的。
先看paper吧,原理上这篇paper其实很简单,就是在原有的gan上加了一个先验y,公式如下:
那么主要的问题就回到了工程上,这里的D和G作者用的都是MLP,结构如下:
原文如下:“We trained a conditional adversarial net on MNIST images conditioned on their class labels, encoded as one-hot vectors.
In the generator net, a noise prior z with dimensionality 100 was drawn from a uniform distribution within the unit hypercube. Both z and y are mapped to hidden layers with Rectified Linear Unit (ReLu) activation [4, 11], with layer sizes 200 and 1000 respectively, before both being mapped to second, combined hidden ReLu layer of dimensionality 1200. We then have a final sigmoid unit layer as our output for generating the 784-dimensional MNIST samples.
The discriminator maps x to a maxout [6] layer with 240 units and 5 pieces, and y to a maxout layer with 50 units and 5 pieces. Both of the hidden layers mapped to a joint maxout layer with 240 units and 4 pieces before being fed to the sigmoid layer. (The precise architecture of the discriminator is not critical as long as it has sufficient power; we have found that maxout units are typically well suited to the task.)
这里的G引入了一个one hot encoder独热编码,其实就是把一个有m个状态的变量变成了m个有两个状态的变量,比如2就是0010000000,5就是0000100000,然后把这个作为输入,经过一层全连接后合并到一起,最后output是784个单元。
而D的话作者采用了maxout,当然作者也说,只需要D有足够的鉴别能力就可以,我采用的是cnn作为D,但是后来我知道了perfect discriminator的问题,现在想想可能对于mnist来说mlp就够了,关于完美鉴别器之后再讲。
以下是作者的实验结果:
接下来作者做了一个比较有意思的,也是工业上可能会有用的,就是利用UGM(user generated metadata)去给图像生成标签,原文说的很复杂,但是说的很专业,贴出来作为参考:“In this section we demonstrate automated tagging of images, with multi-label predictions, using conditional adversarial nets to generate a (possibly multi-modal) distribution of tag-vectors conditional on image features.”
简单讲一下原理,这里的G有两个input,一个是size100的noise,一个是size4096的image feature vector(类比one hot vector),output是word vector,结构是mlp;D的input也是两个,一个是500size的word vector,一个是size1200的image feature vector,输出是一个代表生成数据真假的值。
综上,CGAN提出了一种可以人为控制的生成模型,并从工程上讲了如何去实现。