提交 7faad066 编写于 作者: W wizardforcel

2020-09-13 22:51:44

上级 328a0bf8
......@@ -13,23 +13,23 @@
# 本书涵盖的内容
[第 1 章](../Text/1.xhtml)*Tensorflow 的设置和简介,*涵盖了 TensorFlow 的设置和安装,以及编写用于机器学习的简单 Tensorflow 模型。
第 1 章,“Tensorflow 的设置和简介”,涵盖了 TensorFlow 的设置和安装,以及编写用于机器学习的简单 Tensorflow 模型。
[第 2 章](../Text/2.xhtml)*深度学习和卷积神经网络*向您介绍了机器学习,人工智能以及人工神经网络以及如何对其进行训练。 它还涵盖了 CNN 以及如何使用 TensorFlow 训练自己的 CNN。
第 2 章,“深度学习和卷积神经网络”向您介绍了机器学习,人工智能以及人工神经网络以及如何对其进行训练。 它还涵盖了 CNN 以及如何使用 TensorFlow 训练自己的 CNN。
[第 3 章](../Text/3.xhtml)*Tensorflow* 中的图像分类,讨论了如何构建 CNN 模型以及如何训练它们以对 CIFAR10 数据集进行分类。 它还探讨了通过谈论初始化和正则化的不同方法来帮助提高我们训练后的模型的质量的方法。
第 3 章,“Tensorflow 中的图像分类”,讨论了如何构建 CNN 模型以及如何训练它们以对 CIFAR10 数据集进行分类。 它还探讨了通过谈论初始化和正则化的不同方法来帮助提高我们训练后的模型的质量的方法。
[第 4 章](../Text/4.xhtml)*对象检测和分割*教授对象定位,检测和分割的基础知识以及与这些主题相关的最著名的算法。
第 4 章,“对象检测和分割”教授对象定位,检测和分割的基础知识以及与这些主题相关的最著名的算法。
[第 5 章](../Text/5.xhtml)*VGG,接收模块,残差和 MobileNets* 向您介绍了不同的卷积神经网络设计,例如 VGGNet,GoggLeNet 和 MobileNet。
第 5 章,“VGG,接收模块,残差和 MobileNets”向您介绍了不同的卷积神经网络设计,例如 VGGNet,GoggLeNet 和 MobileNet。
[第 6 章](../Text/6.xhtml)*自动编码器,变体自动编码器和生成对抗网络,*向您介绍生成模型,生成对抗网络和不同类型的编码器。
第 6 章,“自编码器,变分自编码器和生成对抗网络”,向您介绍生成模型,生成对抗网络和不同类型的编码器。
[第 7 章](../Text/7.xhtml)*转移学习,*涵盖了转移学习的用法并在我们自己的任务中实现。
第 7 章,“迁移学习”,涵盖了迁移学习的用法并在我们自己的任务中实现。
[第 8 章](../Text/8.xhtml)*机器学习最佳实践和* *故障排除,*向我们介绍了如何准备并将数据集拆分为子集并执行有意义的测试。 本章还讨论了过拟合和过拟合以及解决这些问题的最佳实践。
第 8 章,“机器学习最佳实践和故障排除”,向我们介绍了如何准备并将数据集拆分为子集并执行有意义的测试。 本章还讨论了过拟合和过拟合以及解决这些问题的最佳实践。
[第 9 章](../Text/9.xhtml)*大规模培训,*教您如何在多个 GPU 和机器上训练 TensorFlow 模型。 它还涵盖了存储数据并将其输入模型的最佳实践。
第 9 章,“大规模训练”,教您如何在多个 GPU 和机器上训练 TensorFlow 模型。 它还涵盖了存储数据并将其输入模型的最佳实践。
# 充分利用这本书
......
......@@ -330,7 +330,7 @@ initializer = tf.global_variables_initializer()
这个概念实际上是非常直观的,因为如果我们的权重和偏见得到了正确的训练,那么所产生的三个得分中的最高得分就可以自信地表明输入示例所属的正确类别。
由于在培训期间,我们会一次输入许多培训示例,因此,我们将获得多个需要平均的损失。 因此,需要最小化的总损耗方程如下:
由于在训练期间,我们会一次输入许多训练示例,因此,我们将获得多个需要平均的损失。 因此,需要最小化的总损耗方程如下:
![](img/5a3e2008-78d9-46de-b9a2-52e4d5d540d2.png)
......
......@@ -40,7 +40,7 @@ ML 使用诸如统计分析,概率模型,决策树和神经网络之类的*
假设对于我们的手部数据,我们有 1000 张不同的图像,现在我们已经对其进行处理以提取每个图像的特征向量。 在机器学习阶段,所有特征向量都将被提供给创建模型的机器学习系统。 我们希望该模型能够推广并能够预测未经过系统训练的任何未来图像的数字。
ML 系统的组成部分是评估。 在评估模型时,我们会看到模型在特定任务中的表现。 在我们的示例中,我们将研究它可以多么准确地从图像中预测数字。 90%的准确度意味着正确预测了 100 张给定图像中的 90 张。 在接下来的章节中,我们将更详细地讨论机器培训和评估过程。
ML 系统的组成部分是评估。 在评估模型时,我们会看到模型在特定任务中的表现。 在我们的示例中,我们将研究它可以多么准确地从图像中预测数字。 90%的准确度意味着正确预测了 100 张给定图像中的 90 张。 在接下来的章节中,我们将更详细地讨论机器训练和评估过程。
# ML 的类型
......@@ -54,13 +54,13 @@ ML 系统的组成部分是评估。 在评估模型时,我们会看到模型
无监督学习的另一种用途是找到方法,以减少我们正在使用的数据的维度,这又是通过找到数据中的重要特征并丢弃不重要的特征来实现的。
无监督技术包括 PCA,t-SNE,K-means,自动编码器,深度自动编码器等。
无监督技术包括 PCA,t-SNE,K-means,自编码器,深度自编码器等。
下图说明了分类和聚类之间的区别(当我们需要在非监督数据上查找结构时)。
![](img/9b300c7e-a825-46fe-aebc-12d8367fdeef.jpg)
**强化学习**:第三种是关于培训代理在环境中执行某些操作的全部。 我们知道理想的结果,但不知道如何实现。 我们没有给数据加标签,而是给代理提供反馈,告诉它完成任务的好坏。 强化学习超出了本书的范围。
**强化学习**:第三种是关于训练代理在环境中执行某些操作的全部。 我们知道理想的结果,但不知道如何实现。 我们没有给数据加标签,而是给代理提供反馈,告诉它完成任务的好坏。 强化学习超出了本书的范围。
# 新旧机器学习
......@@ -80,7 +80,7 @@ ML 工程师可能会遵循的典型流程来开发预测模型,如下所示
ML 的新型深度学习方法具有的最酷的功能是,它们不需要(或需要更少)特征提取阶段。 相反,使用足够大的数据集,模型本身就能够直接从数据本身中学习代表数据的最佳特征! 这些新方法的示例如下:
* 深度 CNN
* 深度自编码器
* 深度自编码器
* **生成对抗网络****GAN** s)
所有这些方法都是深度学习过程的一部分,在该过程中,大量数据暴露于多层神经网络。 但是,这些新方法的好处是有代价的。 所有这些新算法都需要更多的计算资源(CPU 和 GPU),并且比传统方法需要更长的训练时间。
......@@ -141,7 +141,7 @@ ML 的新型深度学习方法具有的最酷的功能是,它们不需要(
那么,我们该如何在神经网络中设置权重和偏差的值,从而最好地解决我们的问题呢? 好吧,这是在训练阶段完成的。 在此阶段中,我们希望使神经网络从训练数据集中“学习”。 训练数据集由一组输入(通常表示为 X)以及相应的所需输出或标签(通常表示为 Y)组成。
当我们说网络学习时,所发生的就是网络参数被更新,网络应该能够为训练数据集中的每个 X 输出正确的 Y。 期望的是,在对网络进行培训之后,它将能够针对培训期间未看到的新输入进行概括并表现良好。 但是,为了做到这一点,您必须有一个足够具有代表性的数据集,以捕获要输出的内容。 例如,如果要分类汽车,则需要具有不同类型,颜色,照度等的数据集。
当我们说网络学习时,所发生的就是网络参数被更新,网络应该能够为训练数据集中的每个 X 输出正确的 Y。 期望的是,在对网络进行训练之后,它将能够针对训练期间未看到的新输入进行概括并表现良好。 但是,为了做到这一点,您必须有一个足够具有代表性的数据集,以捕获要输出的内容。 例如,如果要分类汽车,则需要具有不同类型,颜色,照度等的数据集。
通常,当我们没有足够的数据或者我们的模型不够复杂以至于无法捕获数据的复杂性时,就会出现训练机器学习模型的一个常见错误。 这些错误可能导致过度拟合和拟合不足的问题。 在以后的章节中,您将学习如何在实践中处理这些问题。
......@@ -176,7 +176,7 @@ ML 的新型深度学习方法具有的最酷的功能是,它们不需要(
# 分批
对于大型数据集而言,将整个数据集存储在内存中以训练网络的想法,例如[第 1 章](../Text/1.xhtml)*设置和 TensorFlow 简介*中的示例。 人们在实践中所做的是,在训练期间,他们将数据集分成小块,称为迷你批次(通常称为批次)。 然后,依次将每个微型批次装入并馈送到网络,在网络中将计算反向传播和梯度下降算法,然后更新权重。 然后,对每个小批量重复此操作,直到您完全浏览了数据集。
对于大型数据集而言,将整个数据集存储在内存中以训练网络的想法,例如第 1 章*设置和 TensorFlow 简介*中的示例。 人们在实践中所做的是,在训练期间,他们将数据集分成小块,称为迷你批次(通常称为批次)。 然后,依次将每个微型批次装入并馈送到网络,在网络中将计算反向传播和梯度下降算法,然后更新权重。 然后,对每个小批量重复此操作,直到您完全浏览了数据集。
为小批量计算的梯度是对整个训练集的真实梯度的噪声估计,但是通过反复获取这些小的噪声更新,我们最终仍将收敛到足够接近损失函数的最小值。
......@@ -212,7 +212,7 @@ TensorFlow 的以下代码行也显示了这一点,因为损失仅需要标签
loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)
```
您可能会注意到第三个箭头也连接到损失功能。 这与名为正则化的东西有关,将在[第 3 章](../Text/3.xhtml)*TensorFlow* 中的图像分类中进行探讨; 因此,现在您可以放心地忽略它。
您可能会注意到第三个箭头也连接到损失功能。 这与名为正则化的东西有关,将在第 3 章*TensorFlow* 中的图像分类中进行探讨; 因此,现在您可以放心地忽略它。
# 优化器及其超参数
......@@ -270,7 +270,7 @@ TensorFlow 的所有不同优化器都可以在`tf.train`类中找到。 例如
# 功能缩放
为了简化优化程序算法的工作,在培训和测试之前,有一些技术可以并且应该应用到您的数据中。
为了简化优化程序算法的工作,在训练和测试之前,有一些技术可以并且应该应用到您的数据中。
如果输入向量的不同维度上的值彼此不成比例,则损失空间将以某种方式扩大。 这将使梯度下降算法难以收敛,或者至少使其收敛较慢。
......@@ -288,7 +288,7 @@ TensorFlow 的所有不同优化器都可以在`tf.train`类中找到。 例如
组成我们之前看到的 ANN 的神经元层通常称为密集连接层,或**完全连接的****FC** )层,或简称为线性层。 诸如 Caffe 之类的一些深度学习库实际上会将它们视为点乘积运算,非线性层可能会或可能不会跟随它们。 它的主要参数将是输出大小,基本上是其输出中神经元的数量。
[第 1 章](../Text/1.xhtml)*设置和 TensorFlow* 简介中,我们创建了自己的致密层,但是您可以使用`tf.layers`来更轻松地创建它,如下所示:
第 1 章*设置和 TensorFlow* 简介中,我们创建了自己的致密层,但是您可以使用`tf.layers`来更轻松地创建它,如下所示:
```py
dense_layer = tf.layers.dense(inputs=some_input_layer, units=1024, activation=tf.nn.relu)
......@@ -592,7 +592,7 @@ tf.layers.max_pooling2d(inputs=some_input_layer, pool_size=[2, 2], strides=2)
在开始之前,有个好消息:使用 TensorFlow,您无需担心编写反向传播或梯度下降代码,而且所有常见类型的层都已实现,因此事情应该更轻松。
在此处的 TensorFlow 示例中,我们将根据您在[第 1 章](../Text/1.xhtml)*设置和 TensorFlow* 简介中学到的内容进行一些更改,并使用`tf.layers` API 创建整个 我们的网络轻松自如:
在此处的 TensorFlow 示例中,我们将根据您在第 1 章*设置和 TensorFlow* 简介中学到的内容进行一些更改,并使用`tf.layers` API 创建整个 我们的网络轻松自如:
```py
import tensorflow as tf
......@@ -736,7 +736,7 @@ with tf.Session() as sess:
* **深度卷积**:用于 MobileNets,旨在使卷积对移动平台友好
* **膨胀卷积(Atrous 卷积)**:它们具有称为膨胀率的额外参数,可让您以相同的计算成本获得更大的视野(例如 3x3 CONV 可以具有相同的视野 作为 5x5 CONV)
* **转置卷积(Deconvolutions)**:通常用于 CNN 自编码器和语义分割问题
* **转置卷积(Deconvolutions)**:通常用于 CNN 自编码器和语义分割问题
# 摘要
......
# TensorFlow 中的图像分类
图像分类是指根据图像内容将图像分类的问题。 让我们从分类的示例任务开始,其中图片可能是狗的图像,也可能不是。 某人可能要完成此任务的一种简单方法是,像在[第 1 章](../Text/1.xhtml)中所做的那样,获取输入图像,将其重塑为矢量,然后训练线性分类器(或其他某种分类器)。 ],设置和 TensorFlow 简介。 但是,您很快就会发现此主意不好,原因有几个。 除了不能很好地缩放到输入图像的大小之外,线性分类器将很难将一个图像与另一个图像分开。
图像分类是指根据图像内容将图像分类的问题。 让我们从分类的示例任务开始,其中图片可能是狗的图像,也可能不是。 某人可能要完成此任务的一种简单方法是,像在第 1 章中所做的那样,获取输入图像,将其重塑为矢量,然后训练线性分类器(或其他某种分类器)。 ],设置和 TensorFlow 简介。 但是,您很快就会发现此主意不好,原因有几个。 除了不能很好地缩放到输入图像的大小之外,线性分类器将很难将一个图像与另一个图像分开。
与可以在图像中看到有意义的图案和内容的人类相反,计算机只能看到从 0 到 255 的数字数组。对于同一类的不同图像,这些数字在相同位置的广泛波动导致无法直接使用它们 作为分类器的输入。 从**加拿大高级研究学院****CIFAR** )数据集中获取的这 10 张示例狗图像完美地说明了此问题。 狗的外观不仅有所不同,而且它们在镜头前的姿势和位置也有所不同。 对于机器来说,每个图像一目了然,完全没有共同点,而我们人类却可以清楚地看到它们都是狗:
......@@ -23,7 +23,7 @@
# CNN 模型架构
图像分类模型的关键部分是其 CNN 层。 这些层将负责从图像数据中提取特征。 这些 CNN 图层的输出将是一个特征向量,就像以前一样,我们可以将其用作所选分类器的输入。 对于许多 CNN 模型,分类器将只是连接到我们 CNN 输出的完全连接层。 如[第 1 章](../Text/1.xhtml)*设置和 TensorFlow* 简介中所示,我们的线性分类器只是一个完全连接的层; 除了层的大小和输入会有所不同之外,这里就是这种情况。
图像分类模型的关键部分是其 CNN 层。 这些层将负责从图像数据中提取特征。 这些 CNN 图层的输出将是一个特征向量,就像以前一样,我们可以将其用作所选分类器的输入。 对于许多 CNN 模型,分类器将只是连接到我们 CNN 输出的完全连接层。 如第 1 章*设置和 TensorFlow* 简介中所示,我们的线性分类器只是一个完全连接的层; 除了层的大小和输入会有所不同之外,这里就是这种情况。
重要的是要注意,分类或回归问题(例如本地化)(或其他使用图像的其他问题)所使用的 CNN 架构在本质上是相同的。 唯一真正的不同是,在 CNN 层完成特征提取之后会发生什么。 例如,一个差异可能是用于不同任务的损失函数,如下图所示:
......@@ -61,7 +61,7 @@ loss = tf.losses.sigmoid_cross_entropy(multi_class_labels=labels_in, logits=mode
# 多类交叉熵损失
多类交叉熵损失用于多类分类中,例如[第 2 章](../Text/2.xhtml)*深度学习和卷积神经网络*中的 MNIST 数字分类问题。 像上面一样,我们使用交叉熵函数,经过几次计算,我们为每个训练示例获得了多类交叉熵损失 *L*
多类交叉熵损失用于多类分类中,例如第 2 章,“深度学习和卷积神经网络”中的 MNIST 数字分类问题。 像上面一样,我们使用交叉熵函数,经过几次计算,我们为每个训练示例获得了多类交叉熵损失 *L*
![](img/b53e5bab-5f7a-4cf0-b749-92b36255f365.png)
......@@ -81,7 +81,7 @@ loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=model_logit
# 训练/测试数据集拆分
暂时请注意,我们需要将数据集分为两组:训练和测试。 正如[第 1 章](../Text/1.xhtml)*设置和 TensorFlow 简介,*中所述,这是因为我们需要以某种方式检查模型是否能够从其自身的训练样本中进行概括(是否 能够正确识别训练中从未见过的图像)。 如果我们的模型不能做到这一点,对我们来说就没有太大用处。
暂时请注意,我们需要将数据集分为两组:训练和测试。 正如第 1 章*设置和 TensorFlow 简介,*中所述,这是因为我们需要以某种方式检查模型是否能够从其自身的训练样本中进行概括(是否 能够正确识别训练中从未见过的图像)。 如果我们的模型不能做到这一点,对我们来说就没有太大用处。
还有一些其他要记住的重要点:
......@@ -333,7 +333,7 @@ decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)
最后一种方法是使用我们的验证集,并查看验证集上的当前准确性。 在验证准确性不断提高的同时,我们对学习率无能为力。 一旦验证准确性停止增加,我们就将学习率降低某种程度。 重复此过程,直到训练结束。
所有方法都可以产生良好的结果,当您进行培训以查看哪种方法更适合您时,可能值得尝试所有这些不同的方法。 对于此特定模型,我们将使用第二种方法,即学习速率呈指数衰减。 我们使用 TensorFlow 操作`tf.train.exponential_decay`来执行此操作,该操作遵循前面显示的公式。 作为输入,它采用当前的学习率,全局步长,衰减之前的步数和衰减率。
所有方法都可以产生良好的结果,当您进行训练以查看哪种方法更适合您时,可能值得尝试所有这些不同的方法。 对于此特定模型,我们将使用第二种方法,即学习速率呈指数衰减。 我们使用 TensorFlow 操作`tf.train.exponential_decay`来执行此操作,该操作遵循前面显示的公式。 作为输入,它采用当前的学习率,全局步长,衰减之前的步数和衰减率。
在每次迭代中,当前的学习速率都会提供给我们的 Adam Optimizer,后者使用`minimize`函数,该函数使用梯度下降来使损失最小化并将`global_step`变量增加 1。 最后,在训练期间,将`learning_rate``global_step`添加到摘要数据以在 TensorBoard 上显示:
......@@ -451,7 +451,7 @@ decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)
# 主要训练循环
一旦检索到数据并构建了图形,就可以开始我们的主要训练循环,该循环将继续进行 20,000 多次迭代。 在每次迭代中,都使用 CPU 设备获取一批训练数据,并调用`AdamOptimizer`对象的`__train_step.run`方法向前运行一次,向后运行一次。 每进行 100 次迭代,我们就会对当前的培训和测试批次进行一次前向传递,以收集培训和验证损失以及其他汇总数据。 然后,`FileWriter`对象的`add_summary`方法将提供的 TensorFlow 摘要:`summary_1``summary_2`包装在事件协议缓冲区中,并将其添加到事件文件中:
一旦检索到数据并构建了图形,就可以开始我们的主要训练循环,该循环将继续进行 20,000 多次迭代。 在每次迭代中,都使用 CPU 设备获取一批训练数据,并调用`AdamOptimizer`对象的`__train_step.run`方法向前运行一次,向后运行一次。 每进行 100 次迭代,我们就会对当前的训练和测试批次进行一次前向传递,以收集训练和验证损失以及其他汇总数据。 然后,`FileWriter`对象的`add_summary`方法将提供的 TensorFlow 摘要:`summary_1``summary_2`包装在事件协议缓冲区中,并将其添加到事件文件中:
```py
# Train Loop
......@@ -560,7 +560,7 @@ bias_initializer=tf.zeros_initializer())
我们使用的 CNN 架构是可以提高模型泛化能力的方法之一。 要记住的一种简单技术是从设计模型开始就尽可能简单地使用很少的图层或滤镜。 由于非常小的模型很可能无法适应您的数据,因此您可以慢慢增加复杂性,直到不再发生适应不足的情况为止。 如果您以这种方式设计模型,则将限制过拟合的可能性,因为您不允许自己拥有的模型对于数据集而言过大。
但是,在本节中,我们将探索我们可以做的其他一些事情,以建立更好的机器学习模型,以及如何将它们纳入我们的培训过程中。 以下方法旨在防止过度拟合,并通过这样做,有助于创建更强大的模型,并能更好地进行泛化。 防止模型过度拟合的过程称为**正则化**
但是,在本节中,我们将探索我们可以做的其他一些事情,以建立更好的机器学习模型,以及如何将它们纳入我们的训练过程中。 以下方法旨在防止过度拟合,并通过这样做,有助于创建更强大的模型,并能更好地进行泛化。 防止模型过度拟合的过程称为**正则化**
另一个可能也会发生并且看起来与过度拟合非常相似的问题是,如果您的训练数据集没有捕获您想要分类的所有事物。 例如,如果您正在训练狗分类器,但是您的训练图像仅包含贵宾犬的图像。 如果要在 Labradors 上测试此训练有素的分类器,则可能无法分类。 这种数据不平衡是一个单独的问题,将在后面的章节中解决。
......@@ -570,7 +570,7 @@ bias_initializer=tf.zeros_initializer())
为此,我们在使用的任何损失函数中增加了一个额外的项。 对于 L1 正则化,我们添加的术语是![](img/c268cf6e-ae76-4959-97fa-cc3cec5a6481.png),对于 L2 正则化,我们添加的术语是![](img/ed95b274-32f1-4c6a-80fc-3843d1c55f48.png)。 在前面的术语中,![](img/1104730d-78f3-469a-bc47-be1042611784.png)是我们网络中的所有权重,![](img/325652fe-77e5-434c-ae47-8c4d05c6daa0.png)是称为**正则化强度**的超参数。 通过添加该术语,我们可以防止权重值变得太大。
因此,用于[L1 正则化]的[第 1 章](../Text/1.xhtml)*设置和 TensorFlow 简介*的 SVM 丢失函数,即![](img/cfe9a672-085c-42e6-a838-2f8620ea6afb.png)变为:
因此,用于[L1 正则化]的第 1 章,*设置和 TensorFlow 简介*的 SVM 丢失函数,即![](img/cfe9a672-085c-42e6-a838-2f8620ea6afb.png)变为:
![](img/77172207-ce67-4347-b51e-bf6565a195fd.png)
......@@ -647,7 +647,7 @@ fc1 = tf.layers.dropout(fc1, rate=dropout, training=is_training)
# 批处理规范层
之前,我们已经完成了权重的初始化工作,以使梯度下降优化器的工作更加轻松。 但是,好处仅在培训的早期阶段才能看到,并不能保证在后期阶段有所改善。 那就是我们转向另一个称为批处理规范层的伟大发明的地方。 在 CNN 模型中使用批处理规范层产生的效果与[第 2 章](../Text/2.xhtml)*深度学习和卷积神经网络*中看到的输入标准化大致相同。 现在唯一的区别是,这将在模型中所有卷积层和完全连接层的输出处发生。
之前,我们已经完成了权重的初始化工作,以使梯度下降优化器的工作更加轻松。 但是,好处仅在训练的早期阶段才能看到,并不能保证在后期阶段有所改善。 那就是我们转向另一个称为批处理规范层的伟大发明的地方。 在 CNN 模型中使用批处理规范层产生的效果与第 2 章,“深度学习和卷积神经网络”中看到的输入标准化大致相同。 现在唯一的区别是,这将在模型中所有卷积层和完全连接层的输出处发生。
批处理规范层通常将附加到每个完全连接或卷积层的末端,但是在激活功能之前,它将对层输出进行规范化,如下图所示。 它通过获取图层输出(一批激活)并减去批次平均值并除以批次标准偏差来执行此操作,因此图层输出具有零均值和单位标准偏差。 请注意,在激活函数之前或之后放置 batchnorm 是一个引起激烈争论的话题,但是两者都应该起作用。
......@@ -660,12 +660,12 @@ fc1 = tf.layers.dropout(fc1, rate=dropout, training=is_training)
批处理规范层的一些优点如下:
* 改善梯度流动,允许训练更深层的网络(解决消失的梯度问题)
* 允许更高的学习率,使培训更快
* 允许更高的学习率,使训练更快
* 减少对良好权重初始化的依赖(更简单的随机初始化)
* 给您的模型某种正则化效果
* 使得可以使用饱和非线性,例如 S 型
对于更多的数学读者,可以在批处理规范论文“批处理规范化:通过减少内部协变量偏移来加速深层网络训练”中找到更为正式的定义,这是一篇写得很好的论文,易于理解和解释。 更详细的概念。 如果假设我们有一个仅具有完全连接的层的简单神经网络,则正如我们在[第 1 章](../Text/1.xhtml)*设置和 TensorFlow* 简介中所看到的,每一层的激活将是 ![](img/9d0ff275-b662-433d-b367-ac3ac9b46b54.png)表格。
对于更多的数学读者,可以在批处理规范论文“批处理规范化:通过减少内部协变量偏移来加速深层网络训练”中找到更为正式的定义,这是一篇写得很好的论文,易于理解和解释。 更详细的概念。 如果假设我们有一个仅具有完全连接的层的简单神经网络,则正如我们在第 1 章*设置和 TensorFlow* 简介中所看到的,每一层的激活将是 ![](img/9d0ff275-b662-433d-b367-ac3ac9b46b54.png)表格。
假设![](img/c0d727f5-4add-40b7-95df-07d67752638f.png)是非线性的,例如 S 型或 ReLU,然后将批量归一化![](img/fb58ac38-9b3e-4f29-b02e-ee58df896884.png)直接应用于每个单元,例如:
......
......@@ -28,7 +28,7 @@
# 本地化为回归
可以使用与我们在[第 3 章](../Text/3.xhtml)*TensorFlow* 中的图像分类中了解的网络架构相似的网络架构来实现本地化。
可以使用与我们在第 3 章*TensorFlow* 中的图像分类中了解的网络架构相似的网络架构来实现本地化。
除了预测类标签外,我们还将输出一个标志,指示对象的存在以及对象边界框的坐标。 边界框坐标通常是四个数字,分别代表左上角的 *x**y* 坐标,以及框的高度和宽度。
......@@ -156,7 +156,7 @@ def build_graph(self):
# 问题
R-CNN 在计算上仍然很昂贵,因为您必须对大约 2,000 个单独的区域提案运行 CNN。 结果,培训和测试都非常慢。 CNN 分类器依赖于通过选择性搜索进行检测而生成的固定数量的矩形候选窗口。 这种方法并不是最快的方法,而且由于无法从训练数据中了解提案区域,因此它们可能不是针对任务的最佳选择。
R-CNN 在计算上仍然很昂贵,因为您必须对大约 2,000 个单独的区域提案运行 CNN。 结果,训练和测试都非常慢。 CNN 分类器依赖于通过选择性搜索进行检测而生成的固定数量的矩形候选窗口。 这种方法并不是最快的方法,而且由于无法从训练数据中了解提案区域,因此它们可能不是针对任务的最佳选择。
# 快速 R-CNN
......@@ -530,7 +530,7 @@ def loss_layer(self, predicts, labels, scope='loss_layer'):
**![](img/5c1dcbee-f8a6-4a9f-a2c2-09d6ea91d4cc.png)**
有几种流行的 CNN 架构已被证明在分割任务中表现出色。 它们中的大多数是称为自动编码器的一类模型的变体,我们将在[第 6 章](../Text/6.xhtml)*自动编码器,变体自动编码器和生成模型*中详细介绍。 现在,他们的基本思想是首先在空间上将输入量减小为某种压缩形式,然后恢复原始的空间大小:
有几种流行的 CNN 架构已被证明在分割任务中表现出色。 它们中的大多数是称为自编码器的一类模型的变体,我们将在第 6 章,*自编码器,变分自编码器和生成模型*中详细介绍。 现在,他们的基本思想是首先在空间上将输入量减小为某种压缩形式,然后恢复原始的空间大小:
![](img/5043cb38-9cbf-4b58-b8b7-529a4e52031d.png)
......@@ -567,7 +567,7 @@ def loss_layer(self, predicts, labels, scope='loss_layer'):
* 上采样(条纹转置卷积)== UNPOOL + CONV
* 可视化显着图
* 作为自编码器的一部分
* 作为自编码器的一部分
![](img/8cc1410a-dc11-4f64-9d0f-8a25950c7cdd.png)
......
......@@ -2,7 +2,7 @@
到目前为止,我们已经讨论了所有必要的构建块,以便能够实现常见问题(例如图像分类和检测)的解决方案。 在本章中,我们将讨论一些通用模型体系结构的实现,这些体系结构在许多常见任务中都表现出了很高的性能。 自从最初创建以来,这些体系结构一直很流行,并且在今天继续被广泛使用。
在本章的最后,您将对现有的不同类型的 CNN 模型及其在各种不同的计算机视觉问题中的用例进行了解。 在实现这些模型时,您将学习如何设计这些模型以及它们各自的优点。 最后,我们将讨论如何修改这些架构,以使培训和性能/效率更好。
在本章的最后,您将对现有的不同类型的 CNN 模型及其在各种不同的计算机视觉问题中的用例进行了解。 在实现这些模型时,您将学习如何设计这些模型以及它们各自的优点。 最后,我们将讨论如何修改这些架构,以使训练和性能/效率更好。
总之,本章将涵盖以下主题:
......@@ -90,7 +90,7 @@ VGGNet 由牛津大学的**视觉几何组**( **VGG** )创建,是真正引
# 参数和内存计算
VGG 最酷的功能之一是,由于其在 conv 层中的内核较小,因此使用的参数数量很少。 如果我们从[第 2 章](../Text/2.xhtml)*深度学习和卷积神经网络*记住,卷积层中的参数数量(减去偏差)可以计算如下:
VGG 最酷的功能之一是,由于其在 conv 层中的内核较小,因此使用的参数数量很少。 如果我们从第 2 章,“深度学习和卷积神经网络”记住,卷积层中的参数数量(减去偏差)可以计算如下:
![](img/ec08db79-cccc-4e58-88d5-167580308795.png)
......@@ -301,7 +301,7 @@ GoogLeNet 的主要优点是,它比 VGG 更为准确,同时使用的参数
# 残留网络
在前面的部分中,已经证明了网络的深度是有助于提高准确性的关键因素(请参见 VGG)。 TensorFlow 中的[第 3 章](../Text/3.xhtml)*图像分类中也显示,可以通过正确的权重初始化和批处理归一化来缓解深度网络中梯度消失或爆炸的问题。 但是,这是否意味着我们添加的层越多,我们得到的系统就越准确? 亚洲研究机构 Microsoft 的*用于图像识别的深度残差学习*的作者发现,只要网络深度达到 30 层,准确性就会达到饱和。 为了解决此问题,他们引入了一个称为残差块的新层块,该块将上一层的输出添加到下一层的输出中(请参见下图)。 Residual Net 或 ResNet 在非常深的网络(甚至超过 100 层!)中都显示了出色的结果,例如 152 层的 ResNet 赢得了 2015 LRVC 图像识别挑战,其前 5 个测试错误为 3.57。 事实证明,诸如 ResNets 之类的更深层网络要比包括 Inception 模块(例如 GoogLeNet)在内的更广泛的网络更好地工作。*
在前面的部分中,已经证明了网络的深度是有助于提高准确性的关键因素(请参见 VGG)。 TensorFlow 中的第 3 章*图像分类中也显示,可以通过正确的权重初始化和批处理归一化来缓解深度网络中梯度消失或爆炸的问题。 但是,这是否意味着我们添加的层越多,我们得到的系统就越准确? 亚洲研究机构 Microsoft 的*用于图像识别的深度残差学习*的作者发现,只要网络深度达到 30 层,准确性就会达到饱和。 为了解决此问题,他们引入了一个称为残差块的新层块,该块将上一层的输出添加到下一层的输出中(请参见下图)。 Residual Net 或 ResNet 在非常深的网络(甚至超过 100 层!)中都显示了出色的结果,例如 152 层的 ResNet 赢得了 2015 LRVC 图像识别挑战,其前 5 个测试错误为 3.57。 事实证明,诸如 ResNets 之类的更深层网络要比包括 Inception 模块(例如 GoogLeNet)在内的更广泛的网络更好地工作。*
![](img/d8ad63df-15dd-4d20-b918-a3f18767a9c8.png)
......
# 自动编码器,变体自动编码器和生成对抗网络
# 自编码器,变分自编码器和生成对抗网络
本章将介绍一种与到目前为止所看到的模型稍有不同的模型。 到目前为止提供的所有模型都属于一种称为判别模型的模型。 判别模型旨在找到不同类别之间的界限。 他们对找到 *P(Y | X)*-给定某些输入 *X* 的输出 *Y* 的概率感兴趣。 这是用于分类的自然概率分布,因为您通常要在给定一些输入 *X* 的情况下找到标签 *Y,*
......@@ -9,7 +9,7 @@
本章列出了一些我们将要学习的关键主题:
* 汽车编码器
*体自动编码器
*分自编码器
* 生成对抗网络
* 实施各种生成模型以生成手写数字
......@@ -32,27 +32,27 @@
# 汽车编码器
我们将要看到的第一个生成模型是自动编码器模型。 自动编码器是一个简单的神经网络,由两部分组成:**编码器****解码器**。 这个想法是编码器部分会将您的输入压缩到较小的尺寸。 然后,从这个较小的维度尝试使用模型的解码器部分重建输入。 通常用许多名称来称呼这种较小的尺寸,例如潜在空间,隐藏空间,嵌入或编码。
我们将要看到的第一个生成模型是自编码器模型。 自编码器是一个简单的神经网络,由两部分组成:**编码器****解码器**。 这个想法是编码器部分会将您的输入压缩到较小的尺寸。 然后,从这个较小的维度尝试使用模型的解码器部分重建输入。 通常用许多名称来称呼这种较小的尺寸,例如潜在空间,隐藏空间,嵌入或编码。
如果自动编码器能够再现其输入,则从理论上讲,该潜在空间应该对表示原始数据所需的所有重要信息进行编码,但其优点是尺寸小于输入。 编码器可以被认为是一种压缩输入数据的方式,而解码器是一种将其解压缩的方式。 在下图中,我们可以看到一个简单的自动编码器的外观。 我们的潜在空间或编码是中间标记为 *z 的部分。*
如果自编码器能够再现其输入,则从理论上讲,该潜在空间应该对表示原始数据所需的所有重要信息进行编码,但其优点是尺寸小于输入。 编码器可以被认为是一种压缩输入数据的方式,而解码器是一种将其解压缩的方式。 在下图中,我们可以看到一个简单的自编码器的外观。 我们的潜在空间或编码是中间标记为 *z 的部分。*
![](img/bace7dc4-4820-4dcd-934d-7215a3d8e4ce.png)
传统上,在自动编码器中,构成网络的层只是完全连接的层,但是通过使用卷积层,自动编码器也可以扩展到图像。 与之前一样,编码器会将输入图像压缩为较小的表示形式,而解码器将尽最大努力恢复信息。 区别在于,编码器现在是将数据压缩为特征向量的 CNN,而不是具有完全连接的层的 ANN,并且解码器将使用转置的卷积层从编码中重新生成图像。
传统上,在自编码器中,构成网络的层只是完全连接的层,但是通过使用卷积层,自编码器也可以扩展到图像。 与之前一样,编码器会将输入图像压缩为较小的表示形式,而解码器将尽最大努力恢复信息。 区别在于,编码器现在是将数据压缩为特征向量的 CNN,而不是具有完全连接的层的 ANN,并且解码器将使用转置的卷积层从编码中重新生成图像。
此处提供了一个自编码器处理图像的示例。 对于解码器部分
此处提供了一个自编码器处理图像的示例。 对于解码器部分
![](img/460f5473-9a64-4f05-8479-e9f9f36b5eb4.png)
对于任何自动编码器,损失函数都会引导编码器和解码器重建输入。 使用的常见损耗是自动编码器的输出与网络输入之间的 L2 损耗。 我们现在应该问自己一个问题:“使用 L2 损失比较图像是一个好主意吗?”。 如果您拍摄以下图像,即使它们看起来截然不同,它们实际上彼此之间的距离 *L2* 也相同:
对于任何自编码器,损失函数都会引导编码器和解码器重建输入。 使用的常见损耗是自编码器的输出与网络输入之间的 L2 损耗。 我们现在应该问自己一个问题:“使用 L2 损失比较图像是一个好主意吗?”。 如果您拍摄以下图像,即使它们看起来截然不同,它们实际上彼此之间的距离 *L2* 也相同:
![](img/1d80926b-a372-459a-8c13-ab3f74dd6fc5.png)
这表明当您使用 L2 损失比较图像时,并非总是可以依靠它,因此在使用它时应牢记这一点。
# 卷积自编码器示例
# 卷积自编码器示例
以下 TensorFlow 代码将为 MNIST 数据集构建卷积自编码器模型。 代码的第一部分将构建模型,编码器和解码器的图形。 在代码中,我们突出显示模型的一部分,其输出将是我们的潜在向量:
以下 TensorFlow 代码将为 MNIST 数据集构建卷积自编码器模型。 代码的第一部分将构建模型,编码器和解码器的图形。 在代码中,我们突出显示模型的一部分,其输出将是我们的潜在向量:
```py
class CAE_CNN(object):
......@@ -98,7 +98,7 @@ class CAE_CNN(object):
self.__y_flat = tf.reshape(self.__y, [tf.shape(self.__x)[0], 28 * 28])
```
与卷积自编码器丢失有关的代码段如下:
与卷积自编码器丢失有关的代码段如下:
```py
with tf.name_scope("CAE_LOSS"):
......@@ -110,21 +110,21 @@ with tf.name_scope("Solver"):
train_step = tf.train.AdamOptimizer(0.0001).minimize(loss)
```
# 自编码器的用途和局限性
# 自编码器的用途和局限性
动编码器的简单性很酷,但是在功能上有所限制。 他们的一个潜在用途是预训练模型(假设您将模型作为编码器部分,并且能够创建反模型作为解码器)。 使用自动编码器可以很好地进行预训练,因为您可以获取数据集并训练自动编码器以对其进行重构。 培训后,您可以使用编码器的权重,然后将其微调到您要执行的任务。
编码器的简单性很酷,但是在功能上有所限制。 他们的一个潜在用途是预训练模型(假设您将模型作为编码器部分,并且能够创建反模型作为解码器)。 使用自编码器可以很好地进行预训练,因为您可以获取数据集并训练自编码器以对其进行重构。 训练后,您可以使用编码器的权重,然后将其微调到您要执行的任务。
如果不太复杂,则另一种用途是作为数据压缩形式。 您可以使用自编码器将维数减小到两维或三维,然后尝试在潜在空间中可视化您的输入以查看它是否对您有用。
如果不太复杂,则另一种用途是作为数据压缩形式。 您可以使用自编码器将维数减小到两维或三维,然后尝试在潜在空间中可视化您的输入以查看它是否对您有用。
但是,自动编码器的局限性在于它们不能用于为我们生成更多数据。 这是因为我们不知道如何创建新的潜在向量来馈送到解码器。 唯一的方法是在输入数据上使用编码器。 现在,我们将研究对自动编码器的修改,以帮助解决此问题。
但是,自编码器的局限性在于它们不能用于为我们生成更多数据。 这是因为我们不知道如何创建新的潜在向量来馈送到解码器。 唯一的方法是在输入数据上使用编码器。 现在,我们将研究对自编码器的修改,以帮助解决此问题。
# 变体自动编码器
# 变分自编码器
我们第一个可以生成更多类似于训练数据的真实生成模型,将是**变体自动编码器****VAE** )。 VAE 看起来像正常的自动编码器,但有一个新的约束,它将迫使我们的压缩表示(潜伏空间)遵循零均值和单位方差高斯分布。
我们第一个可以生成更多类似于训练数据的真实生成模型,将是**变分自编码器****VAE** )。 VAE 看起来像正常的自编码器,但有一个新的约束,它将迫使我们的压缩表示(潜伏空间)遵循零均值和单位方差高斯分布。
在潜在空间上施加此约束的想法是,当我们想使用 VAE 生成新数据时,我们可以创建来自单位高斯分布的样本矢量,并将其提供给经过训练的解码器。 VAE 和常规自编码器之间的差异就是对潜在空间矢量的约束。 这个约束条件使我们可以创建一种新的潜在矢量,然后再将其馈送到解码器以生成数据。
在潜在空间上施加此约束的想法是,当我们想使用 VAE 生成新数据时,我们可以创建来自单位高斯分布的样本矢量,并将其提供给经过训练的解码器。 VAE 和常规自编码器之间的差异就是对潜在空间矢量的约束。 这个约束条件使我们可以创建一种新的潜在矢量,然后再将其馈送到解码器以生成数据。
下图显示,VAE 在结构上与自编码器完全相同,除了对隐藏空间的约束之外:
下图显示,VAE 在结构上与自编码器完全相同,除了对隐藏空间的约束之外:
![](img/4ea0bf91-eefc-4fd8-bc77-b9205cc8309e.png)
......@@ -143,7 +143,7 @@ with tf.name_scope("Solver"):
在 VAE 中,损失函数由两部分组成:
* **生成损失**:此损失将模型输出与模型输入进行比较。 这可能是我们在自编码器中使用的损耗,例如 L2 损耗。
* **生成损失**:此损失将模型输出与模型输入进行比较。 这可能是我们在自编码器中使用的损耗,例如 L2 损耗。
* **潜在损失**:此损失将潜在向量与零均值,单位方差高斯分布进行比较。 我们在这里使用的损失将是 KL 散度损失。 如果 VAE 开始产生不是来自所需分布的潜在向量,则该损失项将对 VAE 造成不利影响。
以下屏幕截图显示了 VAE 的损失,它是生成损失和潜在空间损失的组合:
......@@ -158,7 +158,7 @@ KL 散度损失将产生一个数字,该数字指示两个分布彼此之间
![](img/3f81672f-26ea-446b-97b4-2b6119614be7.png)
# 培训 VAE
# 训练 VAE
为了训练 VAE 并使用 KL 散度损失,我们首先需要研究如何生成潜矢量。 我们将使编码器产生两个向量,而不是让编码器直接精确地产生一个潜在向量。 第一个是平均值的向量**μ**,第二个是标准偏差值的向量**σ**。 根据这些,我们可以创建第三个向量,其中使用**μ****的 *i* th 值从高斯分布中采样 *i* 元素 σ**向量作为该高斯分布的均值和标准差。 然后,该第三采样矢量被发送到解码器。
......@@ -198,7 +198,7 @@ sample_block = tf.random_normal([tf.shape(X)[0], latent_size], 0, 1, dtype=tf.fl
latent_z = fc_mean + (fc_stddev * sample_block)
```
# 卷积变分自编码器代码
# 卷积变分自编码器代码
现在我们可以将所有内容组合在一起,并提供 TensorFlow 代码,这些代码将为 MNIST 数据集构建卷积 VAE。 我们为 VAE 模型创建一个类,然后将该模型放入`__init__`方法中。 第一部分是我们的模型的编码器,由两个转换层组成:
......@@ -340,12 +340,12 @@ class VAE_CNN_GEN(object):
GAN 的一些实际用法如下:
* 使用鉴别器网络权重作为不同任务的初始化,类似于我们对自编码器可以执行的操作
* 使用鉴别器网络权重作为不同任务的初始化,类似于我们对自编码器可以执行的操作
* 使用生成器网络创建新图像,可能会扩大您的数据集,就像我们可以使用经过训练的 VAE 解码器一样
* 将鉴别器用作损失函数(对于图像,可能优于 L1 / L2),并且也可以在 VAE 中使用
* 通过将生成的数据与标记的数据混合来进行半监督学习
现在我们将向您展示如何在 TensorFlow 中实现非常简单的 GAN。 一旦经过培训,我们的 GAN 的生成器部分就可以用于根据 100 个长随机噪声矢量创建 MNIST 手写数字。 让我们开始吧!
现在我们将向您展示如何在 TensorFlow 中实现非常简单的 GAN。 一旦经过训练,我们的 GAN 的生成器部分就可以用于根据 100 个长随机噪声矢量创建 MNIST 手写数字。 让我们开始吧!
# 鉴别器
......@@ -389,7 +389,7 @@ def generator(z):
为了训练 GAN,我们将在鉴别器和生成器之间交替进行梯度步骤更新。 在更新鉴别符时,我们要尝试使**最大化**鉴别符做出**正确选择**的概率。 在更新生成器时,我们想尝试使**最小化**鉴别器做出**正确选择**的可能性。
但是,为了实际实现,我们将与之前给出的内容相比,稍微改变 GAN 损失函数; 这样做是为了帮助培训收敛。 变化是,当更新生成器时,而不是**最小化**鉴别器做出**正确选择**的可能性; 我们改为**最大化**判别器做出**错误选择**的概率:
但是,为了实际实现,我们将与之前给出的内容相比,稍微改变 GAN 损失函数; 这样做是为了帮助训练收敛。 变化是,当更新生成器时,而不是**最小化**鉴别器做出**正确选择**的可能性; 我们改为**最大化**判别器做出**错误选择**的概率:
![](img/5222b764-d50d-4fbc-9747-47a475579e50.png)
......@@ -589,7 +589,7 @@ WGAN 产生的图像结果仍然不是很好,但是该模型确实有助于解
# 开始
BEGAN 的主要思想是在鉴别器上使用自动编码器,这将有其自身的损失,该损失会衡量自动编码器对某些图像(生成器或真实数据)的重构程度:
BEGAN 的主要思想是在鉴别器上使用自编码器,这将有其自身的损失,该损失会衡量自编码器对某些图像(生成器或真实数据)的重构程度:
![](img/1a6f3311-6e16-492c-860d-45414eedbc67.jpg)
......@@ -623,7 +623,7 @@ BEGAN 的一些优点如下:
GAN 当前最大的问题是,它们很难训练。 幸运的是,有一些技术可以使事情变得容易,这是目前非常活跃的研究领域。
在这里,我们将介绍培训 GAN 的一些问题以及如何解决它们。
在这里,我们将介绍训练 GAN 的一些问题以及如何解决它们。
# 损失可解释性
......@@ -638,7 +638,7 @@ GAN 当前最大的问题是,它们很难训练。 幸运的是,有一些技
* 您不希望鉴别器的损失下降得很快,因为它将无法向生成器提供反馈以改善它。
* 如果发电机损耗迅速下降,则意味着它发现了一个鉴别器弱点,并一次又一次地利用了这一弱点。 如果发生这种情况,则称为**模式折叠**
损失实际上仅对查看培训中是否出现问题有好处。 因此,没有很好的方法知道培训已经收敛。 通常,最好的办法是继续查看发电机的输出。 确保输出看起来与您的期望接近,并且输出种类丰富。
损失实际上仅对查看训练中是否出现问题有好处。 因此,没有很好的方法知道训练已经收敛。 通常,最好的办法是继续查看发电机的输出。 确保输出看起来与您的期望接近,并且输出种类丰富。
# 模式崩溃
......@@ -679,6 +679,6 @@ GAN 当前最大的问题是,它们很难训练。 幸运的是,有一些技
# 摘要
在本章中,我们了解了生成模型及其与判别模型的不同之处。 我们还讨论了各种自编码器,包括深度,变体和卷积。 此外,我们了解了一种新型的生成模型,称为生成对抗网络(GAN)。 在了解了所有这些生成模型之后,我们看到了如何在 TensorFlow 中自己训练它们以生成手写数字,并看到了它们可以产生的不同质量的图像。
在本章中,我们了解了生成模型及其与判别模型的不同之处。 我们还讨论了各种自编码器,包括深度,变体和卷积。 此外,我们了解了一种新型的生成模型,称为生成对抗网络(GAN)。 在了解了所有这些生成模型之后,我们看到了如何在 TensorFlow 中自己训练它们以生成手写数字,并看到了它们可以产生的不同质量的图像。
[第 7 章](../Text/7.xhtml)*转移学习*中,我们将学习转移学习及其如何帮助我们加快培训速度。
\ No newline at end of file
在第 7 章,*迁移学习*中,我们将学习迁移学习及其如何帮助我们加快训练速度。
\ No newline at end of file
# 移学习
# 移学习
移学习的作用恰如其名。 这个想法是将从一项任务中学到的东西转移到另一项任务上。 为什么? 实际上,每次都从头开始训练整个模型的效率很低,其成功取决于许多因素。 另一个重要原因是,对于某些应用程序,公开可用的数据集不够大,无法训练出像 AlexNet 或 ResNet 这样的深层架构而又不会过度拟合,这意味着无法推广。 示例应用程序可以从用户给出的一些示例中进行在线学习,也可以是细粒度的分类,其中类别之间的差异很小。
移学习的作用恰如其名。 这个想法是将从一项任务中学到的东西转移到另一项任务上。 为什么? 实际上,每次都从头开始训练整个模型的效率很低,其成功取决于许多因素。 另一个重要原因是,对于某些应用程序,公开可用的数据集不够大,无法训练出像 AlexNet 或 ResNet 这样的深层架构而又不会过度拟合,这意味着无法推广。 示例应用程序可以从用户给出的一些示例中进行在线学习,也可以是细粒度的分类,其中类别之间的差异很小。
一个非常有趣的观察结果是,由于您冻结了所有其余部分(无论是检测还是分类),最终的层可以用于完成不同的任务,最终权重看起来非常相似。
这导致了移学习的想法。 这意味着在大量数据上训练的深度架构(例如 ImageNet)可以很好地概括化,以至于其卷积权重可以充当特征提取器,类似于常规的视觉表示,并且可以用于训练线性分类器以用于 各种任务。
这导致了移学习的想法。 这意味着在大量数据上训练的深度架构(例如 ImageNet)可以很好地概括化,以至于其卷积权重可以充当特征提取器,类似于常规的视觉表示,并且可以用于训练线性分类器以用于 各种任务。
本章旨在教读者如何在 TensorFlow 中采用现成的训练有素的模型,更改其结构以及为特定任务重新训练某些层。 我们将看到转移学习将如何帮助改善结果并加快培训时间。
本章旨在教读者如何在 TensorFlow 中采用现成的训练有素的模型,更改其结构以及为特定任务重新训练某些层。 我们将看到迁移学习将如何帮助改善结果并加快训练时间。
本章涵盖的主要主题如下:
......@@ -28,7 +28,7 @@
* **精细**-**精细分类**:这是我们要在同一高级类中的子类之间进行分类的时候。 例如,我们可以对鸟类进行分类。 尽管没有对细粒度数据进行训练,但 CNN 功能以及逻辑回归功能的性能优于基线方法。
* **场景识别**:在这里,我们需要对整个图像的场景进行分类。 在对象分类数据库上经过训练的 CNN 特征提取器,顶部带有一个简单的线性分类器,其性能优于应用于识别数据的传统特征提取器的复杂学习算法。
这里提到的某些任务与图像分类没有直接关系,图像分类是 ImageNet 培训的主要目标,因此有人希望 CNN 功能无法推广到看不见的场景。 但是,这些功能与简单的线性分类器相结合,性能优于手工制作的功能。 这意味着 CNN 的学习权重是可重用的。
这里提到的某些任务与图像分类没有直接关系,图像分类是 ImageNet 训练的主要目标,因此有人希望 CNN 功能无法推广到看不见的场景。 但是,这些功能与简单的线性分类器相结合,性能优于手工制作的功能。 这意味着 CNN 的学习权重是可重用的。
那么什么时候应该使用迁移学习呢? 当我们有一个任务时,由于问题的性质,可用数据集很小(例如对蚂蚁/蜜蜂进行分类)。 在这种情况下,我们可以在包含相似语义信息的较大数据集上训练我们的模型,然后用较小的数据集仅训练最后一层(线性分类器)。 如果我们只有足够的可用数据,并且有一个更大的相似数据集,则对该相似数据集进行预训练可能会导致模型更健壮。 通常情况下,我们使用随机初始化的权重来训练模型,在这种情况下,将使用在其他数据集上训练过的权重来初始化模型。 这将有助于网络更快地融合并更好地推广。 在这种情况下,仅微调模型顶端的几层是有意义的。
......@@ -54,11 +54,11 @@
# TensorFlow 有用的元素
由于转移学习是关于训练一个网络的权重,而该网络已从另一个训练后的模型中获取了权重,因此我们将需要找到一个。 在我们的示例中,我们将使用预训练卷积自动编码器的编码部分,该部分在[第 6 章](../Text/6.xhtml)中进行了说明。 使用自动编码器的优点是我们不需要标记的数据,也就是说,可以完全不受监督地对其进行训练。
由于迁移学习是关于训练一个网络的权重,而该网络已从另一个训练后的模型中获取了权重,因此我们将需要找到一个。 在我们的示例中,我们将使用预训练卷积自编码器的编码部分,该部分在第 6 章中进行了说明。 使用自编码器的优点是我们不需要标记的数据,也就是说,可以完全不受监督地对其进行训练。
# 没有解码器的自编码器
# 没有解码器的自编码器
包含两个卷积层和一个完全连接层的编码器(不带解码器部分的自动编码器)如下所示。 父自动编码器在 MNIST 数据集上进行了训练。 因此,网络将大小为 28x28x1 的图像作为输入,并在潜在空间将其编码为 10 维矢量,每个类别一维:
包含两个卷积层和一个完全连接层的编码器(不带解码器部分的自编码器)如下所示。 父自编码器在 MNIST 数据集上进行了训练。 因此,网络将大小为 28x28x1 的图像作为输入,并在潜在空间将其编码为 10 维矢量,每个类别一维:
```py
# Only half of the autoencoder changed for classification
......@@ -167,7 +167,7 @@ train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss, var_list=list_
# 完整资料
在此示例中,我们将从 MNIST 卷积自编码器示例中加载权重。 我们将仅恢复编码器部分的权重,冻结 CONV 层,并训练 FC 层以执行数字分类:
在此示例中,我们将从 MNIST 卷积自编码器示例中加载权重。 我们将仅恢复编码器部分的权重,冻结 CONV 层,并训练 FC 层以执行数字分类:
```py
import tensorflow as tf
......@@ -248,6 +248,6 @@ for epoch in range(num_epoch):
# 摘要
在本章中,我们学习了如何,何时以及为什么使用迁移学习。 这被认为是一个非常强大的工具,因为它使我们能够使用从其他领域学到的功能来以较少的数据很好地概括。 我们看了一些示例,现在应该清楚如何在自己的任务中实施移学习。
在本章中,我们学习了如何,何时以及为什么使用迁移学习。 这被认为是一个非常强大的工具,因为它使我们能够使用从其他领域学到的功能来以较少的数据很好地概括。 我们看了一些示例,现在应该清楚如何在自己的任务中实施移学习。
在下一章中,我们将看到如何组织我们的数据以及如何扩展 CNN 架构,以构建准确而实用的机器学习系统。
\ No newline at end of file
......@@ -40,7 +40,7 @@
为了获得高性能的神经网络,将数据集正确划分为训练集,开发集和测试集非常重要。 它有助于更​​快地迭代。 另外,它允许更有效地测量算法的偏差和方差,以便我们可以选择有效方式进行改进的方法。
在以前的时代,我们拥有较小的数据集(例如最多 10,000 个示例)和简单的分类器,我们会将数据集拆分为训练和测试集。 通常将训练集分成较小的集,以使用称为交叉验证的技术来训练分类器。 优良作法是按 60/20/20 的比例拆分数据集(即 60%的训练数据,20%的开发数据,20%的测试数据)。 但是,大数据的现代时代已经改变了这一经验法则。 如果我们有 1,000,000 个示例,则拆分比例已更改为 98/1/1(即 98%的培训数据,1%的 dev 数据,1%的测试数据)。
在以前的时代,我们拥有较小的数据集(例如最多 10,000 个示例)和简单的分类器,我们会将数据集拆分为训练和测试集。 通常将训练集分成较小的集,以使用称为交叉验证的技术来训练分类器。 优良作法是按 60/20/20 的比例拆分数据集(即 60%的训练数据,20%的开发数据,20%的测试数据)。 但是,大数据的现代时代已经改变了这一经验法则。 如果我们有 1,000,000 个示例,则拆分比例已更改为 98/1/1(即 98%的训练数据,1%的 dev 数据,1%的测试数据)。
随着我们拥有更多的数据,开发和测试集的比例将变小。
......@@ -48,7 +48,7 @@
# 开发和测试集不匹配
除了拆分数据之外,数据的分布还对神经网络的性能产生巨大影响。 应用深度学习中的大多数问题来自开发人员和测试集数据分布的不匹配。 我们需要记住,开发和测试数据应该来自类似的分发。 例如,如果我们以如下方式收集和分割人员检测数据,即从网页上收集人员的训练图像,而使用移动电话收集测试集图像,则会出现分布不匹配的情况。 这里的问题是,在训练模型时,我们会根据其在 dev 数据上的性能来微调网络的参数和体系结构,如果 dev 数据与训练数据相似且与测试数据不同,则 dev 数据中存在很高的偏差 对训练集。 在开发集上获得良好的评估结果并不一定意味着该模型可以很好地推广。 在这种情况下,对分布完全不同的集合进行测试可能会导致不良结果。 这是浪费时间和精力。 解决方案是首先合并开发集和测试集,随机将它们洗牌,最后将洗过的数据再次拆分为开发集和测试集。 这有助于在将机器学习算法成功培训到最终应用程序方面取得更快的进展。
除了拆分数据之外,数据的分布还对神经网络的性能产生巨大影响。 应用深度学习中的大多数问题来自开发人员和测试集数据分布的不匹配。 我们需要记住,开发和测试数据应该来自类似的分发。 例如,如果我们以如下方式收集和分割人员检测数据,即从网页上收集人员的训练图像,而使用移动电话收集测试集图像,则会出现分布不匹配的情况。 这里的问题是,在训练模型时,我们会根据其在 dev 数据上的性能来微调网络的参数和体系结构,如果 dev 数据与训练数据相似且与测试数据不同,则 dev 数据中存在很高的偏差 对训练集。 在开发集上获得良好的评估结果并不一定意味着该模型可以很好地推广。 在这种情况下,对分布完全不同的集合进行测试可能会导致不良结果。 这是浪费时间和精力。 解决方案是首先合并开发集和测试集,随机将它们洗牌,最后将洗过的数据再次拆分为开发集和测试集。 这有助于在将机器学习算法成功训练到最终应用程序方面取得更快的进展。
# 何时更改开发/测试集
......@@ -58,7 +58,7 @@
# 偏差和方差
[第 2 章](../Text/2.xhtml)*深度学习和卷积神经网络*中所讨论的,方差和偏差分别表示过拟合和欠拟合。 我们可以使用训练集,开发集和测试集错误来诊断“拟合不足”和“过度拟合”的问题。
第 2 章,“深度学习和卷积神经网络”中所讨论的,方差和偏差分别表示过拟合和欠拟合。 我们可以使用训练集,开发集和测试集错误来诊断“拟合不足”和“过度拟合”的问题。
考虑以下场景,其中我们的数据来自两个不同的分布,分别称为分布 1 和分布 2。分布 2 表示我们关心的目标应用程序。 问题是,我们如何在这种分布上定义训练,开发和测试集。
......@@ -145,7 +145,7 @@ ML 基本配方
# 重采样数据
这是关于改变我们建立培训批次的方式。 我们通过更改选择特定类别的可能性来做到这一点。 例如,如果您有两个类 A 和 B,其中我们的 A 实例比 B 多得多,则可以更改采样系统以选择比 A 多的 B。
这是关于改变我们建立训练批次的方式。 我们通过更改选择特定类别的可能性来做到这一点。 例如,如果您有两个类 A 和 B,其中我们的 A 实例比 B 多得多,则可以更改采样系统以选择比 A 多的 B。
# 损失函数加权
......@@ -308,7 +308,7 @@ class CAE_CNN_Encoder(object):
3. 尽可能避免使用池化层。 相反,请使用步长为 2 的卷积层。这将像池化那样对输入进行下采样,但它不会像池化那样丢弃宝贵的信息。 同样,使用跨步卷积就像将 conv 和合并在一层中一样。
4. 减小要素地图的空间大小时,应增加使用的过滤器数量,以免丢失过多信息。 在深度网络中,请避免在第一层中过快减小空间大小。
5. 请遵循本章中有关从小规模开始网络设计,然后逐渐增加复杂性的建议,以避免出现过大的问题。
6. 使用 batchnorm。 确实有助于培训您的网络!
6. 使用 batchnorm。 确实有助于训练您的网络!
7. 随着您对网络的深入了解,逐渐减小要素地图的空间大小。
8. 最小化 FC 层的数量(在最后一层之前使用 dropout)。 仅在最终需要连接某些标量特征时才使用 FC。 (您甚至可以通过在输入通道上进行编码来避免这种情况)
9. 如果您需要较大的接收场(物体大小接近总图像大小的检测或分类),请尝试对每层使用具有指数膨胀因子的膨胀卷积。 这样,您将在保持少量参数的同时非常迅速地扩大接收范围。
......@@ -316,7 +316,7 @@ class CAE_CNN_Encoder(object):
10. 如果网络变深并且训练损失没有减少,请考虑使用剩余连接。
11. 在使网络精度在期望值之内并且如果计算成本成为问题之后,您可能会根据使用情况,研究深度卷积,瓶颈模块之类的技术,或现场出现的任何技术。
请记住,CNN 的培训和设计是一门经验丰富的科学,因此请始终注意,被视为最佳实践的内容会迅速发生变化。
请记住,CNN 的训练和设计是一门经验丰富的科学,因此请始终注意,被视为最佳实践的内容会迅速发生变化。
# 摘要
......
# 大规模培训
# 大规模训练
到目前为止,在本书中,我们使用或查看的数据集的大小从数万个(MNIST)样本到略超过一百万个(ImageNet)。 尽管所有这些数据集在刚推出时都被认为是巨大的,并且需要使用最先进的机器,但是 GPU 和云计算等技术的迅捷发展现已使它们易于培训。 由功率较低的机器的人。
到目前为止,在本书中,我们使用或查看的数据集的大小从数万个(MNIST)样本到略超过一百万个(ImageNet)。 尽管所有这些数据集在刚推出时都被认为是巨大的,并且需要使用最先进的机器,但是 GPU 和云计算等技术的迅捷发展现已使它们易于训练。 由功率较低的机器的人。
但是,深度神经网络的强大功能来自其随输入的数据量进行扩展的能力。 简而言之,这意味着您可以用来训练模型的数据越好,越干净,结果越好。 研究人员已经意识到了这一点,我们可以看到,新的公共数据集中的训练样本数量一直在增加。
......@@ -28,7 +28,7 @@
尽管这似乎是存储数据的一种简单方法,但一旦数据集大小变得太大,它就会具有一些主要缺点。 当我们开始加载它时,一个很大的缺点就来了。
打开文件是一项耗时的操作,必须多次打开数百万个文件,这会增加大量的培训时间开销。 最重要的是,由于我们已将所有数据拆分开,因此不会将其存储在一个漂亮的内存块中。 硬盘驱动器将不得不做更多的工作来尝试查找和访问所有硬盘。
打开文件是一项耗时的操作,必须多次打开数百万个文件,这会增加大量的训练时间开销。 最重要的是,由于我们已将所有数据拆分开,因此不会将其存储在一个漂亮的内存块中。 硬盘驱动器将不得不做更多的工作来尝试查找和访问所有硬盘。
解决办法是什么? 我们将它们全部放入一个文件中。 这样做的好处是,您的所有数据将在计算机内存中更好地对齐以便读取,这将加快处理速度。 将所有内容都保存在一个文件中也意味着我们不必花费时间来加载数百万个文件,这将非常缓慢且效率低下。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册