生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/XGL1569348/article/details/80994220

生成式对抗网络(Generative Adversarial Networks),这是一个多网络对抗的生成模型,它几乎能在所有深度学习需要生成的场景中得到使用(尤其是图形生成的任务中表现很好)。

这篇文章的主要目的是对这几年基于GAN的各种各种各种模型进行一次简单的思路性综述。(〃’▽’〃)

上图出自GAN Zoo

这里写图片描述

GAN的热度可见一番。


GAN的基础思想

GAN是一类生成模型,和VAE, pixelCNN等生成模型不同的是,GAN引入了NN的对抗环节,来帮助NN生成拟合效果更好的数据。对抗的环节为一个Discriminator NN与一个Generator NN。G的目的为生成拟合效果更好更逼真的数据来骗过D,D的目的为分辨出真实的原始数据和G生成的假数据。如原Paper中打的比方,G是制造假钱的坏人,D是警察专门分辨假钱(“充满暴力与犯罪的例子”)。

原始算法如下:
P d a t a ( X ) 为原数据集的分布, P G ( X , θ ) 为G产生数据的分布。从Maximum Likelihood Estimation开始,G的目标是找到一个最优的 θ 有如下式子

θ = arg max θ i = 1 m P G ( X i ; θ )
= arg max θ log i = 1 m P G ( X i ; θ )
= arg max θ i = 1 m log P G ( X i ; θ )
= arg max θ E x P d a t a [ log P G ( X i ; θ ) ]
= arg max θ P d a t a log P G ( X ; θ ) d x P d a t a log P G ( X ) d x
= arg min θ K L ( P d a t a | | P G )

(注意这里的 X i 是从原始数据集中取样的。)
则得到G的目标就是最小化两者的KL散度。

对于D来说,他的目标函数是

V ( G , D ) = E x P d a t a [ log D ( X ) ] + E x P G [ log ( 1 D ( X ) ) ]

第一项作为正样本的奖励,第二项作为负样本的惩罚,可以看到这个函数有点类似于Sigmoid的cross entropy。
(PS:其实D用Sigmoid做二分类是不合理的,在 P G P d a t a 的overlap太小的时候,D可以很好的区分两类,这两类都在Sigmoid的左右两侧斜率几乎为0的地方,降低训练效率。采用Linear Regression的方式会更优一些。)

继续得到:

V ( G , D ) = [ P d a t a ( x ) log D ( x ) + P G ( x ) log ( 1 D ( x ) ) ] d x

理解为给定一个 X D ( X ) 都能最大化被积分的式子(假定NN能使 D ( X ) 为任意函数)。对被积分的式子进行求导,使导数为0,容易得到 D ( x ) = P d a t a ( x ) P d a t a ( x ) + P G ( x ) (显然为最大值点)。代入 V ( G , D ) ,得到
max D V ( G , D ) = V ( G , D ) = 2 log 2 + P d a t a ( x ) log P d a t a ( x ) ( P d a t a ( x ) + P G ( x ) ) / 2 d x ) + P G ( x ) log P G ( x ) ( P d a t a ( x ) + P G ( x ) ) / 2 d x = 2 log 2 + 2 J S D ( P d a t a | | P G )

所以呢,假如我们现在拥有了一个好的D,那么G上的loss就是两个分布之间的的JS散度。
(PS:用JS散度其实也是不好的,在两个分布都没有重叠的时候,散度项的值是定值,没有办法梯度上升)

对于G来说,则有

G = arg min G max D V ( G , D )
过程理解为下图: 这里写图片描述,D随G变化而变化,选择D最大的那点,再在多个G中选择V最低的那点。

训练D与G的时候,其实就是一个D在给G指路的过程,每个迭代过程中,更新多次D,更新一次G(因为G在更新会导致 P G 分布变化,为防止D认不出G,不能更新太多次G,而且在分布变化的过程中,同时丧失了最小化JS散度的意愿)。

同时训练的时候有一些tricks。
按理来说G的目标是 V = E x P G [ log ( 1 D ( X ) ) ] ,但是训练时换为 V = E x P G [ log D ( X ) ] ,以此提高训练速度。
这里写图片描述

Generative Adversarial Networks


Least Square GAN

Less Square GAN是GAN的一个优化版本。LSGAN解决的问题是,原始D是一个sigmoid二分类器,在D分类效果过好(两个分布解决0或1)的时候,G在跟着D指路优化自身的时候获得的梯度过小,没有办法让两者的分布靠近。在原始的GAN架构中,提出的是减少D训练的次数,防止D分类能力过强,这就对超参的调节提出了很大的要求。

LSGAN将分类的sigmoid输出换成了线性输出,把输出转换成一个回归问题,训练的时候仍然是正样本接近1,负样本接近0。以此优化梯度传递的效果。

Least Squares Generative Adversarial Networks


Wasserstein GAN

在WGAN中,主要的工作是更换了评价两分布接近程度的指标,将JS散度,转换为Wasserstein Distance。

W ( P , Q ) = inf γ Π ( P , Q ) E ( x , y ) γ [ | | x y | | ]

γ 是分布P与分布Q的组合分布,目标为求样本期望距离 | | x y | | 的下界)

我们先尝试形象理解一下Wasserstein Distance是什么,假设我们有两个分布P和D,看做是两种土堆,我们要做的是,把P的土堆,挪成像Q的样子(是不是想起来上一篇文章里说过的histogram matching了),我们要记录的就是把所有土挪动的总距离之和。挪土的方法有很多种,Wasserstein Distance就是其中最小的,也就是最近的。

这里写图片描述

为了求解这个优化规划问题,我们先引入一个Wasserstein Metric帮助理解,这个矩阵就是一个挪土计划表(假装是离散)。这个矩阵的行对应分布Q,列对应分布P。每一行的值代表P里的土被如何分配,每一列的值代表,新土堆里的土由哪些土堆贡献。
这里写图片描述

假设 γ 是最优的计划矩阵。 那么距离就是 W ( P , Q ) = x P , x Q γ ( x P , x Q ) | | x P x Q | |

回到连续的情况下,经过转换后,我们得到的距离如下(别问我怎么转换的,原文说“ the Kantorovich-Rubinstein duality [22] tells us that”。谢谢各位数学家了):

W ( P , Q ) = sup f 1 L i p s c h i t z ( E x P [ f ( X ) ] E x Q [ f ( X ) ] )

所以目标函数成为
V ( G , D ) = max D 1 L i p s c h i t z E x P d a t a [ D ( X ) ] E x P G [ D ( X ) ]

(注意这里没有了原来的log,WGAN的D关注指标成为了一个scalar)

1-Lipschitz是符合lipschitz连续条件的一种,这是一个限制函数梯度的条件,一个比通常连续更强的光滑性条件,定义如下

| | f ( x 1 ) f ( x 2 ) | | K | | x 1 x 2 | |

这里的K常数取1就是1-Lipschitz条件。

原文里并没有追求如何求解保证D符合Lipschitz条件,而是采用了Weight Clipping(if k | | c | | , then k = c)的方式保证有一定的光滑性。

(再从直观的角度想一下,假如我们在原始GAN模型中,对D训练次数过多,就会导致正负样本被准确分类,D的曲线自然也就成为一个一端很高,一端很低,其他地方都是0的东西,自然也是不满足Lipschitz条件。)

WGAN的距离函数的思路被后来绝大部分GAN模型借鉴,减少了超参调节的压力,解决了由于JS梯度导致的梯度消失问题。
Wasserstein GAN


WGAN-GP

WGAN-GP是WGAN的又一次强化版,在WGAN中,我们使用的Weight Clipping方式并不能帮助我们真正实现1-Lipschitz,甚至说逼近效果也不好。

WGAN-GP提出一个加正则项的方法来逼近1-Lipschitz,理想情况下,我们去对D函数每个地方都求导,拿到一个正则项

m a x ( 0 , | | x D ( x ) 1 | | )

但很显然每个地方求导的代价太大,我们就只从 P p e n a l t y 这个分布中去采样 x ,完成以下的目标函数

V ( G , D ) = E x P d a t a [ D ( X ) ] E x P G [ D ( X ) ] λ E x P p e n a l t y [ m a x ( 0 , | | x D ( x ) 1 | | ) ]

那么现在选择一个合适的 P p e n a l t y 成为了一个问题,在原文中,把 P p e n a l t y 取做 P d a t a P G 的“中间分布”,从直觉上认为,因为两个分布是互相靠近的,所以要保证的只有 P p e n a l t y 分布中的D符合1-Lipschitz(“enforcing it …. seems sufficent and experimentally results in good performence”,翻译过来大概是反正就是work了,我就要发论文。)。
这里写图片描述

训练的时候也做了一些玄学trick,惩罚项被设置为 E x P p e n a l t y ( | | x D ( x ) | | 1 ) 2 (看上去像是想让斜率逼近1……

Improved Training of Wasserstein GANs

(PS:其实 P d a t a P G 的逼近过程中,显然不一定是走直线的。也就有后续的文章把 P p e n a l t y 设置为 P d a t a ,证实结果更好。

(btw,ICLR 2018有一个针对完全符合1-Lipschitz的工作:Spectral Normalization for Generative Adversarial Networks


Conditional GAN

CGAN这 GAN模型主要的想法是为GAN的生成过程中添加一个标签Y有监督地作为输出的一个监督参考。我们使D同时接受G的输出和标签Y两个变量,除了要判断G的输出是否realistic,同时要判断输出与Y 是否有关联

目标函数如下

min G max D V ( G , D ) = E x P d a t a [ log D ( X | Y ) ] + E x P G [ log ( 1 D ( X | Y ) ) ]

这里写图片描述

Conditional Generative Adversarial Nets


Cycle GAN

Cycle GAN想要解决的问题是无监督情况下地去实现Conditional GAN的目标。

假如我们一开始的架构和原始GAN类似,首先需要一个 G X > Y ,input图片经过 G X > Y 后生成我们的目标output图片,利用 D 来判别output是否属于原始domain。

在这样的情况下, G X > Y 很容易被训练成为一个只会讨好 D 的生成器,而不注重输出的图是否和输入有关(比如不管input是什么,都输出一张目标domain里的原图)。为解决这样的问题,我们引入一个 G Y > X 将output图片重构恢复成一个 i n p u t 2 ,在此处引入Cycle Consistency Loss的概念,目的是为了计算 i n p u t i n p u t 2 是否足够接近。

直观上进行理解,假如output生成的图片和 i n p u t 关系不大,那么 G Y > X 就没有能力恢复重构出一个和 i n p u t 非常接近的 i n p u t 2

这里写图片描述

Cycle的做法也可以是走一个双向的路径,既然我们训练了 G Y > X ,那么我们完全可以开一条类似的循环生成路径来把目标domain的图片转化为原始domain的图片(如下图)。

L c y c ( G , F ) = E x p d a t a ( x ) [ | | F ( G ( x ) x ) | | ] + E y p d a t a ( y ) [ | | G ( F ( y ) y ) | | ]

这里的 G ( x ) F ( y ) 分别对应前文的 G X > Y G Y > X

这里写图片描述

Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks

(PS:Cycle GAN这样的方法只能说大部分时候是work的,但是毛病也不少,举例NIPS2017的CycleGAN: a Master of Steganography指出Cycle GAN的做法,不能保证output图片中可用于重构input的信息是以原始方式保存的。

如下图的例子,白色的高亮建筑的特点并没有在output中呈现出来,但是 G Y > X 的确完成了恢复重构input的工作。文章认为,这部分的信息被转写隐藏到了图片的其他位置中(Steganography)。
这里写图片描述
这里写图片描述
)


Star GAN

在之前的GAN中,每个G都只能完成一个特定domain到另一个特定domain的转换过程。Star GAN想要做的是,我们训练出来的G可以完成任意多个domain之间的互相转换。

在Star GAN中,我们的D的输入和往常一样,输出有两个,一个是判断 i n p u t 是否真实,另一个是判断input应该属于哪个domain。而我们的G接收两个输入,一个是 i n p u t 图片,另一个是目标domain,输入一个 o u t p u t 图片,这张 o u t p u t 图片除了将被扔入D来帮助D训练外,还将被再次扔入G,去生成一个原始domain的重构图片 i n p u t 2 ,我们再通过比较 i n p u t i n p u t 2 的差距来帮助训练G。(Loss式子的结构都和前文中模型类似,就不写了 )

这里的domain可以是多种类型的独热编码的组合,以此可以表达出多种数据集中的多种特征,一个模型来实现多个生成效果的组合。

这里写图片描述
StarGAN: Unified Generative Adversarial Networks for Multi-Domain Image-to-Image Translation


CoGAN

CoGAN想要解决的问题,也是Unsupervised Conditional GAN。

如下图,假设我们拥有一个两套针对domain X与Y的自动编码机,我们希望的是, E n c o d e r X E n c o d e r Y 能够分别对domain X与Y进行正确的编码,输出的feature也要是同一体系的。假如我们把这两套自动编码机分开训练的话,显然我们不能保证中间橙色部分的feature是相同的表示,这样就会导致Decoder交叉工作时候发生错误。

为了解决这样的情况,我们需要把两个Encoder的末几个hidden layers需要共享参数,从而保证feature的正常表示,两个Decoder的前几层共享参数,从而保证feature的正常读取。

这里写图片描述

基于以上的想法,我们在Generator中的共享参数方式表示如下图。

这里写图片描述
Coupled Generative Adversarial Networks

(基于解决feature分布不同问题的还有很多种方法。例如,我们引入一个额外的 D d o m a i n 来对中间的feature部分进行判断,看这个被encode出来的feature到底是哪个domain里的。如果 D d o m a i n 能够判别出feature的domain信息,说明feature还是依赖了domain信息。我们的训练目标就是使两个domain的input经过encode后能够让$D_{domain}分不出是来自于哪个feature的,这就说明两种feature都是同一分布,也就解决了问题。)


Combo GAN

Combo GAN也是对应Unsupervised Conditional GAN问题。

前面我们提到了feature的分布可能不同的问题,Combo GAN的解决方式是,我们干脆让 i n p u t 经过 E n c o d e r X ,生成 f e a t u r e X ,再经过 D e c o d e r Y 生成一张 o u t p u t Y 图片, o u t p u t Y 再作为 E n c o d e r Y 的输入再次输出一次 f e a t u r e Y ,最后经过 D e c o d e r X 生成 o u t p u t X 图片。通过结算 o u t p u t X i n p u t 的距离来作为一个Cycle Loss。这个思路潜在的思维是,假如我们两个Decoder的输出feature分布是不同的话,那么在 D e c o d e r Y 这一步,图片就会被玩坏,自然就不能够重构出正确的 o u t p u t X

这里写图片描述

ComboGAN: Unrestrained Scalability for Image Domain Translation

(基于图片被玩坏这个猜想,显然 f e a t u r e X f e a t u r e Y 的距离也不会小,这部分其实就是XGAN里提到的Sematic Consistency Loss。)


Patch GAN

GAN后来被实验认为面对大分辨率图像生成的任务中表现逊色,而Patch GAN的想法是让我们拥有多个D,分别观察大分辨率图像的各个局部图片(或语音上的局部),最后综合得到一个scalar。防止训练出来的D过拟合或是训练效率低。

这个判别器的设计思路被Cycle GAN等许多GAN采用。

这里写图片描述
Patch-Based Image Inpainting with Generative Adversarial Networks


Stack GAN

Stack GAN想解决的问题同样是大分辨率图像生成的任务。

它的想法是,在G的生成网络中,采用分级输出的方式,一个 G 1 输出64*64的图片, D 1 来进行评判,我们又拿来一个 G 2 把64*64放大到256*256,再有 D 2 ……通过级联的方式来保证最后大分辨率图像的输出质量。

训练的时候应先训练 G 1 ,再训练 G 1 G 2 的级联,如此循环地进行“套娃”式地训练过程。

这里写图片描述
StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks


fGAN

在原始GAN中,我们已经证明我们实际上作为loss的是两个分布的JS散度,fGAN提出的是我们可以使用f-散度(f-divergence)这类中的任何散度来衡量。

先解释什么是f-divergence:

D f ( P | | Q ) = x q ( x ) f ( p ( x ) q ( x ) ) d x

如上的公式,P、Q是两个分布,p(x)和q(x)是对x取样的概率。在保证f是一个凸函数,且 f ( 1 ) = 0 的前提下,我们就获得一个f-divergence。如下,通过修改 f 我们可以获得任意一个f-divergence。

假设 f = x log x ,代入得到KL-divergence

D f ( P | | Q ) = x p ( x ) log p ( x ) q ( x ) d x

同理假设 f = log x ,我们就得到Reverse KL,假设 f = ( x 1 ) 2 ,我们就得到Chi Square (前文中提到的Least Square其实也可以推出来用的是卡方)。

因为f是一个凸函数,我们先引入共轭函数(Fenchel Conjugate)进行凸优化,共轭函数(针对向量版本)是函数 y T x 和函数f(x)之间差值的上界,同时它自身也是一个凸函数,定义如下

f ( y ) = sup x d o m f ( y T x f ( x ) )

如下图进行直观理解,y是一个常数,我们要求的差值是两条平行线之间在y轴上的距离
这里写图片描述

因为共轭的关系是可逆的,我们得到如下式子

D f ( P | | Q ) = x q ( x ) sup t d o m f [ p ( x ) q ( x ) t f ( x ) ] d x

t是D输出的scalar,我们写作 D ( x ) ,得到
D f ( P | | Q ) max D x p ( x ) D ( x ) d x x q ( x ) f ( D ( x ) ) d x = max D ( E x P d a t a [ D ( X ) ] E x P G [ f ( D ( X ) ) ] )

这时候我们就写出了GAN的对抗形式。

更换散度带来的好处包括解决Mode Collapse问题还有类似的Mode Dropping问题。指假如我们的目标domain Y包含三个子domain a\b\c,但是我们的G只能生成a中的样本,虽然这样的情况下也能够使得我们的loss很小(比如人脸生成任务,G一直生成同一个人的脸),但是这样显然不符合GAN的任务需求。

如下图,绿色虚线是对于不同散度评价下对于蓝色分布一个较好的拟合情况。对于KL散度,G倾向生成一个平均一点的分布,导致了模糊的现象,对于Reverse KL散度来说,G就很容易倾向产生Mode Dropping问题。
这里写图片描述

f-GAN: Training Generative Neural Samplers using Variational Divergence Minimization


Energy-based GAN

EBGAN把Discriminator修改成了一个Autoencoder,把Discriminator输出的scalar设置为Autoencoder的reconstrcution error(MSE来算距离,这在文中称为能量函数)。基于的假设是如果待评判的图片质量不好,那么重构的结果也不好。

这样做最明显的好处就是,因为训练过程中不再需要负样本,我们不再需要去控制D训练的次数幅度,取而代之的Autoencoder可以提前训练好。
这里写图片描述
我们使用了来Autoencoder实现D的功能,训练的方式也有改变,因为reconstrcution error是一个难提升,但很容易降低的值,我们要防止对于错误样本的scalar过低导致惩罚过度。我们需要设置一个超参margin, s.t. if s c a l a r n e g m a r g i n , then s c a l a r n e g = m a r g i n

EBGAN对 L G 增加了一个正则项repelling regularizer,来保证使用Autoencoder作为D的时候,不会发生mode collapse的情况。

f P T ( S ) = 1 N ( N 1 ) i j i ( S i T S j | | S i | | | | S j | | ) 2

S R s × N ,代表从encoder output layer取出的一批样本, f P T ( S ) 计算这批样本内的平均余弦距离,以此作为惩罚。

Energy-based Generative Adversarial Network


Loss-sensitive GAN

LSGAN的主要贡献是在D输出scalar的前提下,我们想让D学会一个loss。

假设我们拥有多个迭代版本的G,我们希望的是,通过不同代G的生成,D也能区分出不同G的生成与目标分布的接近程度。

Loss-Sensitive Generative Adversarial Networks on Lipschitz Densities


Boundary Equilibrium GAN

前面讲了好几个对原始GAN进行优化的思路,比如WGAN系列,fGAN等等,他们的优化思路集中在于改善衡量分布距离的标准。BEGAN提出了另一个优化的方向,并且提出了一个方法来权衡G的生成质量和生成多样性。

在Discriminator上,BEGAN的目标函数和EBGAN一样,不赘述。

BEGAN的直接目标是优化分布的分布误差之间的相似度,而不是分布的相似度。

W ( P , Q ) 2 = inf γ E ( x 1 , x 2 ) γ ( | x 1 x 2 | )

γ 是P和Q的任一组合分布,然后用Jensen不等式得出

inf E ( | x 1 x 2 | ) inf | E ( x 1 x 2 ) | = | m 1 m 2 |

m 是分布的期望。

所以我们就可以直接面向优化 | m 1 m 2 | 了,虽然距离函数来自于WGAN的思路,但是这可比优化1-Lipschitz条件来得简单不知道多少。我们只需要把其中任意一个推高,另一个推低,就可以满足目标。

文章中提出,我们不需要让模型完全收敛到均衡点,我们设置一个超参 γ ,使得

γ = E ( D ( G ( z ) ) ) E ( D ( x ) )

通过调整 γ 我们就可以让D在对真实图片自编码和区分图片这两个任务中间进行取舍。
这里写图片描述

BEGAN的一大优势就是网络结构简单(就是非常单纯地上采样上采样,下采样下采样),降低了训练时对各种trick的需求,什么relu,minibatch,BN全都不需要,而且图像质量被推到了一个很高的水平。

如下图,默秒全了。
这里写图片描述

BEGAN: Boundary Equilibrium Generative Adversarial Networks


Info GAN

对于所有生成模型来说,我们都希望知道input的vector每一个维度代表了什么样的语义,有什么具体的均匀的影响。我们均匀地变化某一维度的值时,我们期待output也是均匀地变化。

InfoGAN的思路是我们在输入的vector中加入多维的c作为一个编码,用来表示具体的语义,其他部分仍然是随机噪音。训练目标就是使得G能够准确输出一个和c有高度相关性的output,所以我们引入一个Classifier来判断output对应的c是什么。原文在目标函数中添加了一项 λ I ( c ; G ( z , c ) ) ,以mutual information(互信息)的方式来评判c与output之间的关系。

I ( c ; G ( z , c ) ) = H ( c ) H ( c ; G ( z , c ) )

H是熵,衡量不确定度。

因为 P ( c | x ) 不好得到,故原文使用变分分布 Q ( c | x ) 来逼近 P ( c | x ) ,通过Variational Information Maximization的方式求出下界。

最后注意让Classifier和Discriminator前几层共享参数(他们的input同一分布)。

最后的效果
这里写图片描述

InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets


VAE-GAN

VAE-GAN是一个把VAE和GAN结合的产物。VAE和GAN同为生成模型,VAE的问题是生成的图片很容易过于模糊,不够realistic,GAN的问题是G不好训练。所以把两者结合起来,互相加强。

如下图中的架构,VAE-GAN相当于把GAN中的G换成了一个Autoencoder,或者说为VAE的output增加一个D来增强监督。
这里写图片描述

encoder的目标是使得z属于一个正态分布(通过KL散度),decoder的目标是欺骗D,AE的目标是降低reconstruction error,D的目标是区分出图片的真假。

Autoencoding beyond pixels using a learned similarity metric


BiGAN

BiGAN应该说是一个利用GAN的思想来帮助训练VAE的模型。在BiGAN中,Encoder和Decoder不再是链接起来训练,而是通过一个Discriminator来监督各自训练。这个Discriminator接受code和image,输出的是输入数据的来源(encoder or decoder)。

x 取样real image, x 取样fake image, z 取样正态分布, z 取样于把 x encode的结果。
D的目的是提高 D ( x , z ) ,降低 D ( x , z ) (其实反过来结果也是一样的)。
Encoder、Decoder的目的是提高 D ( x , z ) ,降低 D ( x , z )

看上去Encoder和Decoder分开训练比较反直觉,但是实际上D还是在做衡量 P ( x , z ) Q ( x , z ) 两分布差异的工作。
这里写图片描述
假如说不采用对抗的方式,我们尝试用z和x各自的reconstruction error来训练的话,其实目标是一模一样的,但是实际上这种思路训练出来的效果不如BiGAN。
Adversarial Feature Learning


Triple GAN

Triple GAN是利用了GAN的对抗思路,完成一个Semi-supervised的任务。首先,Triple GAN的目标是在绝大部分已有数据未打label的情况下训练出一个Classifier。

遮住Classifier先不看,G和D的主要工作思路和cGAN类似。加入的Classifier可以通过已打label的 ( X l , Y l ) 来学习,也可以通过G生成的 ( X g , Y g ) 来学习。同时Classifier为未打label标签进行分类后,这个 ( X c , Y c ) 会帮助D进行学习。
这里写图片描述
Triple Generative Adversarial Nets


本文的所有图片若无注明,均来自原始论文的截图或Hung-yi Lee的Tutorial for Generative Adversarial Network。

笔者只是初学者,若有指出错误万分感谢。

猜你喜欢

转载自blog.csdn.net/XGL1569348/article/details/80994220