深度卷积对抗生成网络(DCGAN)实战

简介: 本文作者通过一个实战小例子介绍了什么是GANS,如何使用TensorFlow来实现GANS,对于想要了解GANS的学习者来说,这篇文章绝对入门。

更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud


生成式对抗网络(GANs)的概念在四年前由Ian Goodfellow创造。古德费洛(Goodfellow)认为鉴别器(Discriminator)是艺术评论家而相对的艺术家则是生成器(Generator),它们两个就组成了GAN。艺术评论家(Discriminator)看着一幅图像,试图确定它是真的还是伪造的。一个想欺骗艺术评论家的艺术家(Generator)试图制造一个看起来尽可能真实的伪造图像。这两种模式相互战斗” ,鉴别器使用生成器的输出作为训练数据,并且生成器也可以从鉴别器获得反馈。在这个过程中,我们想要的模型正在变得更强大,GAN也可以基于一定数量的已知输入数据(在这种情况下是图像)生成新的复杂数据。
创建一个GAN可能听起来很困难,但,在本教程中,我们将使用TensorFlow来构建一个简单的能够生成人脸图像的GAN
1.深度卷积对抗生成网络(DCGAN)的架构
在本教程中,我们不是试图模仿简单的数字数据,而是我们试图模仿一个图像,甚至它可以去欺骗一个人。生成器将随机生成的噪声向量作为输入数据,然后使用称为反卷积的技术将数据转换为图像。
鉴别器是经典的卷积神经网络,其分类真实和假图像。

75da164107fd4c943e9677b1ba2fe437c8fac198
我们将使用原来的非深度卷积生成对抗网络的无监督表示学习DCGAN体系结构它由四个卷积层作为鉴别器,四个解卷积层(反卷积层)作为发生器。
2.创建
GitHub上访问本教程的代码和Jupyter Notebook。所有的指令都在GitHub仓库的README文件中。一个帮手指令将自动为你下载CelebA数据集,让你快速启动并运行。在这个过程中一定要安装matplotlib才能看到真正的图像和另外一定要下载数据集。如果你不想自己安装它,存储库中将包含一个Docker映像。
3.CelebA数据集
CelebFaces数据集包含超过20万个名人图像,每个图像具有40个属性注释。由于我们只是想生成随机面的图像,所以我们将忽略注释。而且数据集包括超过10,000个不同的身份,这对我们的需要来说是最佳的。

013abdaca76274d70ebbe5ecdea6f5f48da0c4a9
不过,尽管如此我们也要定义一个批量生成的函数。这个函数将加载我们的图像,并根据我们稍后将要设置的批量大小给我们一个图像阵列。为了获得更好的效果,我们将裁剪图像,以便只显示脸部。我们还将图像归一化,使得它们的像素值在-0.5+0.5的范围内。最后,我们打算将图像缩小到28x28。这困难会使我们失去了一些图像质量,但它大大减少了训练时间。
4.定义网络输入
在我们开始定义我们的两个网络之前,我们首先要定义我们的输入。我们这样做是为了不让杂乱的训练过程变得比现在更加混乱。在这里,我们只是简单地定义TensorFlow占位符,用于我们真实和虚假的图像输入以及为了保存我们的学习率的值。

    inputs_real = tf.placeholder(tf.float32, shape=(None, image_width, image_height, image_channels), name='input_real')
    inputs_z = tf.placeholder(tf.float32, (None, z_dim), name='input_z')
    learning_rate = tf.placeholder(tf.float32, name='learning_rate')
   
    return inputs_real, inputs_z, learning_rate
AI 代码解读

TensorFlow 分配变量占位符特别容易。在完成这些之后,我们可以通过稍后指定一个 Feed 字典来使用我们网络中的占位符。
5. 创建鉴别器网络( The discriminator network
接着,我们来创建我们最重要的网络。鉴别器是 艺术评论家 ,试图区分真实和虚假的图像。简单地说,这是一个用于图像分类的卷积神经网络。如果你已经有了一些深度学习的经验,那么你有可能已经建立了一个非常类似于这个网络的网络。

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

def discriminator(images, reuse=False):
    """
    Create the discriminator network
    """
   
    with tf.variable_scope('discriminator', reuse=reuse):
        # … the model
AI 代码解读

鉴别器网络由三个卷积层组成,相对于原始架构中的四个卷积层。我们将删除最后一层来简化模型。通过这种方式,训练会进行得更快,而且不会损失太多的质量。对于网络中的每一层,我们要进行卷积,然后我们还要进行批标准化,以使网络更快,更准确,接着,我们要进行 Leaky RELU 进一步加快训练。最后,我们将最后一层的输出变平,并使用 sigmoid 激活函数来获得分类。这样我们就会获得一个可以预测图像是否是真实的网络。
6. 发生器网络( The generator network
发生器是以另一种方式存在于 GAN 中:试图欺骗鉴别器的是 艺术家 。发生器利用去卷积层( deconvolutional ),它们与卷积图层完全相反:除了将图像转换为简单的数值数据(如分类)之外,我们还将执行反卷积以将数字数据转换为图像,而不是执行卷积。正如我们在设置鉴别器网络中所做的那样,我们也将其设置在一个可变范围内。

344297c3061f8416e90b8fc5036d9154382b1d73
首先,我们接受我们的输入,称为 Z ,并将其输入到我们的第一个解卷积层。每个解卷积层执行解卷积,然后执行批量归一化和 Leaky ReLu 。然后,我们返回 tanh 激活函数。
注意:先训练!
在我们真正开始训练过程之前,我们需要做一些其他的事情。首先,我们需要定义所有帮助我们计算损失的变量。其次,我们需要定义我们的优化功能。最后,我们将建立一个小函数来输出生成的图像,然后训练网络。
7. 损失函数
我们需要定义三个损失函数,而不是仅具有单个损失函数:发生器的损失函数,使用真实图像时鉴别器的损失函数,以及使用假图像时鉴别器的损失函数。假图像和真实图像损失的总和理应是整体鉴别器损失。
首先,我们先定义我们对真实图像的损失。为此,我们在处理真实图像时要传递鉴别器的输出,并将其与标签全部进行比较。我们在这里使用一种称为标签平滑的技术,通过将 0.9 乘以 1 来帮助我们的网络更加准确。
然后,我们为我们的假图像定义损失。这次我们在处理伪造的图像时将鉴别器的输出传递给我们的标签,如果这些标签都是 0 ,这意味着它们是假的。
最后,对于发生器定义损失器。
8. 优化和可视化
在优化的步骤中,我们正在寻找所有可以通过使用 tf.trainable_variables 函数进行训练的变量。既然我们之前使用了变量作用域,我们可以非常舒适地检索这些变量。然后我们使用 Adam 优化器来帮助我们减少损失。

def model_opt(d_loss, g_loss, learning_rate, beta1):
    """
    Get optimization operations
    """
    t_vars = tf.trainable_variables()
    d_vars = [var for var in t_vars if var.name.startswith('discriminator')]
    g_vars = [var for var in t_vars if var.name.startswith('generator')]
AI 代码解读

在我们准备的最后一步中,我们将编写一个小段程序,使用 matplotlib 库在笔记本上显示生成的图像。
9. 训练
我们正在进行我们的最后一步!现在,我们只获取我们之前定义的输入,损失和优化器,调用一个 TensorFlow 会话并运行批处理。每 400 一个批次,我们通过显示生成的图像和生成器以及鉴别器的损失来输出当前的进度。现在向后看,看到脸部缓缓而稳定地出现。根据你的设置,此进度可能需要一个小时或更长时间。

ae7ce03cb62aa22b8e351b85517e315487e46820
10. 结论
恭喜你!你现在知道 GAN 做什么,甚至知道如何使用它们生成人脸图像。这只是 GAN 的冰山一角, GAN 还有很多其他的应用。
例如:密歇根大学和德国马克斯普朗克研究所的研究人员使用 GAN 从文本中生成图像。根据论文描述,他们能够产生非常真实的花鸟。这可以扩展到一些其他领域,比如警察素描或者平面设计。伯克利的研究人员也设法创建了一个 GAN ,增强了模糊的图像,甚至重建了损坏的图像数据。
总之, GAN 是非常强大的。

作者: Dominic Monn 

Dominic Monn目前是瑞士苏黎世NVIDIA公司的深度实习生

本文由北邮@爱可可-爱生老师推荐,阿里云云栖社组织翻译。

文章原标题《Deep convolutional generative adversarial networks with TensorFlow》,作者:Dominic Monn译者:虎说八道,审阅:

文章为简译,更为详细的内容,请查看原文

目录
打赏
0
0
0
0
1807
分享
相关文章
基于GA遗传优化TCN时间卷积神经网络时间序列预测算法matlab仿真
本内容介绍了一种基于遗传算法优化的时间卷积神经网络(TCN)用于时间序列预测的方法。算法运行于 Matlab2022a,完整程序无水印,附带核心代码、中文注释及操作视频。TCN通过因果卷积层与残差连接学习时间序列复杂特征,但其性能依赖超参数设置。遗传算法通过对种群迭代优化,确定最佳超参数组合,提升预测精度。此方法适用于金融、气象等领域,实现更准确可靠的未来趋势预测。
基于Python深度学习的【害虫识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
害虫识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了12种常见的害虫种类数据集【"蚂蚁(ants)", "蜜蜂(bees)", "甲虫(beetle)", "毛虫(catterpillar)", "蚯蚓(earthworms)", "蜚蠊(earwig)", "蚱蜢(grasshopper)", "飞蛾(moth)", "鼻涕虫(slug)", "蜗牛(snail)", "黄蜂(wasp)", "象鼻虫(weevil)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Djan
93 1
基于Python深度学习的【害虫识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
HarmonyOS NEXT 实战系列10-网络通信
本文介绍了网络通信相关知识,包括HTTP协议的工作原理、鸿蒙系统中HTTP模块的使用方法、Promise异步操作处理机制及async/await语法糖的应用,以及JSON数据格式的语法规则与转换方法。重点讲解了HTTP请求响应流程、鸿蒙开发中的网络权限申请与代码实现、Promise三种状态及创建方式,并通过示例说明异步编程技巧和JSON在数据传递中的应用。
53 10
Hyper V上网实战:多虚拟机网络环境配置
在Hyper-V环境中配置多虚拟机网络以实现上网功能,需完成以下步骤:1. 确认Hyper-V安装与物理网络连接正常;2. 配置虚拟交换机(外部、内部或专用)以支持不同网络需求;3. 设置虚拟机网络适配器并关联对应虚拟交换机;4. 验证虚拟机网络连接状态;5. 根据场景需求优化多虚拟机网络环境。此外,还需注意网络隔离、性能监控及数据备份等事项,确保网络安全稳定运行。
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
蘑菇识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了9种常见的蘑菇种类数据集【"香菇(Agaricus)", "毒鹅膏菌(Amanita)", "牛肝菌(Boletus)", "网状菌(Cortinarius)", "毒镰孢(Entoloma)", "湿孢菌(Hygrocybe)", "乳菇(Lactarius)", "红菇(Russula)", "松茸(Suillus)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,
132 11
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
基于GA遗传优化TCN-LSTM时间卷积神经网络时间序列预测算法matlab仿真
本项目基于MATLAB 2022a实现了一种结合遗传算法(GA)优化的时间卷积神经网络(TCN)时间序列预测算法。通过GA全局搜索能力优化TCN超参数(如卷积核大小、层数等),显著提升模型性能,优于传统GA遗传优化TCN方法。项目提供完整代码(含详细中文注释)及操作视频,运行后无水印效果预览。 核心内容包括:1) 时间序列预测理论概述;2) TCN结构(因果卷积层与残差连接);3) GA优化流程(染色体编码、适应度评估等)。最终模型在金融、气象等领域具备广泛应用价值,可实现更精准可靠的预测结果。
Python 高级编程与实战:深入理解网络编程与异步IO
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化、调试技巧、数据科学、机器学习、Web 开发和 API 设计。本文将深入探讨 Python 在网络编程和异步IO中的应用,并通过实战项目帮助你掌握这些技术。
RT-DETR改进策略【Neck】| GSConv+Slim Neck:混合深度可分离卷积和标准卷积的轻量化网络设计
RT-DETR改进策略【Neck】| GSConv+Slim Neck:混合深度可分离卷积和标准卷积的轻量化网络设计
82 11
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
107 17
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
77 10
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等