【实践】伪造名人的脸—做一个小示例了解生成式对抗网络

生成式对抗网络(GAN)的概念由Ian Goodfellow提出。Goodfellow使用了艺术评论家和艺术家的比喻来描述这两个模型比喻发生器和鉴别,它们组成了GAN。一个艺术评论家(鉴别器)试图判断图像是不是伪造的。一个想愚弄艺术评论家的艺术家(生成器)试图创造一个看起来尽可能真实的伪造的形象。他们“相互斗争”;鉴别器使用生成器的输出作为训练数据,而生成器则从鉴别器中得到反馈。在这个过程中,每个模型都变得更加强大。通过这种方式,GANs能够根据一些已知的输入数据生成新的复杂数据。

实现GAN并不像听起来那么难。在本教程中,我们将使用TensorFlow来构建一个能够生成人脸图像的GAN。

DCGAN架构

在本教程中,我们并不是试图模拟简单的数值数据,我们试图模拟一个甚至可以愚弄人类的图像。生成器将随机生成的噪声矢量作为输入数据,然后使用一种名为反卷积的技术将数据转换为图像。

鉴别器是一种经典的卷积神经网络,它将真实的和假的图像进行分类。

GAN结构的简单可视化

我们将使用论文“无监督表征学习的深卷积生成对抗网络”中原始的DCGAN架构,它由四个卷积层作为鉴别器,四个反卷积层作为发生器。

安装

请访问https://github.com/dmonn/dcgan-oreilly。README文件中完整的说明。helper函数会自动下载CelebA数据集,让你快速启动和运行。请确保安装了matplotlib。如果不想自己安装,那么在存储库中就有一个Docker镜像。

CelebA数据集

名人的属性数据集包含超过20万张名人图片,每一张都有40个属性注释。因为我们只想生成随机的人脸图像,所以忽略注释即可。数据集包含了10,000多个不同的身份,这对我们很有帮助。

数据集中部分名人的图像

在这一点上,我们还将定义一个用于批处理的函数。这个函数将加载我们的图像,并根据我们稍后设置的批处理大小给我们提供一系列图像。为了得到更好的结果,我们将会对图像进行裁剪,只有脸部才会显示。我们还将使图像归一化,让它们的像素值范围在-0.5到+0.5之间。最后,我们将把图像缩小到28×28。这样虽然我们损失了一些图像质量,但却大大减少了训练时间。

定义网络输入

在我们开始定义我们的两个网络之前,我们先定义我们的输入。这样做是确保不让训练功能不会变得更乱。在这里,我们只是简单地为我们的真实和虚假输入定义TensorFlow占位符,以及学习率。

def discriminator(images, reuse=False):
    """
    Create the discriminator network
    """

    with tf.variable_scope('discriminator', reuse=reuse):
        # … the model

TensorFlow为占位符分配变量特别简便。完成这一操作之后,我们可以通过稍后指定一个馈送词典(feed dictionary)来使用我们网络中的占位符。

鉴别器网络

鉴别器相当于“艺术评论家”,试图区分真实和虚假的图像。简单地说,这是一个用于图像分类的卷积神经网络。如果你已经有了一些深度学习的经验,那么你有可能建立过与之相似网络。

鉴别器执行多重卷积

定义这个网络时,我们要使用一个TensorFlow变量作用域。这有助于我们稍后的训练过程,所以我们可以重复使用我们鉴别器和发生器的变量名。

def discriminator(images, reuse=False):
    """
    Create the discriminator network
    """

    with tf.variable_scope('discriminator', reuse=reuse):
        # … the model

鉴别器网络由三个卷积层组成,与原始架构中的四个卷积层不同。我们删除最后一层来简化模型。这样训练进行得非常快,也不会损失太多的质量。网络的每一层,我们都要进行卷积,然后我们要进行批量归一化,使网络更快,更准确,最后我们要执行Leaky ReLu来进一步加速训练。最后,我们将最后一层的输出变平,并使用sigmoid激活函数来获得分类。不管图像真实与否,我们现在得到了一个预测结果。

发生器网络

发生器:试图欺骗鉴别者的是艺术家(造假画的人)。发生器利用反卷积层。它们与卷积图层完全相反:除了将图像转换为简单的数值数据(如分类)之外,我们执行反卷积以将数值数据转换为图像,而不是执行卷积。这不是像简单的卷积层那样的概念,它被用于更高级的地方。正如我们在鉴别器网络中所做的那样,我们也将其包含在一个可变范围内。

发生器执行多重反卷积

我们在这里做的和鉴别者一样,只是方向相反。首先,我们接受我们的输入(称为Z)并将其输入到第一个反卷积层。每个反卷积层执行反卷积,然后执行批量归一化和Leaky ReLu。然后,我们返回tanh激活函数。

开始训练

在我们真正开始训练过程之前,我们还有要做的事情。首先,我们需要定义所有帮助我们计算损失的变量。其次,我们需要定义我们的优化函数。最后,我们将建立一个小的函数来输出生成的图像,接着训练网络。

损失函数

我们需要定义三个损失函数:发生器的损失函数,使用真实图像时鉴别器的损失函数,以及使用假图像时鉴别器的损失函数。假图像和真实图像的损失总和应是整个鉴别器损失。

首先,我们定义我们对真实图像的损失函数。为此,我们在处理真实图像时要传递鉴别器的输出,并将其与所有1的标签进行比较(1代表真实)。我们在这里使用一种名为“label smoothing”的技术,它通过将0.9和1s相乘,来帮助我们的网络更加准确。

然后,我们为我们的假图像定义损失函数。这次我们在处理假的图像时将鉴别器的输出传递给我们的标签,这些标签都是0(这表示他们都是假的)。

最后,对于发生器的损失函数,我们的做法就像在最后一步一样,但是我们没有把输出与所有的0相比,而是用1s来比较,因为我们想要欺骗鉴别器。

优化和可视化

在优化步骤中,我们正在寻找所有可以通过使用tf.trainable_variables函数进行训练的变量。既然我们之前使用了变量作用域,我们可以非常舒适地检索这些变量。然后我们使用Adam优化器为我们减少损失。

def model_opt(d_loss, g_loss, learning_rate, beta1):
    """
    Get optimization operations
    """
    t_vars= tf.trainable_variables()
    d_vars= [varfor varin t_varsif var.name.startswith('discriminator')]
    g_vars= [varfor varin t_varsif var.name.startswith('generator')]

在我们准备的最后一步,我们正在编写一个小的函数,使用matplotlib库在笔记本电脑上显示生成的图像。

训练

我们正在最后一步!现在,我们只获取我们之前定义的输入,损失和优化,调用一个TensorFlow会话并分批运行批处理。每400一批,我们通过显示生成的图像和生成器以及鉴别器的损失来输出当前的进度。现在身体向后靠,你会看到脸出现。根据你的设置,进度可能需要一个小时或更长的时间。

生成的脸

结论

如果你顺利读完,那么恭喜你,你已经了解了GAN的用途,甚至知道如何使用它们生成人脸图像。你可能会问:“我将永远用不到生成随机面部的图像。”虽然这可能是真的,但是GAN还有很多其他的应用。

密歇根大学和德国马克斯普朗克研究所的研究人员使用GAN从文本生成图像。根据论文描述,他们能够产生非常逼真的花鸟。它还可以扩展到非常有用的其他领域,如模拟画像或平面设计。

伯克利的研究人员也设法创建了一个GAN,增强了模糊图像的清晰度,甚至重建了已损坏的图像数据。

GAN是非常强大的,谁知道 – 也许你会发明他们的下一个开创性的应用程序。

原文发布于微信公众号 - ATYUN订阅号(atyun_com)

原文发表时间:2017-11-13

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器之心

教程 | 如何用30行JavaScript代码编写神经网络异或运算器

选自Medium 机器之心编译 参与:Panda 配置环境、安装合适的库、下载数据集……有时候学习深度学习的前期工作很让人沮丧,如果只是为了试试现在人人都谈的深...

2599
来自专栏人工智能

在图像中标注新的对象

给定一个图像,人类可以很容易地推断其中的显着实体,并有效地描述场景,如对象所在的位置(在森林或厨房?),对象具有什么属性(棕色或白色?),更重要的是,物体如何与...

30011
来自专栏计算机视觉战队

利用多尺度块合成进行图像修复

深度学习的最新进展已经令人兴奋,在自然图像中填充大量的空洞,具有语义上的合理性和上下文感知的细节,影响基础图像处理任务,例如目标消除。虽然这些基于深度学习的方...

2909
来自专栏Coding迪斯尼

使用RNN和CNN混合的’鸡尾酒疗法’,提升网络对文本的识别正确率

前几节我们详细研究了GRU和LSTM网络层,这两者特点是能够抓取输入数据在时间上的逻辑联系,因此这两种网络特别容易从文本中抓取规律,因为文本是有一个个单词依据前...

703
来自专栏机器之心

教程 | 使用MNIST数据集,在TensorFlow上实现基础LSTM网络

选自GitHub 机器之心编译 参与:刘晓坤、路雪 本文介绍了如何在 TensorFlow 上实现基础 LSTM 网络的详细过程。作者选用了 MNIST 数据集...

27110
来自专栏机器之心

谷歌开放GNMT教程:如何使用TensorFlow构建自己的神经机器翻译系统

选自谷歌 机器之心编译 参与:机器之心编辑部 近日,谷歌官方在 Github 开放了一份神经机器翻译教程,该教程从基本概念实现开始,首先搭建了一个简单的NMT模...

3616
来自专栏杨熹的专栏

TensorFlow-10-基于 LSTM 建立一个语言模型

今日资料: https://www.tensorflow.org/tutorials/recurrent 中文版: http://wiki.jikexue...

3886
来自专栏marsggbo

Andrew Ng机器学习课程笔记--week4(神经网络)

Neural Networks: Representation 一、 内容概要 Neural Network Model Representation 1 M...

19010
来自专栏机器之心

教程 | 利用TensorFlow和神经网络来处理文本分类问题

3227
来自专栏量子位

GAN入门教程 | 从0开始,手把手教你学会最火的神经网络

安妮 编译自 O’Reilly 量子位出品 | 公众号 QbitAI 生成式对抗网络是20年来机器学习领域最酷的想法。 ——Yann LeCun 自从两年前...

4443

扫码关注云+社区