GAN网络通俗解释(图画版)

作者: 阿里云云栖号 | 来源:发表于2018-05-15 10:35 被阅读254次

    摘要: 最通俗的GAN网络介绍!

    在本教程中,你将了解什么是生成敌对网络(GAN),并且在整个过程中不涉及负责的数学细节。之后,你还将学习如何编写一个可以创建数字的简单GAN!

    什么是GAN(插画版介绍)

    理解GAN的最简单方法是通过一个简单的比喻:

    假设有一家商店它们从顾客那里购买某些种类的葡萄酒,用于以后再销售。

    然而,有些恶意的顾客为了获得金钱而出售假酒。在这种情况下,店主必须能够区分假酒和正品葡萄酒。

    你可以想象,最初,伪造者在尝试出售假酒时可能会犯很多错误,并且店主很容易认定该酒不是真的。由于这些失败,伪造者会继续尝试使用不同的技术来模拟真正的葡萄酒,最终才有可能成功。现在,伪造者知道某些技术已经超过了店主的认识假酒的能力,他可以开始进一步生产基于这些技术的假酒。

    同时,店主可能会从其他店主或葡萄酒专家那里得到一些反馈,说明他拥有的一些葡萄酒不是原装的。这意味着店主必须改善他是如何确定葡萄酒是伪造的还是真实的。伪造者的目标是制造与真实葡萄酒无法区分的葡萄酒,而店主的目标是准确地分辨葡萄酒是否真实。

    这种来回的竞争博弈就是GAN网络背后的主要思想。

    生成敌对网络的组成部分

    使用上面的例子,我们可以想出一个GAN的体系结构。

    习图像的哪些区域进行改进/更改,以便鉴别器将难以将其生成的图像与真实图像区分开来。

    生成网络不断生成更接近真实图像的图像,而辨别网络试图确定真实图像和假图像之间的差异。最终的目标是建立一个可生成与真实图像无法区分的图像的生成网络。

    一个简单的Keras生成对抗网络

    现在你已经了解了GAN是什么以及它们的主要组成部分,现在我们可以开始编写一个非常简单的代码。本教程将使用Keras,如果你不熟悉此Python库,则应在继续之前阅读翻译小组其他文章。本教程是基于这里开发的非常酷且易于理解的GAN。

    你需要做的第一件事是通过以下方式安装以下软件包pip:

    你将matplotlib用于绘制tensorflow——Keras后端库,并用tqdm为每个时期(迭代)显示一个奇特的进度条。

    下一步是创建一个Python脚本。在这个脚本中,你首先需要导入你将要使用的所有模块和函数,在使用它们时将给出每个解释。

    你现在想要设置一些变量值:

    在开始构建鉴别器和生成器之前,你应该首先收集并预处理数据。你将使用现在最流行的MNIST数据集,该数据集具有一组从0到9范围内的单个数字的图像。

    请注意,mnist.load_data()这个函数是Keras的一部分,它允许你轻松将MNIST数据集导入你的工作区。

    现在,你可以创建你的生成器和鉴别器网络。你可以为这两个网络使用Adam优化器。对于生成器和鉴别器,你将创建一个带有三个隐藏层的神经网络,激活函数为Leaky Relu。你还应该为鉴别器添加Drop-out图层,以提高其对未见图像的鲁棒性。

    终于到了将生成器和鉴别器放在一起的时候了!

    为了保持整个过程的完整性,你可以创建一个功能,每20个纪元保存你生成的图像。由于这不是本教程的核心,所以你不需要完全理解该功能。

    你现在已经编码了大部分网络,剩下的就是训练这个网络,并看看你创建的图像。

    训练400个纪元后,你可以查看生成的图像。查看第一个纪元后产生的图像,可以看到它没有任何真实的结构,在40个纪元后查看图像,数字开始成形,最后,400个纪元后产生的图像显示出清晰的数字,尽管是一对夫妇仍然无法辨认。

    1纪元(左)后的结果40个纪元后(中)的结果400个时代后的结果(右)

    此代码在CPU上每个纪元大约需要2分钟,这是选择此代码的主要原因。你可以尝试使用更多的纪元,并通过向生成器和鉴别器添加更多(和不同的)图层。但是,当使用更复杂和更深的体系结构时,如果仅使用CPU,则运行时也会增加。

    结论

    恭喜,你已经完成了本教程的最后部分,你已经以直观的方式学习生成敌对网络(GAN)的基础知识!

    本文由@阿里云云栖社区组织翻译。

    文章原标题《demystifying-generative-adversarial-networks》,

    译者:虎说八道,审校:袁虎。

    原文链接

    本文为云栖社区原创内容,未经允许不得转载

    相关文章

      网友评论

      • akiori:出现了一些奇怪的翻译比如`一对夫妇`...
        epoch虽然本意是纪元, 但是其意思是应该是一个epoch等于使用训练集中的全部样本训练一次
        代码是可以用在markdown模式下```括起来的, 不用插图片. 像mnist.load_data()这种函数名也可以用`mnist.load_data()`括起来, 在md下
        最后那幅图原文有三个只插了一个

      本文标题:GAN网络通俗解释(图画版)

      本文链接:https://www.haomeiwen.com/subject/sekedftx.html