对于一个依据文字生成图像的问题,我们传统的做法就是训练一个NN,然后输入一个文字,输出对应一个图片,我们希望图片与目标图片越接近越好。
这样做有什么问题?我们来看一下,例如文字:train对应的图片有很多张。例如下面的火车有正面,有侧面的,如果用传统的NN来训练,模型会想让火车长得像左边,又像一个右边的,这样的结果是不好的。模型会想产生多张图像的平均,结果就会很模糊。
Conditional,意思是条件,所以 Conditional GAN 的意思就是有条件的GAN。Conditional GAN 可以让 GAN 产生的结果符合一定的条件,即可以通过人为改变输入的向量(记不记得我们让生成器生成结果需要输入一个低维向量),控制最终输出的结果。
这种网络与普通 GAN 的区别在于输入加入了一个额外的 condition(比如在 text-to-image 任务中的描述文本),并且在训练的时候使得输出的结果拟合这个 condition。
此外如果判别器还是以前的那样的话,肯定是不行的,因为这样训练出来的生成器会无视输入的conditional vector;因为判别器只会看你的图片是不是高质量,所以生成器只要生成高质量就行了,可以完全无视其他input信息。
我们希望的是机器能够按照我们的input产生图片,因此需要变形。此时的判别器的输入只看生成器的输出,还要看conditional vector。这时候判别器有两个任务:
上图的火车的例子中:
首先随机初始化,然后进行下面迭代:
训练判别器:(固定生成器)
然后训练生成器:(固定判别器)
具体设计条件GAN判别器,有两种方式:
图片x经过一个网络变成一个code,一句话经过网络也变成一个code;把这两种code组合在一起丢到网络里面,输出一个数值。
首先让图片经过一个网络,输出一个分数(用于判断图片是否真实),同时这个网络也输出一个code,这个code和一句话结合起来丢到另外一个网络里,也输出一个分数(图片和文字是否匹配);其实两种分数拆开比较合理
这两种方式,前者更为常用,但李宏毅老师认为后者更加合理,它用两个神经网络分别对输出结果的质量以及条件符合程度独立进行判别。
正如我们前面的算法中所提及的,Conditional 的训练和其它 GAN 不同,它需要三种样本:
学生做的效果:
上图中,根据我们选择的头发颜色以及眼睛颜色的不同,GAN生成的头像的具体特征也会不同。
对于现有模型GAN来说,要实现高分辨率并不容易,首先,简单的在GAN模型中添加更多的上采样层用于生成高分辨率图像(例如,256×256)的方法通常导致 训练不稳定并产生无意义的输出,如下图所示:
除此,GAN 生成高维图片的主要问题在于,自然图像分布与模型分布在高维空间上几乎不交叠。当要生成的图像分辨率增大时,该问题更加明显。
针对上面的问题,有以下方法来进行解决:
这里提出了一种新的model来解决这个问题:
提出了一种新的叠加生成对抗网络(stackgan),用于从文本描述中合成照片般逼真的图像。它将生成高分辨率图像的困难问题分解为更多可管理的子问题-----解决细节缺失问题,分辨率变高。
提出了一种新的条件增强技术(CA)来稳定条件GAN的训练,同时也提高了条件GAN训练的多样性。
广泛的定性和定量实验证明整体模型设计的有效及单个组件的效果。
整个model分为两个阶段:
这里就不深究了,有兴趣可以看以下文献:
- StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks
- 【GAN ZOO翻译】StackGAN:Text to Photo-realistic Image Synthesis with Stacked GAN 使用堆叠的GAN从文本中生成照片一样逼真的图片
- 论文阅读笔记:StackGAN
设定 conditional 为输入的图片,可以用在黑白转彩色图、手绘转真实图、航拍图转地形图等。
文献 Image-to-Image Translation with Conditional Adversarial Networks
先收集大量的样本:
然后训练模型:
在测试的结果却很模糊,原因在上面有讲:It is blurry because it is the average of several images.
generator会吃一个从分布中抽取的vector和一个input,其中input作为条件,output是一个image。
传统做法中,仅仅使image和真实的image接近,会发现生成的图像比较模糊,即下面第二张图片。这个我们在前面都有提及。
在gan中,discriminator会输入产生的image和input(也就是condition),从而输出一个scalar。
通过算法的迭代,我们的gan可以生成下面第三张图片,看起来很清晰了,很棒了。但是仔细看,图中左上角是不是长个了角,一看,是个烟囱,但是我们的input中并没有这个东东呀,它和我们的真实image有些出入!
因此,单纯的一个conditional gan并不能达到很好的效果。GAN+close是一个好的解决办法!
在GAN+close中,我们对generator生成的image加上限制,要使得生成的image与真实对象越接近越好。通过训练,可以得到下面第四张图片,此时,生成的image不仅清晰而且也基本符合要求了!
给一段声音去掉噪音:
先要有数据,然后训练一个NN,注意这里会直接套CNN。然后使output和真正clean的结果越接近越好。这样做效果当然不好。
这里和上面的image-to-image类似,就不细说了。
可以根据影片的前几帧产生后几帧。conditional 为之前几帧的图片。
当用一个Discriminator来进行评估整个大张的图片的时候会有很多问题:容易overfitting,训练时间长。因此可以用多个Discriminator来进行评估。每个Discriminator检查的区域的大小是超参数。不能太小,例如一个pixel那么整个图片就会糊掉。