专栏首页磐创AI技术团队的专栏50行代码实现GAN | 干货演练

50行代码实现GAN | 干货演练

译者 | 小韩

来源 | Medium

2014年,Ian Goodfellow和他的同事发表了一篇论文,向世界介绍了生成对抗网络(GAN)。通过对计算图和博弈论的创新性组合,他们表明如果有足够的建模能力,两个相互对抗的模型可以通过普通的反向传播进行共同训练。

模型具有两个不同的角色。给定数据集R,生成器G试图创建类似真实数据的假数据,鉴别器D分辨真实数据或假数据,并计算它们的差异。Goodfellow将G比喻为一群伪造者试图创作真实的绘画作品,而D则是试图分辨真假绘画的侦探团队。(除了这个例子,G从没有接触到真实的数据,只有鉴别器D可以看到。)

理想情况下,DG都会越来越好,直到G可以完全模仿真实的绘画,并且D不能分辨真假。

在实践中,Goodfellow展示了G使用真实数据集进行无监督学习,找到某种简单的方式表示该数据。正如Yann LeCun所说,无监督学习才是人工智能真正的“蛋糕”。

这种方法是否需要很多代码才能实现?实际上使用PyTorch,我们可以只用50行代码就可以创建一个非常简单的GAN。一共需要考虑5个部分:

  • R:原始数据集
  • I:输入生成器的随机噪声
  • G:模仿原始数据集的生成器
  • D:辨别器
  • 不断训练G去欺骗D,而D进行分辨。

1.)R:我们从最简单的R - 正态分布曲线开始。该函数输入均值和标准差,返回一个生成样本数据的函数,这些数据使用带参数的高斯函数生成的。我们的代码中平均值为4.0,标准差为1.25。

2.)I:生成器的输入是随机的,但是为了增加一点难度,我们使用均匀分布而不是正态分布。这意味着模型G不能简单地通过转换或缩放得到R,而是必须以非线性方法生成数据。

3.)G:生成器是标准的前向传播图,两个隐藏层,三个全连接层,双曲正切激活函数。GI中输入均匀分布的数据样本,以某种方式模仿R的正态分布,即使它没有接触过R

4.)D:鉴别器与生成器G的代码非常相似。它是有两个隐藏层,三个全连接层的前向图。激活函数是sigmoid。它从RG获取数据,并输出0到1之间的数字,用来表示“真”或“假”。换句话说,这也是一般的神经网络做的事情。

5.)最后,不断在这两个模型之间交替训练:首先使用用真实的数据集训练D分辨真实数据和虚假数据, 然后训练G生成虚假数据欺骗D

即使你之前没有接触过PyTorch也可以大概了解上面代码的运行过程。在绿色部分,通过向D输入真实或虚假的数据,并在D的预测结果和真实标签之间应用交叉熵函数。这是“前向传播”的步骤; 然后调用'backward()'函数计算梯度,调用 d_optimizer.step() 更新D的参数。这里用到了G但没有对它进行训练。

在红色部分,对G做同样的过程。注意我们将G的输出作为D的输入(给伪造者一个侦探进行练习),但不对D进行优化,因为不能让辨别器D学习错误的标签。因此我们只调用 g_optimizer.step()。

上面就是所有的过程。当然还有一些其他代码,但GAN主要就是这5个部分。

经过几千轮的迭代,鉴别器D能力提高的很快(相对来说G提高的比较慢),但是一旦到达某种程度,生成器G就会因为有一个相当优秀的对手并开始迅速的提高能力。

经过5,000轮的训练,每轮都训练了生成器G20次,鉴别器D20次。G输出的均值超过了4.0,但随后回到了正确的范围(左)并稳定下来。同样的,标准差刚开始在较低的位置徘徊,但随后上升到正确的1.25范围(右),和数据集R相同。

最终结果的统计数据和数据集R相匹配。但是分布的形状是否相同呢?毕竟,也有均值4.0,标准差为1.25,但与R不同的均匀分布。看一下G的最终分布:

挺好。右下比左下胖一点,可能偏态和峰度受到了原始数据的影响。

生成器G几乎完美还原了原始数据集R,并且辨别器D几乎无法分辨。这正是我们想要的结果。实现这个一共只有不到50行的代码。

提醒:GAN比较挑剔,而且比较脆弱。当它们进入了某种状态,可能会得到其他奇怪的结果。运行示例代码十次(每次超过5,000轮迭代)后得到了下面十个分布结果:

可以看到十次运行中有八次结果符合分布。但有两次不符合。其中一种情况(第5次运行)出现了凹面的分布,均值约为6.0。最后一次运行结果(第10次运行),在值 -11 处有一个狭窄的峰值!当你在其他环境中使用GAN时,它并不像有监督学习那样稳定。但是当它们正常工作时,它们的效果就非常好。

代码已经整理到了Github上,大家在公众号后台回复“0617”可获取直达链接

本文分享自微信公众号 - 磐创AI(xunixs),作者:小韩

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • “狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作

    GitHub上,这个富有灵魂的项目名吸引了众人的目光。项目诞生一周,便冲上了趋势榜榜首。

    磐创AI
  • 一个完整的机器学习项目在Python中的演练(一)

    磐创AI
  • 三巨头共聚AAAI:Capsule没有错,LeCun看好自监督,Bengio谈注意力

    2 月 7 日,人工智能顶会 AAAI 2020(第 34 届 AAAI 大会)已于美国纽约正式拉开序幕,本届会议将持续到 2 月 12 日结束。受疫情影响,中...

    磐创AI
  • 测开之数据类型· 第3篇《列表推导式、字典推导式、2种方式创建生成器》

    做自动化测试的时候,比如创建个 url 列表,url 列表里面可能是存储了网站的页数:

    清菡
  • 单张图像就可以训练GAN!Adobe改良图像生成方法 | 已开源

    去年谷歌就提出了SinGAN,是第一个拿GAN在单幅自然图像学习的非条件生成模型(ICCV 2019最佳论文)。

    量子位
  • Python yield关键字 和 Generator(生成器)

    Generators functions allow you to declare a function that behaves like an itera...

    Steve Wang
  • 生成器有什么好处?

    在Python这门语言中,生成器毫无疑问是最有用的特性之一。与此同时,也是使用的最不广泛的Python特性之一。究其原因,主要是因为,在其他主流语言里面没有生成...

    GH
  • Python小知识 | 这些技能你不会?(三)

    Python里字典(dict)是一种比较常用的数据结构,基本格式{key : values},key和values可以为任意类型,比如int,str等。

    小小詹同学
  • 对 2018 年 AI 发展预言全中,他们又立了 2019 的 Flag

    「对于 2019 年数据科学、机器学习和人工智能,我们做出了 5 个预测。同时还回顾一下去年做的预测,看看有哪些是真的发生了。 」

    HyperAI超神经
  • 2017余额不足,Python来充值:迭代和生成器

    时光虽然脚步轻轻,但它透过2018却悄然露出了狐狸尾巴,岁月的时钟显示2017已然余额不足。 怎么办呢?继续用Python来充值吧! Python的击出语法里,...

    企鹅号小编

扫码关注云+社区

领取腾讯云代金券