【深度视觉】第十六章:生成网络4——条件GAN之cGAN、SGAN、ACGAN、infoGAN、LAPGAN

(四)条件GAN (Conditional Generative Adversarial Nets)

前面我们讲的GAN基本都是围绕着对GAN的优化而诞生的架构,比如DCGAN就是在架构上进行了改进,而LSGAN、WGAN都是在目标函数上进行了改进。现在我们讲条件GAN,是GAN在实现任务上的改进,比如我们想控制一下我们的期望输出,此时就得使用条件GAN

1、cGAN

cGAN是条件GAN中最早诞生的,当时原论文里它的架构还用的是全连接层搭建的,当然现在我们一般都用卷积层搭建了。

cGAN它是把样本标签和噪声z一起喂入生成器,生成器生成假图片,然后真假图片一起再喂入判别器。它和普通GAN的唯一区别就是不再是仅仅输入随机数z,而是把标签信息也变形成和z一样的结构,和z一起输入生成器,其他部分都一样一样的。

cGAN相对于普通GAN的优点是:   

一是效果要好。因为增加标签信息总好过仅仅输入随机数z强吧,所以效果要好。

二是可以指定生成的图像。比如标签0代表猫,标签1代表狗,标签3代表牛,那我想生成狗图像,那我就输入1加一个随机数,就生产了狗的图片,这样我对输出就可控了。

(1)如何将标签加入z?

cGAN就是把标签也作为输入数据喂入模型。这里的标签指的是真实数据的真实标签,比如mnist数据集,真实数据的真实标签就是123456789这10个数字。那如何把这个标签信息喂入模型?比如mnist数据集的图片尺寸是28x28,那就把这10种标签都映射成10个28x28维度的随机数,然后当作一个通道数据和标签是这个标签的图片数据一起喂入判别器。然后再把这10种标签也映射成喂入生成器的噪音的数据结构,联合噪音一起输入生成器。具体下面有示例。

那把标签都输入模型了,那模型的输出就是在知道标签的条件下的预测结果,所以生成器的输出结果和判别器的预测结果,就都是一个条件概率了。所以cgan的损失函数和普通的gan的损失函数其实是一样的。就是cgan的损失函数可以用普通gan的损失函数来表示。

  • 知识点:embedding技巧

将标签中每一个数字升维成图像的数据结构,实际中有很多升维方法,但是最常用的是embedding方法, NLP中的word embedding就是词嵌入技巧。我们还有Image Embedding 、Audio Embedding。 embedding其实就是一种映射方式。但是在模型训练过程中,空间中的随机数可以像权重那样被迭代更新。

(2)实现一个cGAN案例

在cgan论文中,作者并没有给出详细的生成器和判别器的架构。大概作者的意思就是只要把标签输入架构就行了。所以后来人们写的cgan,都是基于自己的理解写的。比如大部分架构选择在输入层加入标签,而也有部分架构选择在使用了数个卷积层后再加入标签,只要将标签embedding到特征图尺寸就可以顺利拼接到 特征图中了。再比如有的架构会选择把噪音z和标签y输入后,先使用少数几个线性层对噪音进行处理,或者先使用embedding对标签y进行处理后,再用几个线性层把y处理成和z相同格式后再进行合并。本次我们实现的 cgan架构参考下面这个架构:

该架构使用的输入图像数据结构是(1,28,28),标签是十分类。实现代码如下:

效果虽然也差强人意,但是毕竟我也只是训练了10个epochs,我想再多训练训练,效果应该更好一点。而最大的亮点就是我是按照0123456789的顺序生成的!

2、SGAN

下图是SGAN的架构和伪代码:

从架构图上看,SGAN的输入依旧是随机数z,但是SGAN把类别信息加到真数据里面了。就是,当真数据和假数据一起送入判别器后,让判别器输出11个类别(假+10种真数据的类别)。

SGAN的思想是:当判别器的分类能力越强时,也就是判别器对类别分类的越好时,说明判别器对不同类别的特征的提取就更强。那反过来看,这些分类能力越强的特征对生成器的帮助就更大。所以SGAN最大的特点就是把分类任务判别真假任务合并到一起了。所以SGAN的判别器不仅有判别真假样本的能力还有分类真样本的能力。

实际上,SGAN的生成器其实是和类别无关的,因为生成器的输入还是随机数z嘛,但是SGAN的效果要比普通GAN好一些,就是因为判别器的改进,才是生成器也跟着强了起来。

3、ACGAN

在实际中,我们应用得最多的还是ACGAN,这个构建是我们实际中最常用的一个构架。ACGAN也像是cGAN和SGAN的综合:

ACGAN的输入:它是把类别信息不仅添加到噪声z中,和噪声z一起喂入生成器;还把类别信息也添加到真样本中和真样本合并后,再和假样本一起送入判别器判别。就是ACGAN的真样本里面有标签信息,假样本里面也有标签信息!

ACGAN的输出不在是真假和类别混合在一起输出了,而是有两个输出,一个输出是真假,另一个输出是样本的类别(就是不管是真样本还是假样本都要判断它的类别!)。

Ls损失就是:“真样本判别为真,假样本判别为假”的损失,和我们普通GAN的损失是一样的,它是训练判别器对真假样本的判别能力:BCELoss(真样本,1)+BCELoss(假样本,0)。也所以-Ls就是训练生成器生成以假乱真的假样本的能力,也是和普通GAN的损失一样:BCELoss(判别器对假样本的判别结果, 1)。

Lc表示分类损失。

所以,ACGAN的输入和输出都有图片类别的,这样我们就可以指定类别的让它给我们生成图片了,所以这个架构实际中应用的比较多。   

4、infoGAN

infoGAN是一个最有趣的网络,我们先看看infoGAN能做什么?

从上图的架构图上看,infoGAN的架构其实没啥与众不同的。它的输入是一个信息c+噪声z;它的输出是真假分类+信息c。
信息c,原论文中是给的一个三维的向量,比如c=[c1, c2, c3],其中,c1=[0,1,2,3,4,5,6,7,8,9],c2=[-30度,+30度],c3=[1, 20]。意思就是c中的第一个维度表示我想要生成哪个数字,第二个维度表示我想要生成的数字左旋转多少度、右旋转多少度,第三个维度表示我想要生成的数字粗细度,就是上图的手写数字的效果,当然你可以自己定义你的c,比如上图的右变人脸数据集上的效果。

从架构上看infoGAN没啥新奇的地方,但新奇的地方是它的思想:就是它希望改变不同的c,加上一个噪音z就可以生成不同的图像。就是我调整c可以准确地得到我想要的东西。比如我想要一个右斜15度、粗细是10的数字6,那我就可以把c=[6,15,10] + z 一起喂入生成器,生成器就给我生成右斜15度、粗细是10的数字6!
但是,从架构上看c是一个隐变量,就是说c不是我们指定的,c是网络学习学出来的!也就是比如第一维度的数字是有10种情况,但不是0一定对于的就是数字0,1就一定对应的是数字1,但不管它是如何对应的,最后还是这10个数字,所以穷尽所有c的可能性后,最后我们人类看到的结果就好像是连续的,但实际上c是个隐变量,不是我们指定的,是网络自己学的,是一个无监督的学习过程。

为什么能无监督学出来c呢?其实在infoGAN架构中,噪声z是复杂生成图像的。隐变量c我们又称为c码,这个c码经过生成器变成了一张图像,这张图像再经过判别器又重构回了c码,这和我们AVE挺像的。所以这个过程中,就需要生成的假图片要和它对应的c码有极大的互关联,只有这样才能重构c码呀。所以infoGAN的损失函数除了有"把真判为真,假判为假"的损失,还有一个损失就是假图片与c码之间的互信息,这个互信息越大越好。这样我生成的图像就和它的隐变量之间有很大的关联关系,这样我才能重构出c码,这样c码就和输出图像相关了。这样我们就可以控制生成了,我们可以按照我们想要的结果去生成图片了。也就是我们控制c的每个维度就会有了明确的物理意义。

(五)条件GAN的应用

1、LAPGAN:生成高质量图像

条件GAN的第一个应用就是拉普拉斯GAN。拉普拉斯GAN肯定是要用到拉普拉斯金字塔了,我的这篇博文:【OpenCV】第十一章: 图像金字塔_图像金字塔的作用-CSDN博客 里面有对拉普拉斯金字塔的直观描述和案例,不熟悉的同学可以查阅。

拉普拉斯GAN的思想就是:之前的GAN都是从一个随机数上采样-上采样,,,就生成生成一张图了,这种形式中间的损失太大了,效果不是太好,那我能不能从一个随机数先生成一个小图,小图再生成中图,中图再生成大图,,,,这样一步步生成我想要的图像,每步我都有一个生成器,就变成一个序列生成的过程,也就是一个级联的过程了:

上图就是有4个生成器级联起来的生成器,其中G3喂入的是一个随机数z3,生成的是一个小图I3飘,把I3飘上采样得到I2,然后把I2和噪声z2一起喂入生成器G2,生成h2飘(是差异图,就是拉普拉斯图),h2飘再和I2相加变成I2飘,I2飘再上采样得到I1,I1和一个随机数z1喂入G1,生成h1飘,,,,如此级联生成

训练的时候也是逐个训练的:比如h0飘就是生成器G0生成的差异图(就是生成图I和I0之间的差异图),标答就是h0(也是一个差异图,是训练数据中原图和I0之间的差异图),h0是1,h0飘就是0,然后让判别器判别。

训练的时候我是先训练G0,再训练G1,,,,都训练完毕了,我串联起来用,下图是LAPGAN的效果:

2、"文本到图像"任务

用条件GAN来生成图像,最早的论文是《Generative Adversarial Text to Image Synthesis》,下图是这篇论文给出的架构:

上图的架构写的是DCGAN架构,就是说它的层都是用卷积层和转置卷积层搭建的。但是上面的架构其实是一个cGAN的思路。
上图的任务是:给一个句子,生成一张对应的图片。上图的句子就是:this flower has small,round violet petals with dark purple center,这个句子还对应着一张花的图片。
实现过程是:
第一步:把上面的句子用NLP中的方法编码成一个向量,假如是s=(1, 1, 128)这么一个向量。
第二步:取噪声z。假如z我是从正态分布中随机生成的,z = (1, 1, 100),是这么一个随机向量。
第三步:把s和z进行concat,变成(1,1,228)这么一个输入数据,输入生成器去生成图片。
第四步:把生成的图片喂入判别器,经过一个或者数个卷积层后,比如图片变成了(2,2,64)这种较小的结构后,再把s也变成2x2x128的形状,然后也是concat二者,就是2x2x192,然后再继续往后传播做判别。 所以,从实现过程来看就是cGAN的思路。

后来人们又对这个架构进行了改进:
优化1:判别器不仅需要判别输出图像是真是假,还需要判别出这个生成的图像和文字匹配不匹配。优化后的算法就是:

优化2:让网络学会插值。下图中的t1、t2都是句子的编码,βt1+(1-β)t2,就表示在t1、t2之间进行插值,就是说了一句训练数据集中没有的句子,就也能生成图片。效果如下:

后面人们又觉的用cGAN从文本生成图像的效果还是差了一些,于是又提出类似拉普拉斯GAN的策略:分而治之的策略,就是逐步生成图像———StackGAN

就是后面层重点关注的都是前面层没有搞定的事情,第一个阶段就是从文本大概生成一个小图像即可,图像的细节由后面阶段的网络来修补。stackgan的效果如下:

3、“图像到图像”任务
iGAN

Pix2Pix

CycleGAN

StarGAN

这些以后有机会再慢慢写吧。。。。。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值