提交 9366f276 编写于 作者: W wizardforcel

2020-08-30 21:26:20

上级 a9af8a47
......@@ -10,7 +10,7 @@
这本书的目的是双重的。 我们将专注于深度学习和迁移学习的详细介绍,并通​​过易于理解的概念和示例将两者进行比较和对比。 第二个重点领域是使用 TensorFlow,Keras 和 Python 生态系统(带动手实例)的实际示例和研究问题。
本书从 ML 和深度学习的核心基本概念开始,然后是一些重要的深度学习架构的描述和覆盖,例如 CNN,DNN,RNN,LSTM 和胶囊网络。 然后,我们的重点转移到迁移学习概念和经过培训*高级网络*,例如 VGG,Inception 和 ResNet。 我们还将学习如何利用这些系统来改善我们的深度学习模型的表现。 最后,我们重点关注**计算机视觉****音频分析****自然语言处理****NLP**)。
本书从 ML 和深度学习的核心基本概念开始,然后是一些重要的深度学习架构的描述和覆盖,例如 CNN,DNN,RNN,LSTM 和胶囊网络。 然后,我们的重点转移到迁移学习概念和经过训练*高级网络*,例如 VGG,Inception 和 ResNet。 我们还将学习如何利用这些系统来改善我们的深度学习模型的表现。 最后,我们重点关注**计算机视觉****音频分析****自然语言处理****NLP**)。
到本书结尾,您将准备好在自己的系统中既实现深度学习又实现迁移学习的原则。
......
......@@ -73,7 +73,7 @@ ML 是 AI 的一个流行子领域,涵盖了非常广泛的领域。 如此受
根据数据可用性进行分类:
* **批量学习**:这也称为**离线学习**。 当所需的培训数据可用时,将使用这种类型的学习,并且可以在部署到生产/现实世界中之前对模型进行培训和微调。
* **批量学习**:这也称为**离线学习**。 当所需的训练数据可用时,将使用这种类型的学习,并且可以在部署到生产/现实世界中之前对模型进行训练和微调。
* **在线学习**:顾名思义,在这种情况下,一旦数据可用,学习就不会停止。 而是在这种情况下,将数据以小批量的形式输入到系统中,并且训练过程将使用新的一批数据继续进行。
前面讨论的分类为我们提供了如何组织,理解和利用 ML 算法的抽象视图。 将它们分类的最常见方法是有监督和无监督学习算法。 让我们更详细地介绍这两个类别,因为这将有助于我们开始进一步的高级主题,稍后再进行介绍。
......@@ -110,7 +110,7 @@ ML 是 AI 的一个流行子领域,涵盖了非常广泛的领域。 如此受
# 回归
此类监督学习算法有助于我们回答*数量**定量*类型的问题。 正式而言,回归模型的关键目标是值的估。 在这种情况下,输出标签本质上是连续的(相对于分类而言是离散的)。
此类监督学习算法有助于我们回答*数量**定量*类型的问题。 正式而言,回归模型的关键目标是值的估。 在这种情况下,输出标签本质上是连续的(相对于分类而言是离散的)。
在回归问题的情况下,输入数据点称为*自变量**解释变量*,而输出称为*因变量*。 还使用训练数据样本来训练回归模型,该训练数据样本包括输入(或独立)数据点以及输出(或相关)信号。 线性回归,多元回归,回归树等是一些监督式回归算法。
......@@ -126,7 +126,7 @@ ML 是 AI 的一个流行子领域,涵盖了非常广泛的领域。 如此受
监督学习:线性回归
为了理解不同的回归类型,让我们考虑一个真实的用例,它基于汽车的速度来估计汽车的停止距离。 在这里,根据我们拥有的训练数据,我们可以将停车距离建模为速度的线性函数或汽车速度的多项式函数。 请记住,主要目的是在不过拟合训练数据本身的情况下最大程度地减少错误
为了理解不同的回归类型,让我们考虑一个真实的用例,它基于汽车的速度来估计汽车的停止距离。 在这里,根据我们拥有的训练数据,我们可以将停车距离建模为速度的线性函数或汽车速度的多项式函数。 请记住,主要目的是在不过拟合训练数据本身的情况下最大程度地减少误差
上图描述了线性拟合,而下图描述了同一数据集的多项式拟合:
......@@ -289,7 +289,7 @@ CRISP-DM 模型提供了用于 ML 和相关项目管理的高级工作流。 在
# 建模
在建模过程中,我们通常将数据特征提供给 ML 方法或算法并训练模型,通常是为了优化特定的成本函数,在大多数情况下,目的是减少错误并归纳从数据中学到的表示形式。
在建模过程中,我们通常将数据特征提供给 ML 方法或算法并训练模型,通常是为了优化特定的成本函数,在大多数情况下,目的是减少误差并归纳从数据中学到的表示形式。
根据数据集和项目要求,我们应用一种或多种不同的机器学习技术的组合。 这些可以包括有监督的技术(例如分类或回归),无监督的技术(例如聚类),甚至是结合了不同技术的混合方法(如先前在“ML 技术”部分中所讨论的)。
......@@ -306,7 +306,7 @@ CRISP-DM 模型提供了用于 ML 和相关项目管理的高级工作流。 在
根据所使用的建模技术,我们利用相关的评估指标。 对于有监督的方法,我们通常利用以下技术:
* 根据模型预测与实际值创建混淆矩阵。 这涵盖了诸如**真阳性****TP**),**假阳性****FP**),**真阴性****TN**)和**假阴性****FN**)将其中一个类别视为正类别(通常是感兴趣的类别)。
* 从混淆矩阵得出的度量标准,包括准确(总体表现),精度(模型的预测能力),召回率(命中率)和 F1 分数(精确度和召回率的谐和平均值)。
* 从混淆矩阵得出的度量标准,包括准确(总体表现),精度(模型的预测能力),召回率(命中率)和 F1 分数(精确度和召回率的谐和平均值)。
* **受试者特征曲线****ROC**)和**曲线下面积****AUC**)。
* R 平方(确定系数),**均方根误差****RMSE**),F 统计量,**赤池信息准则****AIC**),以及专门用于回归模型的 p 值。
......@@ -325,11 +325,11 @@ CRISP-DM 模型提供了用于 ML 和相关项目管理的高级工作流。 在
监督学习算法可帮助我们推断或学习从输入数据点到输出信号的映射。 该学习导致目标或习得函数。 现在,在理想情况下,目标函数将学习输入变量和输出变量之间的精确映射。 不幸的是,没有理想。
正如在介绍监督学习算法时所讨论的那样,我们利用称为**训练数据集**的数据子集来学习目标函数,然后在称为**测试数据集**的另一个子集上测试表现。 由于该算法仅看到所有可能数据组合的子集,因此在预测输出和观察到的输出之间会出现错误。 这称为**总误差****预测误差**
正如在介绍监督学习算法时所讨论的那样,我们利用称为**训练数据集**的数据子集来学习目标函数,然后在称为**测试数据集**的另一个子集上测试表现。 由于该算法仅看到所有可能数据组合的子集,因此在预测输出和观察到的输出之间会出现误差。 这称为**总误差****预测误差**
*总误差 = 偏差误差 + 方差误差 + 不可约误差*
不可减少的误差是由于噪声,我们对问题的框架,收集数据的方式等导致的固有误差。 顾名思义,这种错误是无法避免的,从算法的角度来看,我们几乎无能为力。
不可减少的误差是由于噪声,我们对问题的框架,收集数据的方式等导致的固有误差。 顾名思义,这种误差是无法避免的,从算法的角度来看,我们几乎无能为力。
# 偏差
......@@ -652,8 +652,8 @@ EDA 是一种非常强大的机制,可用于在进入 ML 的其他阶段之前
通常,特征工程中的任何标准工作流程都涉及将这些类别值转换为数字标签的某种形式,然后在这些值上应用某种编码方案。 流行的编码方案简要介绍如下:
* **单热编码**:此策略为类别属性创建 *n* 个二进制值列,假设存在 *n* 个不同类别
* **虚拟编码**:此策略为类别属性创建 *n-1* 个二进制值列,假定存在 *n* 个不同类别
* **单热编码**:此策略为类别属性创建 *n* 个二值列,假设存在 *n* 个不同类别
* **虚拟编码**:此策略为类别属性创建 *n-1* 个二值列,假定存在 *n* 个不同类别
* **特征散列**:如果我们使用散列函数将多个特征添加到单个容器或存储桶(新特征)中,则可以利用此策略,当我们具有大量特征时通常会使用
笔记本`feature_engineering_numerical_and_categorical_data.ipynb`中提供了代码片段,以更好地理解类别数据的特征工程。
......@@ -672,7 +672,7 @@ EDA 是一种非常强大的机制,可用于在进入 ML 的其他阶段之前
到目前为止讨论的图像数据和其他类型的特征提取方法需要大量时间,精力和领域知识。 这种特征提取有其优点和局限性。
最近,人们已经研究了深度学习,特别是**卷积神经网络****CNN**),并将其用作自动特征提取器。 CNN 是针对图像数据进行优化的深度神经网络的特例。 卷积层是任何 CNN 的核心,它们基本上会在图像的高度和宽度上应用滑动滤镜。 像素值与这些滤镜的点积会生成跨多个期学习的激活图。 在每个层次上,这些卷积层都有助于提取特定特征,例如边缘,纹理,角等。
最近,人们已经研究了深度学习,特别是**卷积神经网络****CNN**),并将其用作自动特征提取器。 CNN 是针对图像数据进行优化的深度神经网络的特例。 卷积层是任何 CNN 的核心,它们基本上会在图像的高度和宽度上应用滑动滤镜。 像素值与这些滤镜的点积会生成跨多个期学习的激活图。 在每个层次上,这些卷积层都有助于提取特定特征,例如边缘,纹理,角等。
深度学习和 CNN 还有很多,但是为了简单起见,让我们假设 CNN 在每一层都可以帮助我们自动提取不同的低级和高级特征。 反过来,这使我们免于手动执行特征提取。 我们将在接下来的章节中更详细地研究 CNN,并了解它们如何帮助我们自动提取特征。
......@@ -699,7 +699,7 @@ EDA 是一种非常强大的机制,可用于在进入 ML 的其他阶段之前
通过上一节中提到的方法对文本数据进行正确处理后,我们就可以利用以下一些技术来进行特征提取和转换为数值形式。 Jupyter 笔记本`feature_engineering_text_data.ipynb`中提供了可更好地理解文本数据特征的代码片段:
* **词袋模型**:这是迄今为止最简单的文本数据向量化技术。 在此技术中,每个文档都表示为`N`维度上的向量,其中`N`表示预处理语料库中所有可能的单词,向量的每个组成部分表示单词的存在或其频率。
* **TF-IDF 模型**:词袋模型在非常简单的假设下工作,有时会导致各种问题。 最常见的问题之一与某些单词由于频率很高而使其余单词黯然失色有关,因为词袋模型利用绝对频率进行量化。 **词频逆文档频率****TF-IDF**)模型通过缩放/归一化绝对频率来缓解此问题。 在数学上,模型定义如下:
* **TF-IDF 模型**:词袋模型在非常简单的假设下工作,有时会导致各种问题。 最常见的问题之一与某些单词由于频率很高而使其余单词黯然失色有关,因为词袋模型利用绝对频率进行量化。 **词频逆文档频率****TF-IDF**)模型通过缩放/归一化绝对频率来缓解此问题。 在数学上,模型定义如下:
`tfidf(w, D) = tf(W, D) * idf(w, D)`
......
此差异已折叠。
......@@ -109,7 +109,7 @@ colornet 转换
前面的图像显示了彩色图像的`L``A``B`通道,基于 [Zhang 及其合著者(2016)和 Federico 及其合著者(2017)](https://arxiv.org/abs/1603.08511)的作品。 我们将在接下来的部分中详细研究它们。
我们鼓励读者阅读标题为[《Deep Koalarization:使用 CNN 和 Inception-ResNet-v2 进行图像着色》](https://arxiv.org/abs/1712.03400)的论文。 我们要感谢 Federico Baldassarre,Diego Gonzalez-Morin 和 Lucas Rodes-Guirao 为他们的工作及其实提供了详细的信息和见解。 我们还要感谢 Emil Wallner 使用 Keras 出色地实现了本文。
我们鼓励读者阅读标题为[《Deep Koalarization:使用 CNN 和 Inception-ResNet-v2 进行图像着色》](https://arxiv.org/abs/1712.03400)的论文。 我们要感谢 Federico Baldassarre,Diego Gonzalez-Morin 和 Lucas Rodes-Guirao 为他们的工作及其实提供了详细的信息和见解。 我们还要感谢 Emil Wallner 使用 Keras 出色地实现了本文。
读者应注意,类似的过程也可以应用于 YUV 色彩空间。 [Jeff Hwang 和他的合著者在题为《利用深度卷积神经网络进行图像着色》的论文中讨论了利用这种色彩空间的尝试,效果也很好](http://cs231n.stanford.edu/reports/2016/pdfs/219_Report.pdf)
......@@ -354,13 +354,13 @@ history = model.fit_generator(colornet_img_generator(X_train,
steps_per_epoch=STEPS_PER_EPOCH)
```
在着色网络的情况下,这种损失可能会产生误导。 它似乎已稳定在 100 个纪元以下,但所产生的结果更多是乌贼色而不是颜色。 因此,我们做了更多的实验以达到以下结果:
在着色网络的情况下,这种损失可能会产生误导。 它似乎已稳定在 100 个周期以下,但所产生的结果更多是乌贼色而不是颜色。 因此,我们做了更多的实验以达到以下结果:
![](img/c43e6248-8076-41c3-b8cb-92a4470a4e47.png)
Colornet 输出:第一列代表灰度输入,第二列代表模型输出,第三列代表原始图像
前面的结果虽然不令人吃惊,但令人鼓舞。 通过对模型进行 600 个期的训练,批次大小为 64,可以实现上述结果。
前面的结果虽然不令人吃惊,但令人鼓舞。 通过对模型进行 600 个期的训练,批次大小为 64,可以实现上述结果。
# 挑战
......@@ -368,8 +368,8 @@ Colornet 输出:第一列代表灰度输入,第二列代表模型输出,
* 当前的网络似乎已经学习了高级特征,例如草地和运动球衣(在一定程度上),而它发现学习较小物体的颜色模式有些困难。
* 训练集仅限于非常具体的图像子集,因此反映在测试数据集中。 该模型对训练集中不存在的对象或包含这些对象的样本不多的表现不佳。
* 即使训练损失似乎已稳定在 50 个纪元以下,但我们看到,除非进行数百个纪元训练,否则该模型的着色表现相当差。
* 该模型很容易将大多数对象着色为灰色或棕褐色。 在训练了较少期的模型中观察到了这一点。
* 即使训练损失似乎已稳定在 50 个周期以下,但我们看到,除非进行数百个周期训练,否则该模型的着色表现相当差。
* 该模型很容易将大多数对象着色为灰色或棕褐色。 在训练了较少期的模型中观察到了这一点。
除了这些挑战之外,对于如此复杂的架构,计算和内存要求也很高。
......@@ -385,7 +385,7 @@ Colornet 输出:第一列代表灰度输入,第二列代表模型输出,
图像着色是深度学习领域的前沿主题之一。 随着我们对迁移学习和深度学习的理解日趋成熟,应用范围变得越来越令人兴奋且更具创造力。 图像着色是研究的活跃领域,最近,深度学习专家分享了一些激动人心的工作。
在本章中,我们学习了颜色理论,不同的颜色模型和颜色空间。 这种理解帮助我们将问题陈述重新表述为从单通道灰度图像到两通道输出的映射。 然后,我们根据 Baldassarre 和他的合著者的作品,着手建立一个色网。 该实现涉及一个独特的三层网络,该网络由编码器,解码器和融合层组成。 融合层使我们能够通过将 VGG16 嵌入与编码器输出连接来利用传输学习。 网络需要一些特定的预处理和后处理步骤来训练给定的图像集。 我们的训练和测试数据集由 ImageNet 样本的子集组成。 我们对色网进行了数百次培训。 最后,我们提供了一些幻影图像,以了解该模型对着色任务的学习程度。 训练有素的色网学习了某些高级对象,例如草,但在较小或较不频繁的对象上表现不佳。 我们还讨论了这种类型的网络带来的一些挑战。
在本章中,我们学习了颜色理论,不同的颜色模型和颜色空间。 这种理解帮助我们将问题陈述重新表述为从单通道灰度图像到两通道输出的映射。 然后,我们根据 Baldassarre 和他的合著者的作品,着手建立一个色网。 该实现涉及一个独特的三层网络,该网络由编码器,解码器和融合层组成。 融合层使我们能够通过将 VGG16 嵌入与编码器输出连接来利用传输学习。 网络需要一些特定的预处理和后处理步骤来训练给定的图像集。 我们的训练和测试数据集由 ImageNet 样本的子集组成。 我们对色网进行了数百次训练。 最后,我们提供了一些幻影图像,以了解该模型对着色任务的学习程度。 训练有素的色网学习了某些高级对象,例如草,但在较小或较不频繁的对象上表现不佳。 我们还讨论了这种类型的网络带来的一些挑战。
这结束了本书中由用例驱动的系列文章中的最后一章。 我们介绍了跨不同领域的不同用例。 每个用例都帮助我们利用了迁移学习的概念,本书的前两部分对此进行了详细讨论。 机器学习和深度学习领域的领先人物之一 Andrew Ng 在他的 NIPS 2016 教程中表示:
......
此差异已折叠。
此差异已折叠。
......@@ -40,7 +40,7 @@
我们利用源模型中的知识来改进目标任务中的学习。 除了提供重用已经构建的模型的功能之外,迁移学习还可以通过以下方式帮助学习目标任务:
* **改进了基准表现**:当我们使用源模型中的知识来增强孤立的学习者(也称为**无知学习者**)的知识时,由于这种知识迁移,基准表现可能会提高 。
* **改进了基准表现**:当我们使用源模型中的知识来增强孤立的学习器(也称为**无知学习器**)的知识时,由于这种知识迁移,基准表现可能会提高 。
* **模型开发时间**:与从头开始学习的目标模型相比,利用源模型的知识也可能有助于充分学习目标任务。 反过来,这会导致开发/学习模型所需的总时间减少。
* **改进的最终表现**:可以利用迁移学习获得更高的最终表现。
......@@ -50,7 +50,7 @@
使用迁移学习的可能好处(来源:迁移学习,Lisa Torrey 和 Jude Shavlik)
迁移学习已在归纳学习(例如神经网络和贝叶斯网络)的上下文中得到应用和研究。 强化学习是另一个探索迁移学习可能性的领域。 因此,迁移学习的概念不限于深度学习。
迁移学习已在归纳学习(例如神经网络和贝叶斯网络)的上下文中得到应用和研究。 强化学习是另一个探索迁移学习可能性的领域。 因此,迁移学习的概念不限于深度学习。
在本章及后续章节中,我们将限制使用迁移学习的范围仅限于深度学习的上下文。
......@@ -75,7 +75,7 @@
* **标签空间**:在这种情况下,源域和目标域的标签空间不同,例如`γ[s] ≠ γ[t]`。 这通常也意味着方案 4 的存在-不同的条件概率。
* **条件概率**:在这种情况下,`P(Υ[s] | Χ[s]) ≠ P(Υ[t] | Χ[t])`,因此源域和目标域中的条件概率不同。
到目前为止,我们已经看到迁移学习具有在目标任务中利用来自源学习的现有知识的能力。 在迁移学习过程中,必须回答以下三个重要问题:
到目前为止,我们已经看到迁移学习具有在目标任务中利用来自源学习的现有知识的能力。 在迁移学习过程中,必须回答以下三个重要问题:
* **迁移什么**:这是整个过程中的第一步,也是最重要的一步。 我们尝试寻求有关知识的哪一部分可以从源迁移到目标的答案,以提高目标任务的表现。 当试图回答这个问题时,我们试图确定知识的哪一部分是特定于来源的,以及哪些是来源与目标之间的共同点。
* **何时迁移**:在某些情况下,为了知识而迁移知识可能比改善任何事情都变得更糟(也称为*负向迁移*)。 我们应该以利用迁移学习为目标,以提高目标任务的表现/结果,而不是使其退化。 我们需要注意何时迁移以及何时不迁移。
......@@ -91,16 +91,16 @@ Pan 和 Yang 撰写的论文《迁移学习综述》[可以在此处找到](http
上一节中讨论的三种转移类别概述了可以应用和详细研究迁移学习的不同设置。 为了回答在这些类别中转移什么的问题,可以采用以下一些方法:
* **实例传输**:从源域到目标任务的知识重用通常是理想的方案。 在大多数情况下,无法直接重用源域数据。 而是,源域中的某些实例可以与目标数据一起重用以改善结果。 在感应传输的情况下,Dai 及其合作者的 *AdaBoost* 之类的修改有助于利用源域中的训练实例来改进目标任务。
* **特征表示移**:此方法旨在通过识别可从源域到目标域使用的良好特征表示,以最小化域差异并降低错误率。 根据标记数据的可用性,可以将有监督或无监督的方法应用于基于特征表示的传输。
* **参数传递**:此方法在以下假设下工作:相关任务的模型共享一些参数或超参数的先前分布。 与多任务学习不同,在多任务学习中同时学习源任务和目标任务,对于迁移学习,我们可以对目标域的丢失施加额外的权重以提高整体表现。
* **实例迁移**:从源域到目标任务的知识重用通常是理想的方案。 在大多数情况下,无法直接重用源域数据。 而是,源域中的某些实例可以与目标数据一起重用以改善结果。 在感应传输的情况下,Dai 及其合作者的 *AdaBoost* 之类的修改有助于利用源域中的训练实例来改进目标任务。
* **特征表示移**:此方法旨在通过识别可从源域到目标域使用的良好特征表示,以最小化域差异并降低错误率。 根据标记数据的可用性,可以将有监督或无监督的方法应用于基于特征表示的传输。
* **参数迁移**:此方法在以下假设下工作:相关任务的模型共享一些参数或超参数的先前分布。 与多任务学习不同,在多任务学习中同时学习源任务和目标任务,对于迁移学习,我们可以对目标域的损失施加额外的权重以提高整体表现。
* **关系知识迁移**:与前面三种方法不同,关系知识迁移尝试处理非 IID 数据,例如非独立且分布相同的数据。 换句话说,每个数据点与其他数据点都有关系的数据; 例如,社交网络数据利用关系知识迁移技术。
在本节中,我们以非常通用的方式研究了在不同背景和环境下进行迁移学习的不同策略。 现在让我们利用这种理解,学习如何在深度学习的上下文中应用迁移学习。
# 迁移学习和深度学习
深度学习模型代表了**归纳学习**。 归纳学习算法的目的是从一组训练示例中得出映射。 例如,在分类的情况下,模型学习输入特征和类标签之间的映射。 为了使这样的学习能够很好地对看不见的数据进行概括,其算法采用了与训练数据的分布有关的一组假设。 这些假设集合称为**感应偏置**
深度学习模型代表了**归纳学习**。 归纳学习算法的目的是从一组训练示例中得出映射。 例如,在分类的情况下,模型学习输入特征和类标签之间的映射。 为了使这样的学习能够很好地对看不见的数据进行概括,其算法采用了与训练数据的分布有关的一组假设。 这些假设集合称为**感应偏置**
归纳偏差或假设可以由多个因素来表征,例如它所限制的假设空间以及通过假设空间进行的搜索过程。 因此,这些偏差会影响模型在给定任务和领域上的学习方式和知识。
......@@ -128,7 +128,7 @@ Pan 和 Yang 撰写的论文《迁移学习综述》[可以在此处找到](http
# 微调
这是一项涉及更多的技术,我们不仅要替换最后一层(用于分类/回归),而且还要选择性地重新训练一些先前的层。 深度神经网络是具有各种超参数的高度可配置的架构。 如前所述,最初的层已捕获通用特征,而后面的层则更多地关注手头的特定任务。 利用这种洞察力,我们可以在重新训练时冻结(固定权重)某些图层,或者微调其余图层以满足我们的需求。 在这种情况下,我们利用网络整体架构方面的知识,并将其状态用作我们再培训步骤的起点。 反过来,这有助于我们以更少的培训时间获得更好的表现。
这是一项涉及更多的技术,我们不仅要替换最后一层(用于分类/回归),而且还要选择性地重新训练一些先前的层。 深度神经网络是具有各种超参数的高度可配置的架构。 如前所述,最初的层已捕获通用特征,而后面的层则更多地关注手头的特定任务。 利用这种洞察力,我们可以在重新训练时冻结(固定权重)某些层,或者微调其余层以满足我们的需求。 在这种情况下,我们利用网络整体架构方面的知识,并将其状态用作我们再训练步骤的起点。 反过来,这有助于我们以更少的训练时间获得更好的表现。
# 预训练模型
......@@ -158,17 +158,17 @@ Pan 和 Yang 撰写的论文《迁移学习综述》[可以在此处找到](http
# 多任务学习
多任务学习与迁移学习世界略有不同。 在多任务学习的情况下,可以同时学习多个任务,而无需区分源和目标。 在这种情况下,与迁移学习相比,学习者一次就接收到有关多个任务的信息,在迁移学习中,学习者最初对目标任务一无所知。
多任务学习与迁移学习世界略有不同。 在多任务学习的情况下,可以同时学习多个任务,而无需区分源和目标。 在这种情况下,与迁移学习相比,学习器一次就接收到有关多个任务的信息,在迁移学习中,学习器最初对目标任务一无所知。
如下图所示:
![](img/93186224-8b4d-4459-98e7-a21fd5aaf615.png)
多任务学习:学习同时从所有任务接收信息
多任务学习:学习同时从所有任务接收信息
# 一次学习
深度学习系统天生就渴望数据,因此它们需要许多训练示例来学习权重。 这是深度神经网络的局限性之一,尽管人类学习并非如此。 例如,一旦向孩子展示了苹果的外观,他们就可以轻松识别出不同种类的苹果(带有一个或几个培训示例); 机器学习和深度学习算法并非如此。 一次学习是迁移学习的一种变体,在这种学习中,我们尝试仅根据一个或几个训练示例来推断所需的输出。 这在无法为每个可能的类提供标签数据的现实世界场景中(如果是分类任务)和在经常可以添加新类的场景中非常有用。
深度学习系统天生就渴望数据,因此它们需要许多训练示例来学习权重。 这是深度神经网络的局限性之一,尽管人类学习并非如此。 例如,一旦向孩子展示了苹果的外观,他们就可以轻松识别出不同种类的苹果(带有一个或几个训练示例); 机器学习和深度学习算法并非如此。 一次学习是迁移学习的一种变体,在这种学习中,我们尝试仅根据一个或几个训练示例来推断所需的输出。 这在无法为每个可能的类提供标签数据的现实世界场景中(如果是分类任务)和在经常可以添加新类的场景中非常有用。
据说 Fei-Fei 及其合作者具有里程碑意义的论文[《对象类别的单发学习》](https://ieeexplore.ieee.org/document/1597116/)。 在此子领域创造了“一次性学习和研究”一词。 本文提出了一种用于对象分类的表示学习的贝叶斯框架的变体。 此后,此方法已得到改进,并已使用深度学习系统进行了应用。
......
此差异已折叠。
......@@ -4,7 +4,7 @@
——本杰明·富兰克林
在计算机视觉的保护下,图像识别是一个活跃的跨学科研究领域。 顾名思义,图像或对象识别是识别图像或视频序列中的对象的任务。 传统上,该领域利用数学和计算机辅助建模以及对象设计方面的进步。 这些年来,已经开发了一些手工注释的数据集,以测试和评估图像识别系统。 我们现在称它们为传统技术,一直统治着整个场景,并且不断地改进这项任务,直到最近。 2012 年,深度学习参加了 ImageNet 竞赛,为快速改善和进步计算机视觉和深度学习技术打开了闸门。
在计算机视觉的保护下,图像识别是一个活跃的跨学科研究领域。 顾名思义,图像或对象识别是识别图像或视频序列中的对象的任务。 传统上,该领域利用数学和计算机辅助建模以及对象设计方面的进步。 这些年来,已经开发了一些手工标注的数据集,以测试和评估图像识别系统。 我们现在称它们为传统技术,一直统治着整个场景,并且不断地改进这项任务,直到最近。 2012 年,深度学习参加了 ImageNet 竞赛,为快速改善和进步计算机视觉和深度学习技术打开了闸门。
在本章中,我们将从深度学习(尤其是迁移学习)的角度介绍图像识别和分类的概念。 本章将涵盖以下方面:
......@@ -27,19 +27,19 @@
# 基准数据集
图像分类,或就此而言,任何分类任务,本质上都是监督学习任务。 受监督的任务通过可用的基础培训集了解不同的类别。
图像分类,或就此而言,任何分类任务,本质上都是监督学习任务。 受监督的任务通过可用的基础训练集了解不同的类别。
即使 CNN 是共享权重的优化前馈网络,但要在深层 ConvNet 中训练的参数数量可能仍然很大。 这就是为什么需要大量的培训才能获得表现更好的网络的原因之一。 幸运的是,全球研究小组一直在努力收集,手工注释和众包不同的数据集。 这些数据集可用于对不同算法的表现进行基准测试,以及识别不同比赛中的获胜者。
即使 CNN 是共享权重的优化前馈网络,但要在深层 ConvNet 中训练的参数数量可能仍然很大。 这就是为什么需要大量的训练才能获得表现更好的网络的原因之一。 幸运的是,全球研究小组一直在努力收集,手工标注和众包不同的数据集。 这些数据集可用于对不同算法的表现进行基准测试,以及识别不同比赛中的获胜者。
以下是图像分类领域中广泛接受的基准数据集的简要列表:
* **ImageNet**:这是一个具有黄金标准的可视数据集,具有超过 1400 万个带有手工注释的高分辨率彩色图像,涵盖了 20,000 个类别。 它是 2009 年由普林斯顿大学计算机科学系设计用于视觉对象识别任务的。此后,此数据集(在其 1000 个非重叠类的修整版本中)已用作 [*ImageNet 大规模视觉识别挑战*](https://arxiv.org/abs/1409.0575)的基础。
* **ImageNet**:这是一个具有黄金标准的可视数据集,具有超过 1400 万个带有手工标注的高分辨率彩色图像,涵盖了 20,000 个类别。 它是 2009 年由普林斯顿大学计算机科学系设计用于视觉对象识别任务的。此后,此数据集(在其 1000 个非重叠类的修整版本中)已用作 [*ImageNet 大规模视觉识别挑战*](https://arxiv.org/abs/1409.0575)的基础。
* **8000 万个微小图像数据集**:顾名思义,该 MIT 数据集包含从互联网收集的 8000 万个图像,并标记了 75,000 多个不同的非抽象英语名词。 该数据集还为其他广泛使用的数据集(包括 CIFAR 数据集)奠定了基础。
* **CIFAR-10**:由加拿大高级研究所开发,CIFAR-10 是**机器学习****ML**)研究中使用最广泛的数据集之一。 该数据集包含 60,000 张横跨 10 个非重叠类的低分辨率图像。
* **CIFAR-100**:来自同一研究组,该数据集包含 60,000 张图像,均匀分布在 100 个不同的类别中。
* **上下文中的公共对象****上下文中的公共对象****COCO**)是用于对象标识,分段和字幕的大型可视数据库。 该数据集包含超过 200,000 张跨越不同类别的标记图像。
* **开放图像**:这可能是最大的可用注释数据集之一。 该数据集的版本 4 包含超过 900 万个带批注的图像。
* **Caltech 101 和 Caltech 256**:这些数据集包含分别跨越 101 和 256 个类别的带注释的图像。 加州理工学院 101 包含约 9,000 张图像,而加州理工学院 256 包含近 30,000 张图像。
* **开放图像**:这可能是最大的可用标注数据集之一。 该数据集的版本 4 包含超过 900 万个带标注的图像。
* **Caltech 101 和 Caltech 256**:这些数据集包含分别跨越 101 和 256 个类别的带标注的图像。 加州理工学院 101 包含约 9,000 张图像,而加州理工学院 256 包含近 30,000 张图像。
* **斯坦福犬数据集**:这是一个有趣的数据集,特定于不同的犬种。 它包含 20,000 个彩色图像,涵盖 120 个不同的犬种。
* **MNIST**:MNIST 是有史以来最著名的视觉数据集之一,已成为 ML 爱好者的事实上的 *HelloWorld* 数据集。 它包含超过 60,000 个手工标记的数字(零到九个数字)。
......@@ -52,7 +52,7 @@
* **AlexNet**:这是可以归功于*打开闸门*的网络。 由深度学习的先驱之一 Geoffrey Hinton 和团队设计,该网络将前五名的错误率降低到了 15.3%。 它也是最早利用 GPU 加快学习过程的架构之一。
* **VGG-16**:牛津大学视觉几何小组的网络是表现最好的架构之一,广泛用于对其他设计进行基准测试。 VGG-16 采用了一个简单的架构,该架构是基于`3 x 3`个卷积层(一个 16 层)相互堆叠,然后是一个最大池化层,以实现强大的表现。 该模型由稍微更复杂的模型 **VGG19** 继承。
* **Inception**:也称为 **GoogleNet** ,该网络是在 **ImageNet 大规模视觉识别挑战赛****ILSVRC**)在 2014 年实现了前五名的错误率为 6.67%。 它是最早实现接近人类表现的架构之一。 该网络背后的新颖之处在于使用了起始层,该起始层包括了在同一级别将不同大小的内核连接在一起的过程。
* **ResNet**:由 Microsoft Research Asia 引入,**残差网络****ResNet**)是一种新颖的架构,利用批处理规范化和跳过连接来实现仅仅 3.57% 的前五位的错误率。 它比诸如 VGG 之类的简单架构要深很多(152 层)并且要复杂得多。
* **ResNet**:由 Microsoft Research Asia 引入,**残差网络****ResNet**)是一种新颖的架构,利用批规范化和跳过连接来实现仅仅 3.57% 的前五位的错误率。 它比诸如 VGG 之类的简单架构要深很多(152 层)并且要复杂得多。
* **MobileNet**:尽管大多数架构都在竞争中胜过其他架构,但每个新的复杂网络都需要更多的计算能力和数据资源。 MobileNet 偏离了此类架构,并被设计为适用于移动和嵌入式系统。 该网络利用了一种新颖的思想,即使用深度可分离卷积来减少训练网络所需的参数总数。
我们提供了基于深度学习的图像分类空间中一些最新架构的快速概述和概述。 有关详细讨论,读者可以查看第 3 章,“了解深度学习架构”中的“卷积神经网络”部分。
......@@ -101,7 +101,7 @@ model.add(Dense(NUM_CLASSES, activation='softmax'))
为了提高总体泛化表现,该模型还包含`BatchNormalization`层和`DropOut`层。 这些层有助于我们控制过拟合,还可以防止网络存储数据集本身。
我们仅用 25 个纪元来运行模型,以在验证集上达到约 65% 的准确性。 以下屏幕快照显示了训练后的模型的输出预测:
我们仅用 25 个周期来运行模型,以在验证集上达到约 65% 的准确率。 以下屏幕快照显示了训练后的模型的输出预测:
![](img/80bb52c2-ee64-4f17-9739-0102fa0a8713.png)
......@@ -192,7 +192,7 @@ val_generator = val_datagen.flow(X_val,
batch_size=BATCH_SIZE)
```
现在让我们训练模型几个期并衡量其表现。 以下代码段调用`fit_generator()`函数将新添加的层训练到模型中:
现在让我们训练模型几个期并衡量其表现。 以下代码段调用`fit_generator()`函数将新添加的层训练到模型中:
```py
train_steps_per_epoch = X_train.shape[0] // BATCH_SIZE
......@@ -207,11 +207,11 @@ history = model.fit_generator(train_generator,
```
`fit_generator()`返回的历史对象包含有关每个期的详细信息。 我们利用这些来绘制模型在精度和损失方面的整体表现。 结果如下所示:
`fit_generator()`返回的历史对象包含有关每个期的详细信息。 我们利用这些来绘制模型在精度和损失方面的整体表现。 结果如下所示:
![](img/db41fbac-3130-4690-af32-deff0262e31d.png)
火车验证表现
训练验证表现
如我们所见,与从头开始开发的模型相比,迁移学习帮助我们在整体表现上实现了惊人的提升。 这项改进利用了训练有素的 VGG-16 权重将学习到的特征转移到该域。 读者可以使用相同的工具`plot_predictions()`可视化随机样本上的分类结果,如以下屏幕截图所示:
......@@ -254,7 +254,7 @@ In [1]: import os
...:np.random.seed(42)
```
由于数据集很大,因此我们准备了几个工具来加载随机的图像批处理并显示选定的批处理。 工具的标题为`load_batch()``plot_batch()`; 这些细节在 IPython 笔记本中可用。 以下代码段绘制了随机批次以供参考:
由于数据集很大,因此我们准备了几个工具来加载随机的图像批量并显示选定的批量。 工具的标题为`load_batch()``plot_batch()`; 这些细节在 IPython 笔记本中可用。 以下代码段绘制了随机批次以供参考:
```py
In [7]:batch_df = load_batch(dataset_df,
......@@ -308,7 +308,7 @@ In [8]:plot_batch(batch_df, grid_width=6, grid_height=6
最高和最低犬种样本数
这样的数据集需要彻底的探索。 我们已经在本节中介绍了一些探索性步骤。 进一步的步骤在引用的 IPython 笔记本中列出/执行。 鼓励读者逐步了解图像大小调整的影响,不同层如何检测不同特征,灰度等。
这样的数据集需要彻底的探索。 我们已经在本节中介绍了一些探索性步骤。 进一步的步骤在引用的 IPython 笔记本中列出/执行。 鼓励读者逐步了解图像大小调整的影响,不同层如何检测不同特征,灰度等。
# 数据准备
......@@ -409,7 +409,7 @@ predictions = Dense(total_classes,
activation='softmax')(out)
```
如前面的代码片段所示, **Keras** 提供了用于处理许多预训练模型的简单工具,将它们用作特征提取器就像将标志`include_top`设置为`False`一样简单。 在下面的代码片段中,我们通过将两组图层堆叠在一起,然后冻结 InceptionV3 中的图层来准备最终模型:
如前面的代码片段所示, **Keras** 提供了用于处理许多预训练模型的简单工具,将它们用作特征提取器就像将标志`include_top`设置为`False`一样简单。 在下面的代码片段中,我们通过将两组层堆叠在一起,然后冻结 InceptionV3 中的层来准备最终模型:
```py
model = Model(inputs=base_inception.input,
......@@ -420,7 +420,7 @@ for layer in base_inception.layers:
layer.trainable = False
```
现在,我们有了模型,所有模型都将在“狗品种识别”数据集中进行训练。 我们使用`fit_generator()`方法训练模型,以利用上一步中准备的数据增强。 我们将批次大小设置为 32,并训练模型 13 个纪元。 以下代码片段设定了滚动的方向:
现在,我们有了模型,所有模型都将在“狗品种识别”数据集中进行训练。 我们使用`fit_generator()`方法训练模型,以利用上一步中准备的数据增强。 我们将批次大小设置为 32,并训练模型 13 个周期。 以下代码片段设定了滚动的方向:
```py
batch_size = BATCH_SIZE
......@@ -435,17 +435,17 @@ history = model.fit_generator(train_generator,
verbose=1)
```
由于我们在每个期(`history`对象)之后都保存了模型参数和表现的输出,因此我们现在将利用它来了解模型表现。 下图绘制了模型的训练和测试精度以及其损失表现:
由于我们在每个期(`history`对象)之后都保存了模型参数和表现的输出,因此我们现在将利用它来了解模型表现。 下图绘制了模型的训练和测试精度以及其损失表现:
![](img/499881f7-60ac-48f4-acdc-9b0b63f1ec1d.png)
狗品种分类器表现
该模型在训练集和验证集上仅在 15 个期内就获得了 **80%** 精度以上的可嘉表现。 右侧的图显示了损耗下降并收敛到 **0.5** 的速度。 这是一个很好的例子,说明了迁移学习的强大而简单。
该模型在训练集和验证集上仅在 15 个期内就获得了 **80%** 精度以上的可嘉表现。 右侧的图显示了损耗下降并收敛到 **0.5** 的速度。 这是一个很好的例子,说明了迁移学习的强大而简单。
训练和验证的表现相当不错,但是对看不见的数据的表现如何? 由于我们已经将原始数据集分为三个单独的部分。 这里要记住的重要一点是,测试数据集必须经过与训练数据集相似的预处理。 为了解决这个问题,在将测试数据集输入到函数之前,我们还对它进行了缩放。
该模型在测试数据集上实现了惊人的 **85% 准确度**以及 **0.85 F1 得分**。 鉴于我们仅用最少的投入就训练了 15 个纪元,迁移学习帮助我们实现了一个不错的分类器:
该模型在测试数据集上实现了惊人的 **85% 准确率**以及 **0.85 F1 得分**。 鉴于我们仅用最少的投入就训练了 15 个周期,迁移学习帮助我们实现了一个不错的分类器:
![](img/37a13513-298a-414a-beeb-76c68f9c1a36.png)
......@@ -457,6 +457,6 @@ history = model.fit_generator(train_generator,
在本书的前两个部分中,我们讨论了很多理论。 建立了强大的概念和技术基础后,我们在本章中开始了用例驱动的旅程。 本章是一系列后续章节中的第一章,这些章节将展示不同场景和领域中迁移学习的实际用例。 在本章中,我们将迁移学习应用于视觉对象识别或俗称**图像分类**的领域。
我们从围绕 CNN 的快速更新开始,并随着 2012 年深度学习模型的出现,计算机辅助对象识别的整个过程将一劳永逸。我们简要介绍了各种最新的图像分类模型 ,它已经超越了人类的表现。 我们还快速浏览了学术界和行业专家用于培训和调整模型的不同基准数据集。 设置上下文后,我们从 CIFAR-10 数据集开始。 我们使用 Keras 和 TensorFlow 作为后端从头开始构建了一个分类器。 我们利用 VGG-16 作为特征提取的预训练模型,利用迁移学习来改善此表现。
我们从围绕 CNN 的快速更新开始,并随着 2012 年深度学习模型的出现,计算机辅助对象识别的整个过程将一劳永逸。我们简要介绍了各种最新的图像分类模型 ,它已经超越了人类的表现。 我们还快速浏览了学术界和行业专家用于训练和调整模型的不同基准数据集。 设置上下文后,我们从 CIFAR-10 数据集开始。 我们使用 Keras 和 TensorFlow 作为后端从头开始构建了一个分类器。 我们利用 VGG-16 作为特征提取的预训练模型,利用迁移学习来改善此表现。
在本章的最后部分,我们利用迁移学习来解决稍微复杂的问题。 我们准备了一个犬种分类器,而不是基于类别不重叠的数据集(CIFAR-10),以基于 Stanford Dogs 数据集识别 120 种不同的犬种。 只需几行代码,我们就可以实现近乎最新的表现。 第二种用例也称为*细粒度图像分类*任务,并且比通常的图像分类任务复杂。 在本章中,我们展示了通过迁移学习获得惊人结果的强大功能和简便性。 在接下来的章节中,请继续关注来自计算机视觉,音频分析等领域的惊人用例。
\ No newline at end of file
此差异已折叠。
......@@ -15,9 +15,9 @@
# 了解音频事件分类
到现在为止,您应该了解分类或分类的基本任务,在这里我们已经有了结构化或非结构化的数据,这些数据通常用特定的组或类别进行标记或注释。 自动分类的主要任务是建立一个模型,以便使用未来的数据点,我们可以根据各种数据属性或特征将每个数据点分类或记录为一种特定的类别。
到现在为止,您应该了解分类或分类的基本任务,在这里我们已经有了结构化或非结构化的数据,这些数据通常用特定的组或类别进行标记或标注。 自动分类的主要任务是建立一个模型,以便使用未来的数据点,我们可以根据各种数据属性或特征将每个数据点分类或记录为一种特定的类别。
在前面的章节中,我们已经研究了文本和图像的分类。 在本章中,我们将研究对音频事件进行分类。 音频事件基本上是通常由音频信号捕获的事件或活动的发生。 通常,短的音频片段用于表示音频事件,因为即使它们反复出现,声音通常也很相似。 但是,有时,可能会使用更长的音频剪辑来表示更复杂的音频事件。 音频事件的示例可能是儿童在操场上玩耍,警笛警报,狗吠等。 实际上,谷歌已经建立了一个名为 [**AudioSet**](https://research.google.com/audioset/index.html) 的海量数据集,它是带注释的音频事件的一个手动的大规模数据集,他们还发表了几篇有关音频事件识别和分类的论文。 我们将使用较小的数据集来解决问题,但有兴趣的读者一定应该查看这个庞大的数据集,其中包含 632 个音频事件类,其中包括从 YouTube 视频中提取的 208420 个人工标记的 10 秒声音剪辑的集合。
在前面的章节中,我们已经研究了文本和图像的分类。 在本章中,我们将研究对音频事件进行分类。 音频事件基本上是通常由音频信号捕获的事件或活动的发生。 通常,短的音频片段用于表示音频事件,因为即使它们反复出现,声音通常也很相似。 但是,有时,可能会使用更长的音频剪辑来表示更复杂的音频事件。 音频事件的示例可能是儿童在操场上玩耍,警笛警报,狗吠等。 实际上,谷歌已经建立了一个名为 [**AudioSet**](https://research.google.com/audioset/index.html) 的海量数据集,它是带标注的音频事件的一个手动的大规模数据集,他们还发表了几篇有关音频事件识别和分类的论文。 我们将使用较小的数据集来解决问题,但有兴趣的读者一定应该查看这个庞大的数据集,其中包含 632 个音频事件类,其中包括从 YouTube 视频中提取的 208420 个人工标记的 10 秒声音剪辑的集合。
# 制定我们的现实问题
......@@ -188,7 +188,7 @@ plt.tight_layout()
![](img/c309828b-41bc-450c-a72a-af65ae9e4d49.png)
我们可以看到如何用频谱图将音频数据表示为很好的图像表示形式,这对于像**卷积神经网络****CNN**)这样的模型很有用,因为可以肯定地看到不同音频源在声谱图中存在明显差异。 但是,我们将使用梅尔谱图,它通常比基本谱图更好,因为它代表了梅尔度的谱图。 名称 **mel** 来自单词 *melody*。 这表明比例尺基于音高比较。 因此,梅尔音阶是对音高的感知尺度,听众已将其判断为彼此之间的距离相等。 如果我们使用 CNN 从这些频谱图中提取特征,这将非常有用。 以下代码段描绘了梅尔频谱图:
我们可以看到如何用频谱图将音频数据表示为很好的图像表示形式,这对于像**卷积神经网络****CNN**)这样的模型很有用,因为可以肯定地看到不同音频源在声谱图中存在明显差异。 但是,我们将使用梅尔谱图,它通常比基本谱图更好,因为它代表了梅尔度的谱图。 名称 **mel** 来自单词 *melody*。 这表明比例尺基于音高比较。 因此,梅尔音阶是对音高的感知尺度,听众已将其判断为彼此之间的距离相等。 如果我们使用 CNN 从这些频谱图中提取特征,这将非常有用。 以下代码段描绘了梅尔频谱图:
```py
i = 1
......@@ -489,7 +489,7 @@ Test: Counter({0: 813, 9: 808, 2: 750, 8: 750, 5: 745, 7: 735,
# 迁移学习以进行特征提取
现在来了有趣的部分。 我们准备利用迁移学习从基本特征地图图像中为每个数据点提取有用的特征。 为此,我们将使用出色的预训练深度学习模型,该模型已被证明是图像上非常有效的特征提取器。 我们将在这里使用 VGG-16 模型。 但是,我们将在这里使用它作为简单的特征提取器,而无需进行任何微调(这是我们在前几章中探讨的内容)。
现在来了有趣的部分。 我们准备利用迁移学习从基本特征映射图中为每个数据点提取有用的特征。 为此,我们将使用出色的预训练深度学习模型,该模型已被证明是图像上非常有效的特征提取器。 我们将在这里使用 VGG-16 模型。 但是,我们将在这里使用它作为简单的特征提取器,而无需进行任何微调(这是我们在前几章中探讨的内容)。
随意利用微调,这甚至可以带来更好的分类器。 我们首先定义一些基本的工具和函数来处理基本图像:
......@@ -684,7 +684,7 @@ Trainable params: 3,940,362
Non-trainable params: 0
```
然后,在 AWS **p2.x** 实例上对该模型进行了约 50 个纪元的训练,批处理大小为 128。 您可以尝试使用时间和批处理大小来获得可靠的模型,如下所示:
然后,在 AWS **p2.x** 实例上对该模型进行了约 50 个周期的训练,批量大小为 128。 您可以尝试使用时间和批量大小来获得可靠的模型,如下所示:
```py
history = model.fit(train_features, train_labels_ohe,epochs=50,
......@@ -706,7 +706,7 @@ Epoch 50/50
18300/18300 - 1s - loss: 0.2631 - acc: 0.9197 - val_loss: 0.3887 - val_acc: 0.8890
```
我们获得的验证准确接近 **89%**,这非常好,看起来很有希望。 我们还可以绘制模型的整体精度图和损耗图,以更好地了解事物的外观,如下所示:
我们获得的验证准确接近 **89%**,这非常好,看起来很有希望。 我们还可以绘制模型的整体精度图和损耗图,以更好地了解事物的外观,如下所示:
```py
f, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))
......@@ -731,7 +731,7 @@ l2 = ax2.legend(loc="best")
![](img/a164d6a2-685a-4ad5-b1fe-3af618612e17.png)
我们可以看到模型在训练和验证之间的损失和准确是相当一致的。 也许略有过拟合,但考虑到它们之间的差异很小,可以忽略不计。
我们可以看到模型在训练和验证之间的损失和准确是相当一致的。 也许略有过拟合,但考虑到它们之间的差异很小,可以忽略不计。
# 评估分类器表现
......@@ -762,7 +762,7 @@ Recall: 0.8869
F1 Score: 0.8861
```
我们获得了总体模型准确,并且`f1-score`接近 89%,这非常好,并且与我们从验证数据集中获得的一致。 接下来让我们看一下每类模型的表现:
我们获得了总体模型准确,并且`f1-score`接近 89%,这非常好,并且与我们从验证数据集中获得的一致。 接下来让我们看一下每类模型的表现:
```py
meu.display_classification_report(true_labels=test_labels_categories,
......@@ -903,4 +903,4 @@ result_df
在本章中,我们研究了一个全新的问题和案例研究,涉及音频识别和分类。 涵盖了围绕音频数据和信号的概念,包括可视化和理解此数据类型的有效技术。
我们还研究了有效的特征工程技术,以及如何使用迁移学习从音频数据的图像表示中提取有效特征。 这向我们展示了迁移学习的希望,以及如何利用知识从一个领域(图像)转移到另一个领域(音频),并建立一个非常强大且有效的分类器。 最后,我们建立了一个完整的端到端流水线,用于识别和分类音频数据的新样本。 请在网络上进一步检查带注释的音频的数据集,看看是否可以利用从此处学习的迁移学习中获得的概念来构建更大,更好的音频标识符和分类器。 请继续关注有关迁移学习的更多有趣示例和案例研究。
\ No newline at end of file
我们还研究了有效的特征工程技术,以及如何使用迁移学习从音频数据的图像表示中提取有效特征。 这向我们展示了迁移学习的希望,以及如何利用知识从一个领域(图像)转移到另一个领域(音频),并建立一个非常强大且有效的分类器。 最后,我们建立了一个完整的端到端流水线,用于识别和分类音频数据的新样本。 请在网络上进一步检查带标注的音频的数据集,看看是否可以利用从此处学习的迁移学习中获得的概念来构建更大,更好的音频标识符和分类器。 请继续关注有关迁移学习的更多有趣示例和案例研究。
\ No newline at end of file
......@@ -72,7 +72,7 @@ cabbage_butterfly 0.012270376
![](img/8aafabe1-dc15-4785-a4ee-2d0abb44b08c.png)
ImageNet 架构及其中的特征图数量很多。 让我们假设一下,我们知道可以检测这些机翼的特征地图层。 现在,给定输入图像,我们可以从这一层提取特征。 我们可以更改输入图像,以使来自该层的激活增加吗? 这意味着我们必须修改输入图像,以便在输入图像中看到更多类似机翼的物体,即使它们不在那里。 最终的图像将像梦一样,到处都是蝴蝶。 这正是 DeepDream 中完成的工作。
ImageNet 架构及其中的特征图数量很多。 让我们假设一下,我们知道可以检测这些机翼的特征映射层。 现在,给定输入图像,我们可以从这一层提取特征。 我们可以更改输入图像,以使来自该层的激活增加吗? 这意味着我们必须修改输入图像,以便在输入图像中看到更多类似机翼的物体,即使它们不在那里。 最终的图像将像梦一样,到处都是蝴蝶。 这正是 DeepDream 中完成的工作。
现在,让我们看一下 Inception 网络中的​​一些特征图。 要了解卷积模型学到的知识,我们可以尝试可视化卷积过滤器。
......@@ -108,7 +108,7 @@ img = preprocess_image(base_image_path)
activations = activation_model.predict(img)
```
我们可以绘制这些先前的激活。 一个激活层中的所有过滤器/特征图都可以绘制在网格中。 因此,根据层中滤镜的数量,我们将图像网格定义为 NumPy 数组,如以下代码所示(以下代码的某些部分来自[这里](https://blog.keras.io/how-convolutional-neural-networks-see-the-world.html)):
我们可以绘制这些先前的激活。 一个激活层中的所有过滤器/特征图都可以绘制在网格中。 因此,根据层中滤镜的数量,我们将图像网格定义为 NumPy 数组,如以下代码所示(以下代码的某些部分来自[这里](https://blog.keras.io/how-convolutional-neural-networks-see-the-world.html)):
```py
import matplotlib.pyplot as plt
......@@ -129,7 +129,7 @@ display_grid = np.zeros((r * n_cols, images_per_row * c))
print(display_grid.shape)
```
现在,我们将遍历激活层中的所有特征地图,并将缩放后的输出放到网格中,如以下代码所示:
现在,我们将遍历激活层中的所有特征映射,并将缩放后的输出放到网格中,如以下代码所示:
```py
# We'll tile each filter into this big horizontal grid
......@@ -240,7 +240,7 @@ def deprocess_image(x):
DeepDream 算法与使用梯度上升的 ConvNet 过滤器可视化技术几乎相同,不同之处在于:
* 在 DeepDream 中,最大程度地激活了整个层,而在可视化中,只最大化了一个特定的过滤器,因此将大量特征图的可视化混合在一起
* 在 DeepDream 中,最大程度地激活了整个层,而在可视化中,只最大化了一个特定的过滤器,因此将大量特征图的可视化混合在一起
* 我们不是从随机噪声输入开始,而是从现有图像开始; 因此,最终的可视化效果将修改先前存在的视觉模式,从而以某种艺术性的方式扭曲图像的元素
* 输入图像以不同的比例(称为**八度**)进行处理,从而提高了可视化效果的质量
......@@ -430,7 +430,7 @@ save_img(img, fname='final_dream.png')
到目前为止,我们知道深度学习对于计算机视觉的真正威力在于利用诸如深层**卷积神经网络****CNN**)模型之类的模型,这些模型可用于在构建这些损失函数时提取正确的图像表示。 在本章中,我们将使用迁移学习的原理来构建用于神经风格迁移的系统,以提取最佳特征。 在前面的章节中,我们已经讨论了与计算机视觉相关的任务的预训练模型。 在本章中,我们将再次使用流行的 VGG-16 模型作为特征提取器。 执行神经风格转换的主要步骤如下所示:
* 利用 VGG-16 帮助计算风格,内容和生成图像的层激活
* 利用 VGG-16 帮助计算风格,内容和生成图像的层激活
* 使用这些激活来定义前面提到的特定损失函数
* 最后,使用梯度下降来最大程度地减少总损耗
......@@ -512,7 +512,7 @@ model = vgg16.VGG16(input_tensor=input_tensor,
# 内容损失
在任何基于 CNN 的模型中,来自顶层的激活都包含更多的全局和抽象信息(例如,诸如人脸之类的高级结构),而底层将包含局部信息(例如,诸如眼睛,鼻子, 边缘和角落)。 我们希望利用 CNN 的顶层来捕获图像内容的正确表示。 因此,对于内容损失,考虑到我们将使用预训练的 VGG-16 模型,我们可以将损失函数定义为通过计算得出的顶层激活(给出特征表示)之间的 L2 范数(缩放和平方的欧几里得距离)。 目标图像,以及在生成的图像上计算的同一层的激活。 假设我们通常从 CNN 的顶层获得与图像内容相关的特征表示,则预期生成的图像看起来与基本目标图像相似。 以下代码段显示了计算内容失的函数:
在任何基于 CNN 的模型中,来自顶层的激活都包含更多的全局和抽象信息(例如,诸如人脸之类的高级结构),而底层将包含局部信息(例如,诸如眼睛,鼻子, 边缘和角落)。 我们希望利用 CNN 的顶层来捕获图像内容的正确表示。 因此,对于内容损失,考虑到我们将使用预训练的 VGG-16 模型,我们可以将损失函数定义为通过计算得出的顶层激活(给出特征表示)之间的 L2 范数(缩放和平方的欧几里得距离)。 目标图像,以及在生成的图像上计算的同一层的激活。 假设我们通常从 CNN 的顶层获得与图像内容相关的特征表示,则预期生成的图像看起来与基本目标图像相似。 以下代码段显示了计算内容失的函数:
```py
def content_loss(base, combination):
......@@ -523,7 +523,7 @@ def content_loss(base, combination):
关于神经风格迁移的原始论文,[《一种由神经科学风格的神经算法》](https://arxiv.org/abs/1508.06576),由 Gatys 等人撰写。利用 CNN 中的多个卷积层(而不是一个)来从参考风格图像中提取有意义的风格和表示,捕获与外观或风格有关的信息。 不论图像内容如何,​​在所有空间尺度上都可以工作。风格表示可计算 CNN 不同层中不同特征之间的相关性。
忠于原始论文,我们将利用 **Gram 矩阵**并在由卷积层生成的特征表示上进行计算。 Gram 矩阵计算在任何给定的卷积层中生成的特征图之间的内积。 内积项与相应特征集的协方差成正比,因此可以捕获趋于一起激活的层的特征之间的相关性。 这些特征相关性有助于捕获特定空间比例的图案的相关汇总统计信息,这些统计信息与风格,纹理和外观相对应,而不与图像中存在的组件和对象相对应。
忠于原始论文,我们将利用 **Gram 矩阵**并在由卷积层生成的特征表示上进行计算。 Gram 矩阵计算在任何给定的卷积层中生成的特征图之间的内积。 内积项与相应特征集的协方差成正比,因此可以捕获趋于一起激活的层的特征之间的相关性。 这些特征相关性有助于捕获特定空间比例的图案的相关汇总统计信息,这些统计信息与风格,纹理和外观相对应,而不与图像中存在的组件和对象相对应。
因此,风格损失定义为参考风格的 Gram 矩阵与生成的图像之间的差异的按比例缩放的 Frobenius 范数(矩阵上的欧几里得范数)。 最小化此损失有助于确保参考风格图像中不同空间比例下找到的纹理在生成的图像中相似。 因此,以下代码段基于 Gram 矩阵计算定义了风格损失函数:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册