先要深刻理解GAN!

CGAN(Conditional Generative Adversarial Nets, 条件生成-对抗网络)。借用原论文中的图如下:

想一想,再GAN中我们哪里使用了“类别”

在GAN中,我们求损失函数的时候用到了“类别”,因为二分类器输出的是正样本的几率值(或概率值),所以这里“类别”就用来作为判断用,如果是类别1,计算log(D(xj))log(D(x_j))log(D(xj​));如果是类别0,计算log(1−D(xj))log(1-D(x_j))log(1−D(xj​))。

在CGAN中,我们将样本的“类别”也作为特征输入。比如对于mnist数据集,其label的shape=(64,10),也就是有10类(0~9),在GAN中我们输入判别器的一个Batch是shape=(64,28,28,1),那么在CGAN中,我们输入的是shape=(64,28,28,11)。在GAN中我们输入生成器的一个Batch是shape=(64,62),那么在CGAN中,我们输入的是shape=(64,72)。—这一过程就是在生成模型GGG和判别模型DDD中均引入条件变量y(conditional variable y),这就是CGAN中"C"的含义所在,即一种带条件约束的GAN。

注意:在GAN我们说是的类别是二分类器分类的类别,只有0、1两类。而在CGAN中,添加到生成器和判别器中的是样本类别,可能会有很多类,而不再是2类。此外,CGAN中在计算损失函数的时候也同样用到二分类器分类的类别。

那么将样本标记考虑进去的好处是什么,或者会产生什么影响?

我们先来从直观上感受下:


对于mnist数据集中的1,在GAN的判别器中我们输入的是这样的:

在CGAN的判别器中我们输入的是这样的:

可以看到,CGAN中的输入比GAN中的输入更加有特点:第1阶后10个元素都是相同的。另外,对于数字1,即使是不同的图片,它们第1阶后10个元素都是相同的。那么我们可以这么说,在CGAN中让判别器学习数字1,就是在固定第1阶后10个元素的条件下学习第1阶第1个元素,这句话转成数学表达式就是:x∣yx|yx∣y;同理,生成器的输入可以表示为:z∣yz|yz∣y。于是,就有了原论文的损失函数表达式:

CGAN的损失函数:
V(Gmin,Dmax)=Ex∼Pdata(x)[log(D(x∣y))]+Ez∼Pz(z)[log(1−D(G(z∣y)))]V(G_{min},D_{max})=\Bbb E_{x\sim P_{data}(x)}[log(D(x|y))]+\Bbb E_{z\sim P_z(z)}[log(1-D(G(z|y)))]V(Gmin​,Dmax​)=Ex∼Pdata​(x)​[log(D(x∣y))]+Ez∼Pz​(z)​[log(1−D(G(z∣y)))]

GAN的损失函数:
V(Gmin,Dmax)=Ex∼Pdata(x)[log(D(x))]+Ez∼Pz(z)[log(1−D(G(z)))]V(G_{min},D_{max})=\Bbb E_{x\sim P_{data}(x)}[log(D(x))]+\Bbb E_{z\sim P_z(z)}[log(1-D(G(z)))]V(Gmin​,Dmax​)=Ex∼Pdata​(x)​[log(D(x))]+Ez∼Pz​(z)​[log(1−D(G(z)))]

对比GAN的损失函数,CGAN将输入变成基于样本类别条件下的xxx和zzz。

# output of D for real images D_real((64,1),介于(0,1)),D_real_logits未经历过sigmoid,_临时存储net(64,1024)
D_real, D_real_logits, _ = self.discriminator(self.inputs, self.y, is_training=True, reuse=False)# output of D for fake images G为由噪声z(64,62)生成的图片数据(64,28,28,1)
G = self.generator(self.z, self.y, is_training=True, reuse=False)
# D_fake((64,1),介于(0,1)),D_fake_logits未经历过sigmoid,_临时存储net(64,1024),送入鉴别器的是G生成的假的数据
D_fake, D_fake_logits, _ = self.discriminator(G, self.y, is_training=True, reuse=True)# get loss for discriminator
# 它对于输入的logits先通过sigmoid函数计算,再计算它们的交叉熵,但是它对交叉熵的计算方式进行了优化,使得结果不至于溢出
# tf.ones_like的使用默认交叉商前面的系数为1数组
# d_loss_real=-log(sigmoid(D_real_logits))等价于d_loss_real=-log(D(x))
d_loss_real = tf.reduce_mean(
tf.nn.sigmoid_cross_entropy_with_logits(logits=D_real_logits, labels=tf.ones_like(D_real)))
# d_loss_fake=-log(sigmoid(D_fake_logits))等价于d_loss_fake=-log(D(G(z))
d_loss_fake = tf.reduce_mean(
tf.nn.sigmoid_cross_entropy_with_logits(logits=D_fake_logits, labels=tf.zeros_like(D_fake)))
# d_loss为生成器和鉴别器传出的loss之和
self.d_loss = d_loss_real + d_loss_fake# get loss for generator
# g_loss=-log(sigmoid(D_fake_logits))等价于g_loss=-log(D(G(z))
self.g_loss = tf.reduce_mean(
tf.nn.sigmoid_cross_entropy_with_logits(logits=D_fake_logits, labels=tf.ones_like(D_fake)))

如果我们参考代码实现,会发现原论文中CGAN的损失函数表达的并不准确,确切的说应该是这样的:
V(Gmin,Dmax)=Ex∼Pdata(x)[log(D(x∣y))]+Ez∼Pz(z)[log(1−D(G(z∣y)∣y))]V(G_{min},D_{max})=\Bbb E_{x\sim P_{data}(x)}[log(D(x|y))]+\Bbb E_{z\sim P_z(z)}[log(1-D(G(z|y)|y))]V(Gmin​,Dmax​)=Ex∼Pdata​(x)​[log(D(x∣y))]+Ez∼Pz​(z)​[log(1−D(G(z∣y)∣y))]

其中,D(x∣y)D(x|y)D(x∣y)、G(z∣y)G(z|y)G(z∣y)、D(G(z∣y)∣y))D(G(z|y)|y))D(G(z∣y)∣y))都是指在给定类别条件下的条件概率。

举个例子:
如果我说两只眼睛一张嘴的是什么?你肯定会想到很多。但是如果我说两只眼睛一张嘴的人,你的脑海里出现的就只是人了,而不会有牛头马面。所以加了类别,就是加了约束项,就是加了基本限定条件。

总结:
除了将样本类别作为作为生成器和判别器的输入为,CGAN与GAN在其他方面没有区别,代码实现上亦是。

,使用额外信息y对模型增加条件,可以指导数据生成过程。这些条件变量y可以基于多种信息,例如类别标签,用于图像修复的部分数据[2],来自不同模态(modality)的数据。如果条件变量y是类别标签,可以看做CGAN 是把纯无监督的 zGAN 变成有监督的模型的一种改进。这个简单直接的改进被证明非常有效,并广泛用于后续的相关工作中[3,4]。Mehdi Mirza et al. 的工作是在MNIST数据集上以类别标签为条件变量,生成指定类别的图像。作者还探索了CGAN在用于图像自动标注的多模态学习上的应用,在MIR Flickr25000数据集上,以图像特征为条件变量,生成该图像的tag的词向量。

生成模型经典网络之CGAN剖析相关推荐

  1. 人大李崇轩:我的生成模型修炼之路丨智源大会嘉宾风采

    导读 AIGC的飞速发展离不开生成模型.深度学习以及多模态学习等领域研究的不断累积,其中生成模型的原理与算法发展是不可或缺的一部分,如:生成对抗网络 GAN 及其一系列变体.变分自编码器 VAE 及其 ...

  2. 【生成模型】解读显式生成模型之完全可见置信网络FVBN

    上一期为大家说明了什么是极大似然法,以及如何使用极大似然法搭建生成模型,本期将为大家介绍第一个显式生成模型完全可见置信网络FVBN. 作者&编辑 | 小米粥 1 完全可见置信网络 在完全可见置 ...

  3. 生成对抗式网络 GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN等原理介绍、应用介绍及简单Tensorflow实现

    生成式对抗网络(GAN,Generative Adversarial Networks)是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的方法之一.学界大牛Yann Lecun 曾说,令他最激 ...

  4. 综述 | 语义分割经典网络及轻量化模型盘点

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 基于图像的语义分割又被理解为密集的像素预测,即将每个像素进行分类, ...

  5. 一文总结图像生成必备经典模型(一)

    本文将分 2 期进行连载,共介绍 16 个在图像生成任务上曾取得 SOTA 的经典模型. 第 1 期:ProGAN.StyleGAN.StyleGAN2.StyleGAN3.VDVAE.NCP-VAE ...

  6. 【轩说AI】生成模型(2)—— GAN生成对抗网络 + WGAN + Conditional GAN + Cycle GAN

    文章目录 GAN生成对抗网络(Generative Adversarial Network) 神经网络的本质就是一个函数,一个用于拟合的函数 生成模型面临的前所未有的问题 GAN解决这一问题的思想 O ...

  7. 生成对抗式网络 GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍

    一.GAN原理介绍 学习GAN的第一篇论文当然由是 Ian Goodfellow 于2014年发表的 Generative Adversarial Networks(论文下载链接arxiv:[http ...

  8. 花书+吴恩达深度学习(二八)深度生成模型之有向生成网络(VAE, GAN, 自回归网络)

    文章目录 0. 前言 1. sigmoid 信念网络 2. 生成器网络 3. 变分自编码器 VAE 4. 生成式对抗网络 GAN 5. 生成矩匹配网络 6. 自回归网络 6.1 线性自回归网络 6.2 ...

  9. 玻尔兹曼机、深度信念网络、编码器等生成模型

    受限玻尔兹曼机 -训练方式:对比散度方法(示例代码如下,原博客为https://blog.csdn.net/slx_share/article/details/92072228?ops_request ...

最新文章

  1. mysql操作数字名称的schema时字符的逃逸问题
  2. Map Reduce Shuffle
  3. Nature:复杂菌群空间分布研究
  4. 深度学习项目实战-关键点定位视频课程
  5. 解决使用requests_html模块,req.html.render()下载chromium速度慢问题
  6. css鼠标悬停样式_利用Css3样式属性Cursor来更换自定义个性化鼠标指针(光标
  7. 在apache中设置访问目录后进入的默认页面为index.php
  8. HQL写topN、Spark写topN
  9. Z-Stack Home Developer's Guide—2. Overview中文翻译【Z-Stack Home 1.2.0开发文档】
  10. 从产品角度谈如何搞定主动用户与被动用户
  11. 【Web API系列教程】3.10 — 实战:处理数据(公布App到Azure App Service)
  12. latex在行末出现百分号的作用
  13. 使用Rust库bindgen之Hello World(附代码)
  14. 产品案例分析 - 华为软件开发云
  15. landesk 卸载_landesk怎么卸载,软件卸载不了怎么办
  16. Mac键盘符号说明(全)
  17. opencv img.shape
  18. Photoshop技巧:[2]如何抠头发?
  19. 华人泰斗黄煦涛逝世,贤伉俪深情六十载
  20. java图片编辑器,Java图片编辑工具thumbnailator

热门文章

  1. libed2k源码导读:(一)从ed2k链接开始
  2. Winform 窗体控件最大化自适应
  3. 22-Excel与数据分析
  4. python+django网吧会员管理系统
  5. Android音视频开发入门指南
  6. 计算机程序设计员国家职业资格三级操作技能考核试卷-带实际操作答案
  7. html加载m3u8
  8. 电脑上写一天工作汇报表时用哪个办公便签软件?
  9. GIS坐标系统(二):地理坐标
  10. 共发射极放大电路---工作