提交 36cc08fb 编写于 作者: W wizardforcel

2020-09-15 18:34:21

上级 107963b0
......@@ -28,7 +28,7 @@ TensorFlow 是 Google 创建的开源软件库,可让您构建和执行数据
在 TensorFlow 中,您使用的主要对象称为张量。 张量是向量和矩阵的一般化。 即使向量是一维的,矩阵是二维的,张量也可以是`n`维。 TensorFlow 将张量表示为用户指定数据类型的`n`维数组,例如`float32`
TensorFlow 程序通过首先构建计算图来工作。 该图将产生一些`tf.Tensor`输出。 要评估此输出,您必须通过在输出张量上调用`tf.Session.run`来在`tf.Session`中运行它。 当您执行此操作时,TensorFlow 将执行图形中需要执行的所有部分,以评估您要求其运行的`tf.Tensor`
TensorFlow 程序通过首先构建计算图来工作。 该图将产生一些`tf.Tensor`输出。 要求值此输出,您必须通过在输出张量上调用`tf.Session.run`来在`tf.Session`中运行它。 当您执行此操作时,TensorFlow 将执行图形中需要执行的所有部分,以评估您要求其运行的`tf.Tensor`
# 设置和安装 TensorFlow
......@@ -215,7 +215,7 @@ test_labels = shuffled_labels[105:]
# 分为训练和测试集
最后,我们将数据集的一部分放到一边。 这就是我们的测试集,在我们训练模型之后我们才接触它。 该集合用于评估我们训练有素的模型对从未见过的新数据的性能。 有许多方法可以将数据分为训练集和测试集,我们将在本书的后面详细介绍它们。
最后,我们将数据集的一部分放到一边。 这就是我们的测试集,在我们训练模型之后我们才接触它。 该集合用于评估我们训练有素的模型对从未见过的新数据的表现。 有许多方法可以将数据分为训练集和测试集,我们将在本书的后面详细介绍它们。
但就目前而言,我们将进行一个简单的 70:30 拆分,因此我们仅使用总数据的 70% 来训练我们的模型,然后对剩余的 30% 进行测试。
......@@ -408,13 +408,13 @@ with tf.Session() as sess:.
原因是创建会话时,它可以控制计算机上的 CPU,内存和 GPU 资源。 使用完会话后,您希望再次释放所有这些资源,最简单的方法是使用`with`语句来确保这一点。
创建会话后,我们要做的第一件事是运行初始化程序操作。 通过在要评估的图形对象上调用`tf.Session.run`,可以使用会话来评估图形中的节点和张量。 当您将图形的一部分提供给`session.run`时,TensorFlow 将在整个图形中进行工作,评估所提供的图形部分所依赖的所有内容以产生结果。
创建会话后,我们要做的第一件事是运行初始化程序操作。 通过在要评估的图形对象上调用`tf.Session.run`,可以使用会话来求值图中的节点和张量。 当您将图形的一部分提供给`session.run`时,TensorFlow 将在整个图形中进行工作,求值所提供的图部分所依赖的所有内容以产生结果。
因此,在我们的示例中,调用`sess.run(initializer)`将在图形中进行搜索,查找执行初始化程序所需的所有内容,然后按顺序执行这些节点。 在这种情况下,初始化程序节点没有任何连接,因此它将简单地执行一个初始化所有变量的节点。
现在我们的变量已初始化,我们开始训练循环。 我们将训练 1000 个步骤或迭代,因此我们将在其中创建训练步骤的`for`循环。 训练的步骤数是`hyperparameter`。 这是我们在训练模型时需要决定的事情。 您可以选择与您选择的值进行权衡,这将在以后的章节中进行讨论。 对于此问题,1000 个步骤将足以获得所需的结果。
我们获取了一批训练数据和标签,并将它们输入到图形中。 接下来,我们再次调用`session.run`。 这次,我们将其称为损失和优化器两件事。 通过将它们放在我们提供给`session.run`的列表中,我们可以提供想要评估的事物。 TensorFlow 将足够聪明,如果不需要,它不会多次评估图形,并且它将重用已经计算出的结果。 我们提供的这个列表称为我们的提取; 它是我们要评估和获取的图中的节点。
我们获取了一批训练数据和标签,并将它们输入到图形中。 接下来,我们再次调用`session.run`。 这次,我们将其称为损失和优化器两件事。 通过将它们放在我们提供给`session.run`的列表中,我们可以提供想要求值的事物。 TensorFlow 将足够聪明,如果不需要,它不会多次求值图,并且它将重用已经计算出的结果。 我们提供的这个列表称为我们的提取; 它是我们要求值和获取的图中的节点。
在提取列表之后,我们提供了`feed_dict`或馈送字典。 这是一个字典,其中的每个键都是图表中的张量,我们将向该张量输入值(在本例中为占位符),而对应的值就是将被输入到它的值。
......
......@@ -18,17 +18,17 @@
# AI 和 ML
就本书而言,将**人工智能****AI**)视为计算机科学领域,负责制造可解决特定问题的代理(软件/机器人)。 在这种情况下,“智能”表示代理是灵活的,并且它通过传感器感知环境,并将采取使自身在某个特定目标成功的机会最大化的措施。
就本书而言,将**人工智能****AI**)视为计算机科学领域,负责制造可解决特定问题的智能体(软件/机器人)。 在这种情况下,“智能”表示智能体是灵活的,并且它通过传感器感知环境,并将采取使自身在某个特定目标成功的机会最大化的措施。
我们希望 AI 最大化名为**期望效用**的东西,或者通过执行动作获得某种满足的概率。 一个简单易懂的例子是上学,您将最大程度地获得工作的期望效用。
人工智能渴望取代在完成繁琐的日常任务中涉及的易于出错的人类智能。 AI 旨在模仿(以及智能代理应该具有)的人类智能的一些主要组成部分是:
人工智能渴望取代在完成繁琐的日常任务中涉及的易于出错的人类智能。 AI 旨在模仿(以及智能智能体应该具有)的人类智能的一些主要组成部分是:
* **自然语言处理****NLP**):能够理解口头或书面人类语言,并能自然回答问题。 NLP 的一些示例任务包括自动旁白,机器翻译或文本摘要。
* **知识和推理**:开发并维护代理周围世界的最新知识。 遵循人类推理和决策来解决特定问题并对环境的变化做出反应。
* **知识和推理**:开发并维护智能体周围世界的最新知识。 遵循人类推理和决策来解决特定问题并对环境的变化做出反应。
* **规划和解决问题的方法**:对可能采取的措施进行预测,并选择能最大化预期效用的方案,换句话说,为该情况选择最佳措施。
* **感知**代理程序所配备的传感器向其提供有关代理程序所处世界的信息。这些传感器可以像红外传感器一样简单,也可以像语音识别麦克风那样复杂。 或相机以实现机器视觉。
* **学习**:要使代理开发世界知识,它必须使用感知来通过观察来学习。 学习是一种知识获取的方法,可用于推理和制定决策。 AI 的无需处理某些明确编程即可处理从数据中学习算法的子字段,称为机器学习。
* **感知**智能体程序所配备的传感器向其提供有关智能体程序所处世界的信息。这些传感器可以像红外传感器一样简单,也可以像语音识别麦克风那样复杂。 或相机以实现机器视觉。
* **学习**:要使智能体开发世界知识,它必须使用感知来通过观察来学习。 学习是一种知识获取的方法,可用于推理和制定决策。 AI 的无需处理某些明确编程即可处理从数据中学习算法的子字段,称为机器学习。
ML 使用诸如统计分析,概率模型,决策树和神经网络之类的*工具*来有效地处理大量数据,而不是人类。
......@@ -60,7 +60,7 @@ ML 系统的组成部分是评估。 在评估模型时,我们会看到模型
![](img/9b300c7e-a825-46fe-aebc-12d8367fdeef.jpg)
**强化学习**:第三种是关于训练代理在环境中执行某些操作的全部。 我们知道理想的结果,但不知道如何实现。 我们没有给数据加标签,而是给代理提供反馈,告诉它完成任务的好坏。 强化学习超出了本书的范围。
**强化学习**:第三种是关于训练智能体在环境中执行某些操作的全部。 我们知道理想的结果,但不知道如何实现。 我们没有给数据加标签,而是给智能体提供反馈,告诉它完成任务的好坏。 强化学习超出了本书的范围。
# 新旧机器学习
......@@ -702,7 +702,7 @@ print("Test Accuracy:",sess.run(accuracy, feed_dict={x_: mnist.test.images, y_:
# TensorBoard
TensorBoard 是 TensorFlow 随附的基于 Web 的实用程序,可让您可视化构造的 TensorFlow 图。 最重要的是,它使您能够跟踪大量的统计数据或变量,这些数据或变量可能对训练模型很重要。 您可能希望跟踪的此类变量的示例包括训练损失,测试集准确性或学习率。 前面我们看到,我们可以使用张量板可视化损失函数的值。
TensorBoard 是 TensorFlow 随附的基于 Web 的工具,可让您可视化构造的 TensorFlow 图。 最重要的是,它使您能够跟踪大量的统计数据或变量,这些数据或变量可能对训练模型很重要。 您可能希望跟踪的此类变量的示例包括训练损失,测试集准确性或学习率。 前面我们看到,我们可以使用张量板可视化损失函数的值。
要运行 TensorBoard,请打开一个新终端并输入以下内容:
......
......@@ -389,7 +389,7 @@ decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)
self.__saver = tf.train.Saver(max_to_keep=None)
```
另外,我们可以指定`tf.GPUOptions`要使用的 GPU 内存比例。 对象会话封装了执行操作和评估张量的环境。 创建`FileWriter`对象以将摘要和事件存储到文件后,`__session.run(init)`方法运行 TensorFlow 计算的一个步骤,方法是运行必要的图形片段以执行每个操作,并评估在`init`中初始化的每个张量作为图的一部分:
另外,我们可以指定`tf.GPUOptions`要使用的 GPU 内存比例。 对象会话封装了执行操作和求值张量的环境。 创建`FileWriter`对象以将摘要和事件存储到文件后,`__session.run(init)`方法运行 TensorFlow 计算的一个步骤,方法是运行必要的图形片段以执行每个操作,并评估在`init`中初始化的每个张量作为图的一部分:
```py
# Avoid allocating the whole memory
......@@ -578,7 +578,7 @@ bias_initializer=tf.zeros_initializer())
# 通过规范化来提高泛化能力
到目前为止,在本章中,我们已经看到了如何使用 TensorFlow 训练卷积神经网络来完成图像分类任务。 训练完模型后,我们将其遍历测试集,并从一开始就将其存储起来,以查看其在从未见过的数据上的性能如何。 在测试集上评估模型的过程向我们表明了在部署模型时模型将泛化的程度。 能够很好地泛化的模型显然是理想的属性,因为它可以在许多情况下使用。
到目前为止,在本章中,我们已经看到了如何使用 TensorFlow 训练卷积神经网络来完成图像分类任务。 训练完模型后,我们将其遍历测试集,并从一开始就将其存储起来,以查看其在从未见过的数据上的表现如何。 在测试集上评估模型的过程向我们表明了在部署模型时模型将泛化的程度。 能够很好地泛化的模型显然是理想的属性,因为它可以在许多情况下使用。
我们使用的 CNN 架构是可以提高模型泛化能力的方法之一。 要记住的一种简单技术是从设计模型开始就尽可能简单地使用很少的层或过滤器。 由于非常小的模型很可能无法适应您的数据,因此您可以慢慢增加复杂性,直到不再发生适应不足的情况为止。 如果您以这种方式设计模型,则将限制过拟合的可能性,因为您不允许自己拥有的模型对于数据集而言过大。
......
......@@ -120,7 +120,7 @@ def build_graph(self):
# 定位的其他应用
使用 CNN 在图像中输出兴趣点坐标的想法可以扩展到许多其他应用程序。 其中一些包括人体姿势估计(《DeepPose:通过深度神经网络进行人体姿势估计》),如下所示:
使用 CNN 在图像中输出兴趣点坐标的想法可以扩展到许多其他应用。 其中一些包括人体姿势估计(《DeepPose:通过深度神经网络进行人体姿势估计》),如下所示:
![](img/301f40a0-4a5d-4355-bcc2-118d1c180495.png)
......
# 五、VGG,Inception,ResNet 和 MobileNets
到目前为止,我们已经讨论了所有必要的构建块,以便能够实现常见问题(例如图像分类和检测)的解决方案。 在本章中,我们将讨论一些通用模型架构的实现,这些架构在许多常见任务中都表现出了很高的性能。 自从最初创建以来,这些架构一直很流行,并且在今天继续被广泛使用。
到目前为止,我们已经讨论了所有必要的构建块,以便能够实现常见问题(例如图像分类和检测)的解决方案。 在本章中,我们将讨论一些通用模型架构的实现,这些架构在许多常见任务中都表现出了很高的表现。 自从最初创建以来,这些架构一直很流行,并且在今天继续被广泛使用。
在本章的最后,您将对现有的不同类型的 CNN 模型及其在各种不同的计算机视觉问题中的用例进行了解。 在实现这些模型时,您将学习如何设计这些模型以及它们各自的优点。 最后,我们将讨论如何修改这些架构,以使训练和性能/效率更好。
在本章的最后,您将对现有的不同类型的 CNN 模型及其在各种不同的计算机视觉问题中的用例进行了解。 在实现这些模型时,您将学习如何设计这些模型以及它们各自的优点。 最后,我们将讨论如何修改这些架构,以使训练和表现/效率更好。
总之,本章将涵盖以下主题:
......@@ -108,7 +108,7 @@ VGG 最酷的功能之一是,由于其在 conv 层中的内核较小,因此
到那时为止,这是所有参数的六倍以上!
如前所述,您需要在训练数据集中使用大量样本来消耗模型参数,因此最好避免过度使用全连接层来避免参数爆炸。 幸运的是,人们发现,如果最后只有一层而不是三层,那么 VGGNet 的工作原理几乎相同。 因此,删除这些全连接层会从模型中删除大量参数,而不会大大降低性能。 因此,如果您决定实现 VGGNet,我们建议您也这样做。
如前所述,您需要在训练数据集中使用大量样本来消耗模型参数,因此最好避免过度使用全连接层来避免参数爆炸。 幸运的是,人们发现,如果最后只有一层而不是三层,那么 VGGNet 的工作原理几乎相同。 因此,删除这些全连接层会从模型中删除大量参数,而不会大大降低表现。 因此,如果您决定实现 VGGNet,我们建议您也这样做。
# 代码
......@@ -202,7 +202,7 @@ VGG 最酷的功能之一是,由于其在 conv 层中的内核较小,因此
# VGG 的更多信息
2014 年,VGG 在 Imagenet 分类挑战中获得第二名,在 Imagenet 定位挑战中获得第一名。 正如我们所看到的,VGGNet 的设计选择是堆叠许多小的卷积层,从而可以实现更深的结构,同时具有更少的参数(如果我们删除了不必要的全连接层),则性能更好。 这种设计选择在创建强大而高效的网络方面非常有效,以至于几乎所有现代架构都复制了这种想法,并且很少(如果有的话)使用大型过滤器。
2014 年,VGG 在 Imagenet 分类挑战中获得第二名,在 Imagenet 定位挑战中获得第一名。 正如我们所看到的,VGGNet 的设计选择是堆叠许多小的卷积层,从而可以实现更深的结构,同时具有更少的参数(如果我们删除了不必要的全连接层),则表现更好。 这种设计选择在创建强大而高效的网络方面非常有效,以至于几乎所有现代架构都复制了这种想法,并且很少(如果有的话)使用大型过滤器。
事实证明,VGG 模型可以在许多任务中很好地工作,并且由于其简单的架构,它是开始尝试或适应问题需求的理想模型。 但是,它确实有以下问题需要注意:
......@@ -313,7 +313,7 @@ GoogLeNet 的主要优点是,它比 VGG 更为准确,同时使用的参数
其中`g`是非线性激活函数,例如 ReLu 和`F(x) = W[l] g(W[l-1] x)`,即两层堆叠卷积。 ReLu 函数可以在添加`x`之前或之后添加。 剩余的块应由 2 层或更多层组成,因为一层的块没有明显的好处。
为了理解该概念背后的直觉,我们假设我们有一个经过训练的浅层 CNN,其更深的对应层具有与浅层 CNN 相同的层,并且在它们之间随机插入了一些层。 为了拥有一个与浅层模型至少具有相似性能的深层模型,附加层必须近似标识函数。 但是,要学习具有卷积层堆栈的标识函数比将残差函数推为零要困难得多。 换句话说,如果单位函数是最优解,则很容易实现`F(x)`,因此很容易实现`H(x) = x`
为了理解该概念背后的直觉,我们假设我们有一个经过训练的浅层 CNN,其更深的对应层具有与浅层 CNN 相同的层,并且在它们之间随机插入了一些层。 为了拥有一个与浅层模型至少具有相似表现的深层模型,附加层必须近似标识函数。 但是,要学习具有卷积层堆栈的标识函数比将残差函数推为零要困难得多。 换句话说,如果单位函数是最优解,则很容易实现`F(x)`,因此很容易实现`H(x) = x`
另一种思考的方式是,在训练期间,特定的层不仅会从上一层学习一个概念,还会从它之前的其他层学习一个概念。 这比只从上一层学习概念要好。
......
......@@ -609,7 +609,7 @@ BEGAN 的一些优点如下:
# 条件 GAN
条件 GAN 是普通 GAN 的扩展,其中判别器和生成器都被设置为某些特定类别`y`。这具有有趣的应用程序,因为您可以将生成器固定到特定的类,然后使其生成我们选择的特定同一类的多个不同版本。 例如,如果将`y`设置为与 MNIST 中的数字 7 对应的标签,则生成器将仅生成 7 的图像。
条件 GAN 是普通 GAN 的扩展,其中判别器和生成器都被设置为某些特定类别`y`。这具有有趣的应用,因为您可以将生成器固定到特定的类,然后使其生成我们选择的特定同一类的多个不同版本。 例如,如果将`y`设置为与 MNIST 中的数字 7 对应的标签,则生成器将仅生成 7 的图像。
使用条件 GAN,minimax 游戏变为:
......@@ -617,7 +617,7 @@ BEGAN 的一些优点如下:
在这里,我们依赖于额外输入`y`,它是输入图像的类标签。
合并`x``y`,或`z``y`的最简单方法是将它们串联在一起,这样我们的输入向量就更长。 这将创建一个更加受控制的数据集扩充系统。 这是 TensorFlow 代码中的一个示例:
合并`x``y`,或`z``y`的最简单方法是将它们连接在一起,这样我们的输入向量就更长。 这将创建一个更加受控制的数据集扩充系统。 这是 TensorFlow 代码中的一个示例:
![](img/63ca28dd-5605-482d-95b3-4e1c027f3c89.jpg)
......
# 七、迁移学习
迁移学习的作用恰如其名。 这个想法是将从一项任务中学到的东西转移到另一项任务上。 为什么? 实际上,每次都从头开始训练整个模型的效率很低,其成功取决于许多因素。 另一个重要原因是,对于某些应用程序,公开可用的数据集不够大,无法训练出像 AlexNet 或 ResNet 这样的深层架构而又不会过拟合,这意味着无法推广。 示例应用程序可以从用户给出的一些示例中进行在线学习,也可以是细粒度的分类,其中类别之间的差异很小。
迁移学习的作用恰如其名。 这个想法是将从一项任务中学到的东西转移到另一项任务上。 为什么? 实际上,每次都从头开始训练整个模型的效率很低,其成功取决于许多因素。 另一个重要原因是,对于某些应用,公开可用的数据集不够大,无法训练出像 AlexNet 或 ResNet 这样的深层架构而又不会过拟合,这意味着无法推广。 示例应用可以从用户给出的一些示例中进行在线学习,也可以是细粒度的分类,其中类别之间的差异很小。
一个非常有趣的观察结果是,由于您冻结了所有其余部分(无论是检测还是分类),最终的层可以用于完成不同的任务,最终权重看起来非常相似。
......@@ -21,14 +21,14 @@
![](img/b7b186d6-7803-4517-add9-f559586b2576.png)
根据对与 ImageNet 相似度较小的数据集进行的实验,在以下任务上,基于 ImageNet 训练的基于卷积神经网络权重的特征比常规特征提取方法的性能更好:
根据对与 ImageNet 相似度较小的数据集进行的实验,在以下任务上,基于 ImageNet 训练的基于卷积神经网络权重的特征比常规特征提取方法的表现更好:
* **对象识别**:此 CNN 特征提取器可以成功地对其他类别不可见的数据集执行分类任务。
* **域适应**:这是当训练和测试数据来自不同的分布,而标签和类别数相同时。 不同的域可以考虑使用不同的设备或在不同的设置和环境条件下捕获的图像。 具有 CNN 功能的线性分类器可以在不同域中成功地将具有相同语义信息的图像聚类,而 SURF 功能则可以针对特定领域的特征进行过拟合。
* **精细分类**:这是我们要在同一高级类中的子类之间进行分类的时候。 例如,我们可以对鸟类进行分类。 尽管没有对细粒度数据进行训练,但 CNN 功能以及逻辑回归功能的性能优于基线方法。
* **场景识别**:在这里,我们需要对整个图像的场景进行分类。 在对象分类数据库上经过训练的 CNN 特征提取器,顶部带有一个简单的线性分类器,其性能优于应用于识别数据的传统特征提取器的复杂学习算法。
* **精细分类**:这是我们要在同一高级类中的子类之间进行分类的时候。 例如,我们可以对鸟类进行分类。 尽管没有对细粒度数据进行训练,但 CNN 功能以及逻辑回归功能的表现优于基线方法。
* **场景识别**:在这里,我们需要对整个图像的场景进行分类。 在对象分类数据库上经过训练的 CNN 特征提取器,顶部带有一个简单的线性分类器,其表现优于应用于识别数据的传统特征提取器的复杂学习算法。
这里提到的某些任务与图像分类没有直接关系,图像分类是 ImageNet 训练的主要目标,因此有人希望 CNN 功能无法推广到看不见的场景。 但是,这些功能与简单的线性分类器相结合,性能优于手工制作的功能。 这意味着 CNN 的学习权重是可重用的。
这里提到的某些任务与图像分类没有直接关系,图像分类是 ImageNet 训练的主要目标,因此有人希望 CNN 功能无法推广到看不见的场景。 但是,这些功能与简单的线性分类器相结合,表现优于手工制作的功能。 这意味着 CNN 的学习权重是可重用的。
那么什么时候应该使用迁移学习呢? 当我们有一个任务时,由于问题的性质,可用数据集很小(例如对蚂蚁/蜜蜂进行分类)。 在这种情况下,我们可以在包含相似语义信息的较大数据集上训练我们的模型,然后用较小的数据集仅训练最后一层(线性分类器)。 如果我们只有足够的可用数据,并且有一个更大的相似数据集,则对该相似数据集进行预训练可能会导致模型更健壮。 通常情况下,我们使用随机初始化的权重来训练模型,在这种情况下,将使用在其他数据集上训练过的权重来初始化模型。 这将有助于网络更快地融合并更好地推广。 在这种情况下,仅微调模型顶端的几层是有意义的。
......
......@@ -36,9 +36,9 @@
* **训练集**:用于训练机器学习算法的数据/示例集。 在机器学习中,此数据用于查找模型/分类器的“最佳”权重。 通常,使用的大多数数据都进入训练集。
* **开发**/**验证集**:用于在训练的中间阶段评估模型/分类器的数据部分。 该集合用于微调超参数和评估具有各种配置的模型架构。 它在模型开发期间使用,而不是在最终模型评估中使用。
* **测试集**:模型经过微调和充分训练(我们对训练/开发集的损失感到满意),我们认为它已完全训练。 然后评估该模型。 对其进行评估的数据称为测试集。 测试集由数据的看不见部分组成,因此提供了最终模型性能的无偏估计。
* **测试集**:模型经过微调和充分训练(我们对训练/开发集的损失感到满意),我们认为它已完全训练。 然后评估该模型。 对其进行评估的数据称为测试集。 测试集由数据的看不见部分组成,因此提供了最终模型表现的无偏估计。
为了获得高性能的神经网络,将数据集正确划分为训练集,开发集和测试集非常重要。 它有助于更​​快地迭代。 另外,它允许更有效地测量算法的偏差和方差,以便我们可以选择有效方式进行改进的方法。
为了获得高表现的神经网络,将数据集正确划分为训练集,开发集和测试集非常重要。 它有助于更​​快地迭代。 另外,它允许更有效地测量算法的偏差和方差,以便我们可以选择有效方式进行改进的方法。
在以前的时代,我们拥有较小的数据集(例如最多 10,000 个示例)和简单的分类器,我们会将数据集拆分为训练和测试集。 通常将训练集分成较小的集,以使用称为交叉验证的技术来训练分类器。 优良作法是按 60/20/20 的比例拆分数据集(即 60% 的训练数据,20% 的开发数据,20% 的测试数据)。 但是,大数据的现代时代已经改变了这一经验法则。 如果我们有 1,000,000 个示例,则拆分比例已更改为 98/1/1(即 98% 的训练数据,1% 的开发数据,1% 的测试数据)。
......@@ -48,11 +48,11 @@
# 开发和测试集不匹配
除了拆分数据之外,数据的分布还对神经网络的性能产生巨大影响。 应用深度学习中的大多数问题来自开发人员和测试集数据分布的不匹配。 我们需要记住,开发和测试数据应该来自类似的分发。 例如,如果我们以如下方式收集和分割人员检测数据,即从网页上收集人员的训练图像,而使用移动电话收集测试集图像,则会出现分布不匹配的情况。 这里的问题是,在训练模型时,我们会根据其在开发数据上的性能来微调网络的参数和架构,如果开发数据与训练数据相似且与测试数据不同,则与训练集相比开发数据中存在很高的偏差。 在开发集上获得良好的评估结果并不一定意味着该模型可以很好地推广。 在这种情况下,对分布完全不同的集合进行测试可能会导致不良结果。 这是浪费时间和精力。 解决方案是首先合并开发集和测试集,随机将它们洗牌,最后将洗过的数据再次拆分为开发集和测试集。 这有助于在将机器学习算法成功训练到最终应用程序方面取得更快的进展。
除了拆分数据之外,数据的分布还对神经网络的表现产生巨大影响。 应用深度学习中的大多数问题来自开发人员和测试集数据分布的不匹配。 我们需要记住,开发和测试数据应该来自类似的分发。 例如,如果我们以如下方式收集和分割人员检测数据,即从网页上收集人员的训练图像,而使用移动电话收集测试集图像,则会出现分布不匹配的情况。 这里的问题是,在训练模型时,我们会根据其在开发数据上的表现来微调网络的参数和架构,如果开发数据与训练数据相似且与测试数据不同,则与训练集相比开发数据中存在很高的偏差。 在开发集上获得良好的评估结果并不一定意味着该模型可以很好地推广。 在这种情况下,对分布完全不同的集合进行测试可能会导致不良结果。 这是浪费时间和精力。 解决方案是首先合并开发集和测试集,随机将它们洗牌,最后将洗过的数据再次拆分为开发集和测试集。 这有助于在将机器学习算法成功训练到最终应用方面取得更快的进展。
# 何时更改开发/测试集
根据评估指标对开发/测试集执行良好但不满足客户要求(即在部署时执行不佳)的算法,表明我们在数据集中缺少正确的目标数据。 在这种情况下,我们需要对数据集进行更改,因为它对于目标应用程序而言不够代​​表性。 考虑对猫图像进行分类。 如果训练/开发/测试集使用的是高分辨率,高质量的图像(姿势完美的猫),而目标应用正在查看具有不同视角的猫或运动中的图像(模糊),则可以期望算法在部署时表现不佳。
根据评估指标对开发/测试集执行良好但不满足客户要求(即在部署时执行不佳)的算法,表明我们在数据集中缺少正确的目标数据。 在这种情况下,我们需要对数据集进行更改,因为它对于目标应用而言不够代​​表性。 考虑对猫图像进行分类。 如果训练/开发/测试集使用的是高分辨率,高质量的图像(姿势完美的猫),而目标应用正在查看具有不同视角的猫或运动中的图像(模糊),则可以期望算法在部署时表现不佳。
![](img/d33ade2f-7c16-473c-974d-7ba1a204b47d.png)
......@@ -60,11 +60,11 @@
如第 2 章,“深度学习和卷积神经网络”中所讨论的,方差和偏差分别表示过拟合和欠拟合。 我们可以使用训练集,开发集和测试集错误来诊断“欠拟合”和“过拟合”的问题。
考虑以下场景,其中我们的数据来自两个不同的分布,分别称为分布 1 和分布 2。分布 2 表示我们关心的目标应用程序。 问题是,我们如何在这种分布上定义训练,开发和测试集。
考虑以下场景,其中我们的数据来自两个不同的分布,分别称为分布 1 和分布 2。分布 2 表示我们关心的目标应用。 问题是,我们如何在这种分布上定义训练,开发和测试集。
![](img/00d0d711-3009-4542-bb6e-3988f1007b50.png)
最好的方法是根据上图将其拆分。 分布 1 被拆分为训练集,其一部分用作开发集。 在这里,我们称其为“训练开发集”(因为开发集与训练集具有相同的分布)。 分布 1 主要用于训练,因为它是一个大型数据集。 分布 2 分为测试集和开发集,它们与分布 1 中的任一集无关。这里要强调的一点是,测试和开发集应来自同一发行版,并且属于我们实际上关心的应用程序,即目标应用程序。 开发集和测试集通常是小的数据集,因为它们的目的是给出模型/算法的无偏性能估计。
最好的方法是根据上图将其拆分。 分布 1 被拆分为训练集,其一部分用作开发集。 在这里,我们称其为“训练开发集”(因为开发集与训练集具有相同的分布)。 分布 1 主要用于训练,因为它是一个大型数据集。 分布 2 分为测试集和开发集,它们与分布 1 中的任一集无关。这里要强调的一点是,测试和开发集应来自同一发行版,并且属于我们实际上关心的应用,即目标应用。 开发集和测试集通常是小的数据集,因为它们的目的是给出模型/算法的无偏表现估计。
模型在不同数据集分区上的误差差异,以及查看人为误差可为我们提供诊断偏见和方差问题的见解
......@@ -127,15 +127,15 @@ ML 基本秘籍
# 数据不平衡
我们已经看到了数据表示和分布在解决偏差和方差问题中的重要性。 我们遇到的另一个相关问题是分类任务中各个类之间的数据分配不均。 这称为数据不平衡。 例如,如果我们有一个二进制分类问题,并且其中一个类别有 50000 张图像,而另一个类别只有 1000 张图像,这可能会导致训练算法的性能出现巨大问题。 我们必须通过以下方法解决数据不平衡的问题:
我们已经看到了数据表示和分布在解决偏差和方差问题中的重要性。 我们遇到的另一个相关问题是分类任务中各个类之间的数据分配不均。 这称为数据不平衡。 例如,如果我们有一个二进制分类问题,并且其中一个类别有 50000 张图像,而另一个类别只有 1000 张图像,这可能会导致训练算法的表现出现巨大问题。 我们必须通过以下方法解决数据不平衡的问题:
# 收集更多数据
是的,最好使类数据分布相等。 收集尽可能多的数据,并用较少的样本填充类。 为此,您可以在互联网上搜索与您的问题相似的数据库并将其包括在内。 简单的网络搜索还可以带来许多由各种来源上传的图像。 有时您会发现,使用更多数据不会提高模型性能。 这表明您的模型可能已达到极限。
是的,最好使类数据分布相等。 收集尽可能多的数据,并用较少的样本填充类。 为此,您可以在互联网上搜索与您的问题相似的数据库并将其包括在内。 简单的网络搜索还可以带来许多由各种来源上传的图像。 有时您会发现,使用更多数据不会提高模型表现。 这表明您的模型可能已达到极限。
# 查看您的效果指标
分类准确性不是一个很好的衡量标准,尤其是当我们的数据不平衡时。 这种准确性将更倾向于具有更多数据的类。 有许多良好的性能评估指标可以真实地描述算法的执行方式,例如混淆矩阵,**受试者工作特性曲线**(ROC),**精确召回**(PR)曲线和 F1 分数。 这些将在本章稍后详细说明。
分类准确性不是一个很好的衡量标准,尤其是当我们的数据不平衡时。 这种准确性将更倾向于具有更多数据的类。 有许多良好的表现评估指标可以真实地描述算法的执行方式,例如混淆矩阵,**受试者工作特性曲线**(ROC),**精确召回**(PR)曲线和 F1 分数。 这些将在本章稍后详细说明。
# 数据综合/增强
......@@ -168,7 +168,7 @@ Tensorflow 已经具有其损失函数,并内置了加权选项:
# 评价指标
在为模型选择评估指标时,我们还需要小心。 假设对于狗/非狗分类问题,我们有两种算法的准确度分别为 98% 和 96%。 乍一看,这些算法看起来都具有相似的性能。 让我们记住,分类准确度定义为做出的正确预测数除以做出的预测总数。 换句话说,真阳性(TP)和真阴性(TN)预测数除以预测总数。 但是,可能出现的情况是,随着狗图像的出现,我们还会得到大量被错误分类为狗的背景或类似外观的对象,通常称为假阳性(FP)。 另一个不良行为可能是许多狗图像被错误分类为负面或假阴性(FN)。 显然,根据定义,分类准确性不能捕获误报或误报的概念。 因此,需要更好的评估指标。
在为模型选择评估指标时,我们还需要小心。 假设对于狗/非狗分类问题,我们有两种算法的准确度分别为 98% 和 96%。 乍一看,这些算法看起来都具有相似的表现。 让我们记住,分类准确度定义为做出的正确预测数除以做出的预测总数。 换句话说,真阳性(TP)和真阴性(TN)预测数除以预测总数。 但是,可能出现的情况是,随着狗图像的出现,我们还会得到大量被错误分类为狗的背景或类似外观的对象,通常称为假阳性(FP)。 另一个不良行为可能是许多狗图像被错误分类为负面或假阴性(FN)。 显然,根据定义,分类准确性不能捕获误报或误报的概念。 因此,需要更好的评估指标。
第一步,我们将构建一个混淆矩阵,该矩阵总结最后显示的段落:
......@@ -267,7 +267,7 @@ NPV: TN / (TN + FN) = 0.99
| 1.08 | 0.005 | 0.84 | 0.98 | 416 | 985 | 78 | 5 |
| 1.16 | 0.001 | 0.69 | 0.99 | 344 | 989 | 150 | 1 |
如果将 FPR 与 TPR 作图,我们将得到所谓的 ROC(接收机操作员特性)曲线,如下所示:
如果将 FPR 与 TPR 作图,我们将得到所谓的 ROC(受试者工作特性)曲线,如下所示:
![](img/a38d1883-1a58-4a94-9a77-67facda77864.png)
......@@ -362,6 +362,6 @@ class CAE_CNN_Encoder(object):
# 总结
在本章中,我们了解到遵循最佳实践将对作为机器学习工程师的日常活动有所帮助。 我们已经看到了如何准备数据集并将其拆分为子集,以促进对网络的正确训练和微调。 此外,我们还研究了执行有意义的测试,其中获得的结果代表了将模型部署到目标应用程序时所看到的结果。 涉及的另一个主题是对数据的过拟合和不足,以及为了解决这些问题而应遵循的最佳实践。 此外,解决了数据集不平衡的问题,我们已经看到了一个简单的示例,该示例可能在哪里找到(疾病诊断)。 为了解决这个问题,建议收集更多的数据,扩充数据集并选择不平衡数据集不变的评估指标。 最后,展示了如何构造代码以使其更具可读性和重用性。
在本章中,我们了解到遵循最佳实践将对作为机器学习工程师的日常活动有所帮助。 我们已经看到了如何准备数据集并将其拆分为子集,以促进对网络的正确训练和微调。 此外,我们还研究了执行有意义的测试,其中获得的结果代表了将模型部署到目标应用时所看到的结果。 涉及的另一个主题是对数据的过拟合和不足,以及为了解决这些问题而应遵循的最佳实践。 此外,解决了数据集不平衡的问题,我们已经看到了一个简单的示例,该示例可能在哪里找到(疾病诊断)。 为了解决这个问题,建议收集更多的数据,扩充数据集并选择不平衡数据集不变的评估指标。 最后,展示了如何构造代码以使其更具可读性和重用性。
在下一章中,我们将看到如何管理大型数据集以及如何将训练过程扩展到多个 GPU 和系统。
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册