# 零、前言 近年来,深度学习在视觉,语音,自然语言处理和理解以及所有其他领域的大量数据难题中取得了前所未有的成功案例。 公司,大学,政府和研究组织对该领域的兴趣加速了该领域的发展。 本书通过三个新的章节介绍了深度学习中的重要主题:“对象检测”,“语义分割”和“使用互信息的无监督学习”。 通过提供原理的背景知识,挖掘概念背后的直觉,使用 Keras 实现方程式和算法以及检查结果来解释高级理论。 **人工智能**(**AI**)到今天为止还远远不是一个易于理解的领域。 **深度学习**(**DL**)作为 AI 的子字段,处于相同位置。 尽管它还不是一个成熟的领域,但许多现实世界的应用,例如基于视觉的检测和识别,自主导航,产品推荐,语音识别和合成,节能,药物发现,财务和营销,已经在使用 DL 算法。 。 将发现并构建更多应用。 本书的目的是解释高级概念,提供示例实现,并让作为其领域专家的读者识别目标应用。 尚未完全成熟的领域是一把双刃剑。 一方面,它为发现和利用提供了很多机会。 深度学习中有许多未解决的问题。 这就意味着可以抢先进入市场的机会–无论是在产品开发,发布还是认可方面。 另一个优势是,在关键任务环境中很难信任一个尚未被完全理解的领域。 我们可以肯定地说,如果被问到,很少有机器学习工程师会乘坐由深度学习系统控制的自动驾驶飞机。 要获得这种信任级别,需要做很多工作。 本书中讨论的高级概念很有可能在获得这种信任级别中扮演重要角色。 没有 DL 书能够完全涵盖整个领域。 这本书也不例外。 给定时间和空间,我们可能会涉及到有趣的领域,例如自然语言处理和理解,语音合成,自动机器学习(AutoML),图神经网络(GNN),贝叶斯深度学习等等。 但是,本书相信选择和解释选定的区域,以便读者可以从事其他未涵盖的领域。 作为即将着手阅读本书的读者,请记住,您选择的是一个令人兴奋的领域,会对社会产生巨大影响。 我们很幸运能有一份工作,希望我们在早晨醒来时继续努力。 # 这本书是给谁的 本书面向希望更好地了解深度学习高级主题的机器学习工程师和学生。 每个讨论都通过 Keras 中的代码实现进行了补充。 特别是,使用的是 TensorFlow 2 的 Keras API 或简称为`tf.keras`。这本书适合希望了解如何将理论转化为 Keras 中的工作代码实现的读者。 除了理解理论外,代码实现通常是将机器学习应用于实际问题的艰巨任务之一。 # 本书涵盖的内容 “第 1 章”,“Keras 高级深度学习入门”涵盖了深度学习的关键概念,例如优化,正则化,损失函数,基本层和网络及其在`tf.keras`中的实现 。 本章回顾了使用顺序 API 的深度学习和`tf.keras`。 “第 2 章”,“深度神经网络”讨论了`tf.keras`的函数式 API。 使用函数式 API 在`tf.keras`中检查并实现了两种广泛使用的深度网络架构 ResNet 和 DenseNet。 “第 3 章”,“自编码器”涵盖了一种称为自编码器的通用网络结构,该结构用于发现输入数据的潜在表示形式。 `tf.keras`中讨论并实现了自编码器的两个示例应用,即降噪和着色。 “第 4 章”,“生成对抗网络(GANs)”讨论了深度学习的最新重大进展之一。 GAN 用于生成看起来真实的新综合数据。 本章介绍 GAN 的原理。 在`tf.keras`中检查并实现了 GAN 的两个示例 DCGAN 和 CGAN。 “第 5 章”,“改进的 GAN” 涵盖了改进基本 GAN 的算法。 该算法解决了训练 GAN 的困难,并提高了合成数据的感知质量。 在`tf.keras`中讨论并实现了 WGAN,LSGAN 和 ACGAN。 “第 6 章”,“纠缠表示 GAN” 讨论了如何控制 GAN 生成的合成数据的属性。 如果潜在表示被解开,则可以控制属性。 `tf.keras`中介绍了并实现了两种解开表示的技术,即 InfoGAN 和 StackedGAN。 “第 7 章”,“跨域 GAN” 涵盖了 GAN 的实际应用,将图像从一个域转换为另一个域,通常称为跨域迁移。 CycleGAN 是一种广泛使用的跨域 GAN,在`tf.keras`中进行了讨论和实现。 本章演示 CycleGAN 执行着色和样式迁移。 “第 8 章”,“变分自编码器(VAE)”讨论了 DL 中的另一个重要主题。 与 GAN 类似,VAE 是用于生成综合数据的生成模型。 与 GAN 不同,VAE 专注于可解码的连续潜空间,该空间适合于变化推理。 `tf.keras`涵盖并实现了 VAE 及其变体 CVAE 和 β-VAE。 “第 9 章”,“深度强化学习”解释了强化学习和 Q 学习的原理。 提出了两种实现离散动作空间 Q 学习的技术,即 Q 表更新和**深度 Q 网络**(**DQN**)。 在 OpenAI Gym 环境中演示了在`tf.keras`中使用 Python 和 DQN 进行 Q 学习的实现。 “第 10 章”,“策略梯度方法”解释了如何使用神经网络来学习强化学习中的决策策略。 在`tf.keras`和 OpenAI Gym 环境中涵盖并实现了四种方法,即 REINFORCE,带有基线的 REINFORCE,演员评论家和优势演员评论家。 本章中的示例演示了连续操作空间上的策略梯度方法。 “第 11 章”,“对象检测”讨论了计算机视觉,对象检测或识别和定位图像中对象的最常见应用之一。 涵盖了称为 SSD 的多尺度目标检测算法的关键概念,并使用`tf.keras`逐步构建了实现。 提出了用于数据集收集和标记的示例技术。 之后,使用数据集对 SSD 的`tf.keras`实现进行训练和评估。 “第 12 章”,“语义分割”讨论了计算机视觉,语义分割或识别图像中每个像素的对象类别的另一种常见应用。 讨论了分割原理。 然后,将更详细地介绍语义分割。 使用`tf.keras`构建并评估了称为 FCN 的语义分割算法的示例实现。 使用上一章中收集的相同数据集,但重新标记了语义分割。 “第 13 章”,“使用互信息的无监督学习”研究了如果 DL 严重依赖人类标签,它将不会继续发展。 无监督学习侧重于不需要人工标签的算法。 一种实现无监督学习的有效技术是利用**互信息**(**MI**)的概念。 通过最大化 MI,可以使用`tf.keras`实现和评估无监督的聚类/分类。 # 充分利用这本书 * **深度学习和 Python**:读者应该具有深度学习及其在 Python 中的实现的基础知识。 尽管以前使用 Keras 实现深度学习算法的经验很重要,但这不是必需的。“第 1 章”, “Keras 高级深度学习入门”概述了深度学习的概念及其在`tf.keras`中的实现。 * **数学**:本书中的讨论假定读者熟悉大学级别的微积分,线性代数,统计和概率。 * **GPU**:本书中的大多数`tf.keras`实现都需要 GPU。 如果没有 GPU,则由于涉及的时间(数小时至数天),因此无法执行许多代码示例。 本书中的示例尽可能多地使用合理数量的数据,以最大程度地减少高性能计算机的使用。 读者应该至少可以使用 NVIDIA GTX 1060。 * **编辑器**:本书的示例代码是在 Ubuntu Linux 18.04 LTS 和 MacOS Catalina 中使用 vim 编辑的。 任何支持 Python 的文本编辑器都是可以接受的。 * **TensorFlow 2**:本书中的代码示例是使用 TensorFlow 2 的 Keras API 或`tf2`编写的。 请确保正确安装了 NVIDIA GPU 驱动和`tf2`。 * **GitHub**:我们通过示例和实验学习。 请从其 GitHub 存储库中`git pull`或`fork`这本书的代码包。 获取代码后,对其进行检查。 运行。 更改。 再次运行。 通过调整代码进行创造性的实验。 这是欣赏本章中解释的所有理论的唯一方法。 在[此书的 GitHub 存储库](https://github.com/PacktPublishing/Advanced-Deep-Learning-with-Keras)上点击星星也受到高度赞赏。 ## 下载示例代码文件 [本书的代码包托管在 GitHub 上](https://github.com/PacktPublishing/Advanced-Deep-Learning-with-Keras)。 我们还从[这里](https://github.com/PacktPublishing/)提供了丰富的书籍和视频目录中的其他代码包。 去看一下! ## 下载彩色图像 我们还提供本书中使用的彩色图像图像。 [您可以在此处下载](https://static.packt-cdn.com/downloads/9787838821654_ColorImages.pdf)。 ## 使用约定 本书中的代码使用 Python。 更具体地说,是 Python3。例如: 代码块设置如下: ```py def build_generator(inputs, image_size): """Build a Generator Model Stack of BN-ReLU-Conv2DTranpose to generate fake images Output activation is sigmoid instead of tanh in [1]. Sigmoid converges easily. Arguments: inputs (Layer): Input layer of the generator the z-vector) image_size (tensor): Target size of one side (assuming square image) Returns: generator (Model): Generator Model """ image_resize = image_size // 4 # network parameters kernel_size = 5 layer_filters = [128, 64, 32, 1] x = Dense(image_resize * image_resize * layer_filters[0])(inputs) x = Reshape((image_resize, image_resize, layer_filters[0]))(x) for filters in layer_filters: # first two convolution layers use strides = 2 # the last two use strides = 1 if filters > layer_filters[-2]: strides = 2 else: strides = 1 x = BatchNormalization()(x) x = Activation('relu')(x) x = Conv2DTranspose(filters=filters, kernel_size=kernel_size, strides=strides, padding='same')(x) x = Activation('sigmoid')(x) generator = Model(inputs, x, name='generator') return generator ``` 当我们希望提请您注意代码块的特定部分时,相关的行或项以粗体显示: ```py # generate fake images fake_images = generator.predict([noise, fake_labels]) # real + fake images = 1 batch of train data x = np.concatenate((real_images, fake_images)) # real + fake labels = 1 batch of train data labels labels = np.concatenate((real_labels, fake_labels)) ``` 只要有可能,都包括文档字符串。 至少,文本注释用于最小化空间使用。 任何命令行代码执行都编写如下: ```py python3 dcgan-mnist-4.2.1.py ``` 上面的示例具有以下布局:`algorithm-dataset-chapter.section.number.py`。 命令行示例是“第 4 章”,“生成对抗网络(GANs)”第二部分和第一列表中 MNIST 数据集上的 DCGAN。 在某些情况下,未编写要执行的显式命令行,但假定是: ```py python3 name-of-the-file-in-listing ``` 该代码示例的文件名包含在“列表”标题中。 本书使用“列表”标识文本中的代码示例。 **粗体**:表示新的术语,重要的单词或您在屏幕上看到的单词,例如在菜单或对话框中,也显示在这样的文本中。 例如:StackedGAN 具有两个附加损失函数,即**条件**和**熵**。 警告或重要提示如下所示。