提交 dcd4e5d8 编写于 作者: W wizardforcel

2020-08-29 11:38:05

上级 9f8d6eee
......@@ -75,7 +75,7 @@
# 自动图像字幕的方法
现在,我们将讨论构建自动图像字幕系统的方法。 正如我之前提到的,我们的方法将利用基于深度神经网络的方法以及将学习移到图像字幕的方法。 这得益于流行论文[《Show and Tell:神经图像字幕生成器》](https://arxiv.org/abs/1411.4555)(Oriol Vinyals 等人,2015)。 我们将在概念上概述我们的方法,然后将其转换为将用于构建自动图像字幕系统的实用方法。 让我们开始吧!
现在,我们将讨论构建自动图像字幕系统的方法。 正如我之前提到的,我们的方法将利用基于深度神经网络的方法以及将学习移到图像字幕的方法。 这得益于流行论文[《Show and Tell:神经图像字幕生成器》](https://arxiv.org/abs/1411.4555)(Oriol Vinyals 等人,2015)。 我们将在概念上概述我们的方法,然后将其转换为将用于构建自动图像字幕系统的实用方法。 让我们开始吧!
# 概念方法
......@@ -135,7 +135,7 @@
在为字幕生成系统实现它们之前,让我们简要介绍一下这三个组件。
# 图像特征提取器–具有迁移学习功能的 DCNN 模型
# 图像特征提取器 – 使用迁移学习功能的 DCNN 模型
我们系统的主要输入之一是源图像或照片。 我们都知道,**机器学习****ML**)或深度学习模型不能仅使用原始图像。 我们需要进行一些处理,还需要从图像中提取相关特征,然后将这些特征用于识别和分类等任务。
......@@ -145,13 +145,13 @@
为了进行特征提取,我们将删除模型的顶部,即 softmax 层,并使用其余的层从输入图像中获取密集的特征向量。 这通常是编码过程的一部分,输出被馈送到产生字幕的解码器中。
# 文字字幕生成器–具有 LSTM 的基于序列的语言模型
# 文字字幕生成器 – 使用 LSTM 的基于序列的语言模型
如果传统的基于序列的语言模型知道序列中已经存在的先前单词,则它将预测下一个可能的单词。 对于我们的图像字幕问题,如上一节所述,基于 DCNN 模型的功能和字幕序列中已经生成的单词,LSTM 模型应该能够在每个时间步长预测我们字幕中的下一个可能单词 。
嵌入层用于为字幕数据字典或词汇表中的每个唯一单词生成单词嵌入,通常将其作为 LSTM 模型(解码器的一部分)的输入,来根据图像特征和先前的词序在我们的字幕中生成下一个可能的单词。 想法是最终生成一系列单词,这些单词一起在描述输入图像时最有意义。
# 编解码器型号
# 编解码器架构
这是将前面两个组件联系在一起的模型架构。 它最初是在神经机器翻译方面取得的巨大成功,通常您将一种语言的单词输入编码器,而解码器则输出另一种语言的单词。 好处是,使用单个端到端体系结构,您可以连接这两个组件并解决问题,而不必尝试构建单独的和断开的模型来解决一个问题。
......@@ -159,7 +159,7 @@ DCNN 模型通常形成编码器,该编码器将源输入图像编码为固定
现在,让我们使用这种方法来实现我们的自动图像标题生成器。
# 带有迁移学习的图像特征提取
# 使用迁移学习的图像特征提取
我们模型的第一步是利用预训练的 DCNN 模型,使用迁移学习的原理从源图像中提取正确的特征。 为简单起见,我们不会对 VGG-16 模型进行微调或将其连接到模型的其余部分。 我们将事先从所有图像中提取瓶颈特征,以加快以后的训练速度,因为使用多个 LSTM 构建序列模型即使在 GPU 上也需要大量的训练时间,我们很快就会看到。
......@@ -354,7 +354,7 @@ joblib.dump(img_tl_featureset, 'transfer_learn_img_features.pkl')
我们将在建模的下一部分中使用这些功能。
# 为我们的字幕建立词汇
# 为我们的字幕建立词汇
下一步涉及对字幕数据进行一些预处理,并为字幕构建词汇表或元数据字典。 我们首先读取训练数据集记录并编写一个函数来预处理文本标题:
......@@ -628,7 +628,7 @@ Next words: ['a', 'black', 'dog', 'is', 'running', 'after', 'a', 'white', 'dog',
很清楚,下一个单词通常基于输入字幕中每个时间步的单词顺序指向字幕中的下一个正确单词。 这些数据将在训练期间的每个时期馈入我们的模型。
# 建立我们的图像语言编解码器深度学习模型
# 建立我们的图像字幕编解码器深度学习模型
现在,我们拥有构建模型所需的所有基本组件和实用程序。 如前所述,我们将使用编码器-解码器深度学习模型架构来构建图像捕获系统。
......
......@@ -67,7 +67,7 @@ YUV 色彩空间([来源:Tonyle](https://commons.wikimedia.org/w/index.php?c
此图像是 UV 颜色通道在 0.5 Y 处的样本表示。
# 实验室
# LAB
这种与设备无关的色彩空间参考是由国际照明委员会开发的。 `L`通道表示颜色的亮度(0 为黑色,而 100 为漫射白色)。
......@@ -79,7 +79,7 @@ LAB 色彩空间([来源:Holger kkk Everding](https://commons.wikimedia.org/
除了这三种以外,还存在其他各种颜色模型。 出于当前有关图像着色的用例的目的,我们将采用一种非常有趣的方法。
# 重新陈述问题陈述
# 重新陈述问题
如果我们遵循使用最广泛的颜色模型 RGB,那么事实证明,训练模型以将输入的单色图像映射到颜色将是一项艰巨的任务。
......@@ -125,7 +125,7 @@ colornet 转换
本书的 GitHub 存储库中提供了本章使用的代码和示例图像以及`colornet_vgg16.ipynb`笔记本。
# 处理
# 处理
获取/整理所需数据集后的第一步是预处理。 对于当前的图像着色任务,我们需要执行以下预处理步骤:
......@@ -213,7 +213,7 @@ enc_output = Conv2D(256, (3,3),
在前面的代码片段中,有趣的方面是对第 1 层,第 3 层和第 5 层使用了 2 的步幅大小。2 的步幅长度将图像尺寸减半,但仍设法保持了纵横比。 这有助于增加信息密度而不会扭曲原始图像。
# 迁移学习特征提取
# 迁移学习特征提取
本章讨论的图像着色网络是一个非常独特的网络。 它的独特性来自我们使用迁移学习来增强模型的方式。 我们知道可以将预训练的网络用作特征提取器,以帮助迁移学习的模式并提高模型的性能。
......@@ -300,7 +300,7 @@ Colornet 由编码器,作为特征提取器的预训练模型,融合层和
使用 Keras 构建的深度学习模型通常是使用顺序 API 构建的。 在这种情况下,我们的着色网络(即 colornet)利用功能性 API 来实现融合层。
# 后处理
# 后处理
解决问题的技巧还没有结束。 如“预处理”小节中所述,我们将 -1 到 +1 之间的像素值标准化,以确保我们的网络正确训练。 同样,两个颜色通道的 LAB 颜色空间的值在 -128 到 +128 之间。 因此,执行以下两个后处理步骤:
......@@ -326,7 +326,7 @@ sample_img_embed = create_vgg_embedding(sample_img)
如前面的代码片段所示,我们使用 skimage 中的`lab2rgb`实用程序将生成的输出转换为 RGB 颜色空间。 这样做是为了便于可视化输出图像。
# 培训与结果
# 训练与结果
训练如此复杂的网络可能很棘手。 在本章中,我们从 ImageNet 中选择了一小部分图像。 为了帮助我们的网络学习和推广,我们使用 Keras 的`ImageDataGenerator`类来扩充数据集并在输入数据集中产生变化。 以下代码片段展示了图像增强和模型训练:
......@@ -362,7 +362,7 @@ Colornet 输出:第一列代表灰度输入,第二列代表模型输出,
前面的结果虽然不令人吃惊,但令人鼓舞。 通过对模型进行 600 个时期的训练,批次大小为 64,可以实现上述结果。
# 挑战
# 挑战
深度神经网络是功能强大的模型,具有成千上万个可学习的参数。 当前训练着色网络的方案提出了一系列新的挑战,其中一些挑战如下:
......
......@@ -12,7 +12,7 @@
**机器学习****ML**)中,我们尝试自动发现用于将输入数据映射到所需输出的规则。 在此过程中,创建适当的数据表示形式非常重要。 例如,如果我们要创建一种将电子邮件分类为垃圾邮件/火腿的算法,则需要用数字表示电子邮件数据。 一个简单的表示形式可以是二进制向量,其中每个组件从预定义的单词表中描述单词的存在与否。 同样,这些表示是与任务相关的,也就是说,表示可能会根据我们希望 ML 算法执行的最终任务而有所不同。
在前面的电子邮件示例中,如果我们要检测电子邮件中的情,则不必标识垃圾邮件/火腿,而更有用的数据表示形式可以是二进制向量,其中预定义词汇表由具有正极性或负极性的单词组成。 大多数 ML 算法(例如随机森林和逻辑回归)的成功应用取决于数据表示的质量。 我们如何获得这些表示? 通常,这些表示是人为制作的功能,通过做出一些明智的猜测来进行迭代设计。 此步骤称为**特征工程**,是大多数 ML 算法中的关键步骤之一。 **支持向量机****SVM**)或一般的内核方法,试图通过将数据的手工表示转换为更高维度的空间来创建更相关的数据表示,使得使用分类或回归来解决 ML 任务变得容易。 但是,SVM 很难扩展到非常大的数据集,并且在诸如图像分类和语音识别等问题上并不成功。 诸如随机森林和**梯度提升机****GBMs**)之类的集合模型创建了一组弱模型,这些模型专门用于很好地完成小任务,然后将这些弱模型以一些方式组合来产生最终输出。 当我们有非常大的输入尺寸时,它们工作得很好,而创建手工制作的功能是非常耗时的步骤。 总而言之,所有前面提到的 ML 方法都以浅浅的数据表示形式工作,其中涉及通过一组手工制作的特征进行数据表示,然后进行一些非线性转换。
在前面的电子邮件示例中,如果我们要检测电子邮件中的情,则不必标识垃圾邮件/火腿,而更有用的数据表示形式可以是二进制向量,其中预定义词汇表由具有正极性或负极性的单词组成。 大多数 ML 算法(例如随机森林和逻辑回归)的成功应用取决于数据表示的质量。 我们如何获得这些表示? 通常,这些表示是人为制作的功能,通过做出一些明智的猜测来进行迭代设计。 此步骤称为**特征工程**,是大多数 ML 算法中的关键步骤之一。 **支持向量机****SVM**)或一般的内核方法,试图通过将数据的手工表示转换为更高维度的空间来创建更相关的数据表示,使得使用分类或回归来解决 ML 任务变得容易。 但是,SVM 很难扩展到非常大的数据集,并且在诸如图像分类和语音识别等问题上并不成功。 诸如随机森林和**梯度提升机****GBMs**)之类的集合模型创建了一组弱模型,这些模型专门用于很好地完成小任务,然后将这些弱模型以一些方式组合来产生最终输出。 当我们有非常大的输入尺寸时,它们工作得很好,而创建手工制作的功能是非常耗时的步骤。 总而言之,所有前面提到的 ML 方法都以浅浅的数据表示形式工作,其中涉及通过一组手工制作的特征进行数据表示,然后进行一些非线性转换。
深度学习是 ML 的一个子字段,在其中创建数据的分层表示。 层次结构的较高级别由较低级别的表示形式组成。 更重要的是,通过完全自动化 ML 中最关键的步骤(称为**特征工程**),可以从数据中自动学习这种表示层次。 在多个抽象级别上自动学习功能允许系统直接从数据中学习输入到输出的复杂表示形式,而无需完全依赖于人工制作的功能。
......
......@@ -43,7 +43,7 @@
![](img/39e61d86-4db6-460c-a13b-8da4dbcd4889.png)
[资料来源](https://cloud4scieng.org/manifold-learning-and-deep-autoencoders-in-science/)
[数据来源](https://cloud4scieng.org/manifold-learning-and-deep-autoencoders-in-science/)
# 变分自编码器
......@@ -399,7 +399,7 @@ LSTM 可以用于序列预测以及序列分类。 例如,我们可以预测
![](img/9c3d34f8-aa07-489d-b95e-1d215daf0dee.png)
资料来源:https://www.tensorflow.org/tutorials/seq2seq
数据来源:https://www.tensorflow.org/tutorials/seq2seq
输入嵌入层后面是两个堆叠的 LSTM 层。 然后,投影层将最上面的隐藏状态转换为尺寸为`V`(目标语言的词汇量)的对率向量。 这里,交叉熵损失用于通过反向传播训练网络。 我们看到在训练模式下,源句子和目标句子都被输入到网络中。 在推理模式下,我们只有源句。 在那种情况下,可以通过几种方法来完成解码,例如贪婪解码,与贪婪解码结合的注意力机制以及集束搜索解码。 我们将在这里介绍前两种方法:
......
......@@ -20,11 +20,11 @@
传统机器学习
迁移学习使学习的过程更进一步,并且更加符合人类如何跨任务利用知识。 因此,迁移学习是一种将模型或知识重用于另一个相关任务的方法。 迁移学习有时也被视为现有 ML 算法的扩展。 在迁移学习的背景下,以及在了解如何在任务之间移知识的过程中,正在进行大量的研究和工作。 但是,**神经信息处理系统****NIPS**)1995 研讨会《学习:归纳系统中的知识整合和转移》被认为是这个领域的研究。
迁移学习使学习的过程更进一步,并且更加符合人类如何跨任务利用知识。 因此,迁移学习是一种将模型或知识重用于另一个相关任务的方法。 迁移学习有时也被视为现有 ML 算法的扩展。 在迁移学习的背景下,以及在了解如何在任务之间移知识的过程中,正在进行大量的研究和工作。 但是,**神经信息处理系统****NIPS**)1995 研讨会《学习:归纳系统中的知识整合和转移》被认为是这个领域的研究。
[NIPS 1995 的所有研讨会都在此处列出](http://www.cs.cmu.edu/afs/cs/project/cnbc/nips/NIPS95/Workshops.html)
从那时起,诸如*元学习**知识整合**归纳移*等术语已与迁移学习互换使用。 总是有不同的研究人员和学术著作提供不同背景下的定义。 在他们的书*深度学习*中,Goodfellow 等人。 在泛化的背景下指迁移学习。 它们的定义如下:
从那时起,诸如*元学习**知识整合**归纳移*等术语已与迁移学习互换使用。 总是有不同的研究人员和学术著作提供不同背景下的定义。 在他们的书*深度学习*中,Goodfellow 等人。 在泛化的背景下指迁移学习。 它们的定义如下:
*利用一种情况下所学的知识来改善另一种情况下的泛化的情况。*
......@@ -36,11 +36,11 @@
如上图所示,在学习目标任务时,来自现有任务的知识将作为附加输入。
# 迁移学习优势
# 迁移学习优势
我们利用源模型中的知识来改进目标任务中的学习。 除了提供重用已经构建的模型的功能之外,迁移学习还可以通过以下方式帮助学习目标任务:
* **改进了基准性能**:当我们使用源模型中的知识来增强孤立的学习者(也称为**无知学习者**)的知识时,由于这种知识移,基准性能可能会提高 。
* **改进了基准性能**:当我们使用源模型中的知识来增强孤立的学习者(也称为**无知学习者**)的知识时,由于这种知识移,基准性能可能会提高 。
* **模型开发时间**:与从头开始学习的目标模型相比,利用源模型的知识也可能有助于充分学习目标任务。 反过来,这会导致开发/学习模型所需的总时间减少。
* **改进的最终性能**:可以利用迁移学习获得更高的最终性能。
......@@ -77,9 +77,9 @@
到目前为止,我们已经看到迁移学习具有在目标任务中利用来自源学习者的现有知识的能力。 在迁移学习过程中,必须回答以下三个重要问题:
* **传输什么**:这是整个过程中的第一步,也是最重要的一步。 我们尝试寻求有关知识的哪一部分可以从源转移到目标的答案,以提高目标任务的性能。 当试图回答这个问题时,我们试图确定知识的哪一部分是特定于来源的,以及哪些是来源与目标之间的共同点。
* **何时转移**:在某些情况下,为了知识而转移知识可能比改善任何事情都变得更糟(也称为*负向转移*)。 我们应该以利用迁移学习为目标,以提高目标任务的绩效/结果,而不是使其退化。 我们需要注意何时转移以及何时不转移。
* **如何移**:一旦回答了什么和什么时候,我们便可以着手确定跨领域/任务实际转移知识的方式。 这涉及对现有算法和不同技术的更改,我们将在本章的后续部分中介绍。 此外,下一节将列出特定的用例,以更好地了解如何进行传输。
* **迁移什么**:这是整个过程中的第一步,也是最重要的一步。 我们尝试寻求有关知识的哪一部分可以从源迁移到目标的答案,以提高目标任务的性能。 当试图回答这个问题时,我们试图确定知识的哪一部分是特定于来源的,以及哪些是来源与目标之间的共同点。
* **何时迁移**:在某些情况下,为了知识而迁移知识可能比改善任何事情都变得更糟(也称为*负向迁移*)。 我们应该以利用迁移学习为目标,以提高目标任务的绩效/结果,而不是使其退化。 我们需要注意何时迁移以及何时不迁移。
* **如何移**:一旦回答了什么和什么时候,我们便可以着手确定跨领域/任务实际转移知识的方式。 这涉及对现有算法和不同技术的更改,我们将在本章的后续部分中介绍。 此外,下一节将列出特定的用例,以更好地了解如何进行传输。
Pan 和 Yang 撰写的论文《迁移学习综述》[可以在此处找到](https://www.cse.ust.hk/~qyang/Docs/2009/tkde_transfer_learning.pdf)
......@@ -94,7 +94,7 @@ Pan 和 Yang 撰写的论文《迁移学习综述》[可以在此处找到](http
* **实例传输**:从源域到目标任务的知识重用通常是理想的方案。 在大多数情况下,无法直接重用源域数据。 而是,源域中的某些实例可以与目标数据一起重用以改善结果。 在感应传输的情况下,Dai 及其合作者的 *AdaBoost* 之类的修改有助于利用源域中的训练实例来改进目标任务。
* **特征表示转移**:此方法旨在通过识别可从源域到目标域使用的良好特征表示,以最小化域差异并降低错误率。 根据标记数据的可用性,可以将有监督或无监督的方法应用于基于特征表示的传输。
* **参数传递**:此方法在以下假设下工作:相关任务的模型共享一些参数或超参数的先前分布。 与多任务学习不同,在多任务学习中同时学习源任务和目标任务,对于迁移学习,我们可以对目标域的丢失施加额外的权重以提高整体性能。
* **关系知识转移**:与前面三种方法不同,关系知识转移尝试处理非 IID 数据,例如非独立且分布相同的数据。 换句话说,每个数据点与其他数据点都有关系的数据; 例如,社交网络数据利用关系知识转移技术。
* **关系知识迁移**:与前面三种方法不同,关系知识迁移尝试处理非 IID 数据,例如非独立且分布相同的数据。 换句话说,每个数据点与其他数据点都有关系的数据; 例如,社交网络数据利用关系知识迁移技术。
在本节中,我们以非常通用的方式研究了在不同背景和环境下进行迁移学习的不同策略。 现在让我们利用这种理解,学习如何在深度学习的上下文中应用迁移学习。
......@@ -148,7 +148,7 @@ Pan 和 Yang 撰写的论文《迁移学习综述》[可以在此处找到](http
# 领域适应
域适配通常是指源域和目标域之间的边缘概率不同的情况,例如`P(X[s]) ≠ P(X[t])`。 源域和目标域的数据分布存在固有的偏移或漂移,需要进行调整才能迁移学习。 例如,标记为肯定或否定的电影评论语料库将不同于产品评论情绪的语料库。 如果用于对产品评论进行分类,则经过电影评论情绪训练的分类器将看到不同的分布。 因此,在这些情况下,领域自适应技术可用于迁移学习中。
域适配通常是指源域和目标域之间的边缘概率不同的情况,例如`P(X[s]) ≠ P(X[t])`。 源域和目标域的数据分布存在固有的偏移或漂移,需要进行调整才能迁移学习。 例如,标记为肯定或否定的电影评论语料库将不同于产品评论情感的语料库。 如果用于对产品评论进行分类,则经过电影评论情感训练的分类器将看到不同的分布。 因此,在这些情况下,领域自适应技术可用于迁移学习中。
# 域混乱
......@@ -166,13 +166,13 @@ Pan 和 Yang 撰写的论文《迁移学习综述》[可以在此处找到](http
多任务学习:学习者同时从所有任务接收信息
# 一键式学习
# 一学习
深度学习系统天生就渴望数据,因此它们需要许多训练示例来学习权重。 这是深度神经网络的局限性之一,尽管人类学习并非如此。 例如,一旦向孩子展示了苹果的外观,他们就可以轻松识别出不同种类的苹果(带有一个或几个培训示例); 机器学习和深度学习算法并非如此。 一次学习是迁移学习的一种变体,在这种学习中,我们尝试仅根据一个或几个训练示例来推断所需的输出。 这在无法为每个可能的类提供标签数据的现实世界场景中(如果是分类任务)和在经常可以添加新类的场景中非常有用。
据说 Fei-Fei 及其合作者具有里程碑意义的论文[《对象类别的单发学习》](https://ieeexplore.ieee.org/document/1597116/)。 在此子领域创造了“一次性学习和研究”一词。 本文提出了一种用于对象分类的表示学习的贝叶斯框架的变体。 此后,此方法已得到改进,并已使用深度学习系统进行了应用。
# 零镜头学习
# 零学习
零镜头学习是迁移学习的另一个极端变体,它不依赖任何标记的示例来学习任务。 这听起来令人难以置信,尤其是当使用示例学习是大多数监督学习算法所要解决的问题时。 零数据学习或零短学习方法在训练阶段本身进行了巧妙的调整,以利用附加信息来理解看不见的数据。 在他们的《学会学习》一书中,Goodfellow 及其合作者提出了零次学习作为学习三个变量的场景,例如传统输入变量`x`,传统输出变量`y`以及描述任务的其他随机变量`T&`。 因此,训练模型以学习`P(y | x, T)`的条件概率分布。 零镜头学习在机器翻译等场景中非常有用,在这种情况下,我们甚至可能没有目标语言的标签。
......@@ -180,13 +180,13 @@ Pan 和 Yang 撰写的论文《迁移学习综述》[可以在此处找到](http
迁移学习具有巨大的潜力,并且是现有学习算法通常需要的增强。 但是,与迁移学习相关的某些相关问题需要更多的研究和探索。 除了难以回答关于什么,什么时候以及如何转移的问题之外,负面转移和转移界限也带来了重大挑战。
# 负
# 负
到目前为止,我们讨论的案例都是基于源任务的知识转移来实现目标任务的改进。 在某些情况下,迁移学习会导致性能下降。 负向转移是指从源到目标的知识转移不会导致任何改善,而是导致目标任务的整体性能下降的情况。 否定转移的原因可能有多种,例如源任务与目标任务的关系不充分或转移方法不能很好地利用源任务和目标任务之间的关系的情况。 避免负向转移非常重要,需要仔细调查。 在他们的工作中,Rosenstien 及其合作者从经验上介绍了当源与目标过于不同时,暴力传递如何降低目标任务的性能。 正在研究 Bakker 及其合作者的贝叶斯方法,以及探索基于聚类的解决方案以识别相关性的其他技术,以避免产生负转移。
到目前为止,我们讨论的案例都是基于源任务的知识迁移来实现目标任务的改进。 在某些情况下,迁移学习会导致性能下降。 负向转移是指从源到目标的知识迁移不会导致任何改善,而是导致目标任务的整体性能下降的情况。 否定转移的原因可能有多种,例如源任务与目标任务的关系不充分或转移方法不能很好地利用源任务和目标任务之间的关系的情况。 避免负向转移非常重要,需要仔细调查。 在他们的工作中,Rosenstien 及其合作者从经验上介绍了当源与目标过于不同时,暴力传递如何降低目标任务的性能。 正在研究 Bakker 及其合作者的贝叶斯方法,以及探索基于聚类的解决方案以识别相关性的其他技术,以避免产生负转移。
# 转移界限
# 迁移的界限
在迁移学习中量化转移也非常重要,这对转移的质量及其可行性具有影响。 为了衡量转移的数量,哈桑·马哈茂德(Hassan Mahmud)及其合作者使用 Kolmogorov 复杂度证明了一定的理论界限,以分析迁移学习并衡量任务之间的相关性。 Eaton 及其合作者提出了一种新颖的基于图的方法来衡量知识移。 这些技术的详细讨论超出了本书的范围。 鼓励读者使用本节概述的出版物来探讨这些主题。
在迁移学习中量化转移也非常重要,这对转移的质量及其可行性具有影响。 为了衡量转移的数量,哈桑·马哈茂德(Hassan Mahmud)及其合作者使用 Kolmogorov 复杂度证明了一定的理论界限,以分析迁移学习并衡量任务之间的相关性。 Eaton 及其合作者提出了一种新颖的基于图的方法来衡量知识移。 这些技术的详细讨论超出了本书的范围。 鼓励读者使用本节概述的出版物来探讨这些主题。
# 总结
......
......@@ -15,7 +15,7 @@
我们要感谢 Francois Chollet 不仅创建了令人惊叹的深度学习框架 Keras,还感谢他在他的书《Python 深度学习》中谈到了有效学习迁移的现实世界问题。 在本章中,我们以此为灵感来刻画了迁移学习的真正力量。 本章的代码将在 GitHub 存储库中的[文件夹中提供](https://github.com/dipanjanS/hands-on-transfer-learning-with-python),根据需要遵循本章。
# 迁移学习的需要
# 迁移学习的必要性
我们已经在第 4 章“迁移学习基础”中简要讨论了迁移学习的优势。 概括地说,与从头开始构建深度学习模型相比,我们获得了一些好处,例如,改善了基准性能,加快了整体模型的开发和培训时间,并且还获得了整体改进和优越的模型性能。 这里要记住的重要一点是,迁移学习作为一个领域早已在深度学习之前就存在了,并且还可以应用于不需要深度学习的领域或问题。
......@@ -523,7 +523,7 @@ model.save('cats_dogs_cnn_img_aug.h5')
现在,我们将尝试并利用迁移学习的功能,看看是否可以构建更好的模型。
# 利用预训练的 CNN 模型来利用迁移学习
# 利用预训练的 CNN 模型迁移学习
到目前为止,我们已经通过指定自己的架构从头开始构建了 CNN 深度学习模型。 在本节中,我们将利用预训练的模型,该模型基本上是计算机视觉领域的专家,并且在图像分类和归类中享有盛誉。 我们建议您阅读第 4 章“迁移学习基础知识”,以简要地了解预训练模型及其在该领域中的应用。
......@@ -556,7 +556,7 @@ VGG-16 模型是建立在 ImageNet 数据库上的 16 层(卷积和完全连
因此,我们最关心的是利用 VGG-16 模型的卷积块,然后展平最终输出(来自特征图),以便我们可以将其输入到我们自己的密集层中进行分类。 本章本节中使用的所有代码都可以通过`Transfer Learning.ipynb` Jupyter 笔记本在 CNN 中找到。
# 预训练的 CNN 模型作为特征提取器
# 作为特征提取器的预训练的 CNN 模型
让我们利用 Keras,加载 VGG-16 模型并冻结卷积块,以便将其用作图像特征提取器:
......@@ -739,7 +739,7 @@ Epoch 30/30
model.save('cats_dogs_tlearn_basic_cnn.h5')
```
# 预训练的 CNN 模型作为具有图像增强的特征提取器
# 作为图像增强的特征提取器预训练的 CNN 模型
我们将为之前使用的训练和验证数据集使用相同的数据生成器。 为了便于理解,构建它们的代码如下所示:
......@@ -934,7 +934,7 @@ tl_img_aug_cnn = load_model('cats_dogs_tlearn_img_aug_cnn.h5') tl_img_aug_finetu
这有助于我们检索使用各种技术和体系结构在本章中创建的所有五个模型。
# 样本测试图像的模型预测
# 样本测试图像的模型预测
现在,我们将加载不属于任何数据集的样本图像,并尝试查看不同模型的预测。 我将在此处使用我的宠物猫的图像,因此这将很有趣! 让我们加载示例图像和一些基本配置:
......@@ -1052,7 +1052,7 @@ Sample convolution (activation map) shape: (150, 150)
为了获得上述激活功能图,我们利用了`Model Performance Evaluations.ipynb` Jupyter 笔记本中可用的代码段,这要感谢 Francois Chollet 和他的书《Python 深度学习》,它可以帮助可视化我们的 CNN 模型中所有选定的层。我们已经可视化了模型的前八层,这是我们在笔记本中较早选择的,但是在这里显示了前两个块的激活图。 随意检出笔记本并为自己的模型重复使用相同的代码。 从前面的屏幕截图中,您可能会看到顶层要素图通常保留了很多原始图像,但是当您深入模型时,要素图变得更加抽象,复杂且难以解释。
# 测试数据的评估模型性能
# 在测试数据上评估模型性能
现在是时候进行最终测试了,在该测试中,我们通过对测试数据集进行预测来从字面上测试模型的性能。 在进行预测之前,让我们先加载并准备测试数据集:
......
......@@ -109,7 +109,7 @@ model.add(Dense(NUM_CLASSES, activation='softmax'))
尽管绝不是最先进的结果,但结果足够不错。 读者应该记住,这个 CNN 只是为了展示手头的巨大潜力,我们鼓励您尝试在同一行上进行实验。
# 传播知识
# 迁移知识
由于本章和书着重于迁移学习,因此让我们快速进行利用和转移所学信息的实际任务。 在上一节中,我们讨论了不同的最新 CNN 架构。 现在,让我们利用在 ImageNet 上训练的 VGG-16 模型对 CIFAR-10 数据集中的图像进行分类。 该部分的代码在 IPython 笔记本`CIFAR10_VGG16_Transfer_Learning_Classifier.ipynb`中可用。
......@@ -310,7 +310,7 @@ In [8]:plot_batch(batch_df, grid_width=6, grid_height=6
这样的数据集需要彻底的探索。 我们已经在本节中介绍了一些探索性步骤。 进一步的步骤在引用的 IPython 笔记本中列出/执行。 鼓励读者逐步了解图像大小调整的影响,不同图层如何检测不同特征,灰度等。
# 资料准备
# 数据准备
探索性分析有助于我们更好地了解手头的数据集。 下一个任务是为数据集构建一个实际的分类器。 众所周知,对于任何分类问题,第一步都是将数据集分为训练集和验证集。 由于我们正在使用 Keras,因此我们将从其实用程序中获取帮助以帮助准备我们的数据集。 以下代码段展示了将原始数据集组织为训练集和验证集的过程:
......
# 文文件分类
# 文文件分类
在本章中,我们讨论了迁移学习在文本文档分类中的应用。 文本分类是一种非常流行的自然语言处理任务。 关键目标是根据文档的文本内容将文档分配到一个或多个类别或类别。 这在行业中得到了广泛的应用,包括将电子邮件分类为垃圾邮件/非垃圾邮件,审阅和评级分类,情感分析,电子邮件或事件路由,在此我们将电子邮件\事件分类,以便可以将其自动分配给相应的人员。 以下是本章将涉及的主要主题:
......@@ -12,7 +12,7 @@
我们将通过动手示例来关注概念和实际实现。 您可以在 [GitHub 存储库](https://github.com/dipanjanS/hands-on-transfer-learning-with-python)中的`Chapter 7`文件夹中快速阅读本章的代码。 可以根据需要参考本章。
# 文分类
# 文分类
给定一组文本文档和一组预定义类别,文本分类的目的是将每个文档分配给一个类别。 根据问题,输出可以是软分配或硬分配。 软分配意味着将类别分配定义为所有类别上的概率分布。
......@@ -26,7 +26,7 @@
* **体裁分类**:自动文本体裁分类对于分类和检索非常重要。 即使一组文档属于同一类别,因为它们共享一个共同的主题,但它们通常具有不同的用途,属于不同的流派类别。 如果可以检测到搜索数据库中每个文档的类型,则可以根据用户的喜好更好地向用户呈现信息检索结果。
* **索赔中的欺诈检测**:分析保险索赔文本文档并检测索赔是否为欺诈。
# 传统文分类
# 传统文分类
构建文本分类算法/模型涉及一组预处理步骤以及将文本数据正确表示为数值向量。 以下是一般的预处理步骤:
......@@ -448,7 +448,7 @@ model_output = Dense(K, activation='sigmoid',name='final')(z)
整个代码包含在`cnn_document_model`模块中。
# 建立评论情分类器
# 建立评论情分类器
现在,通过训练前面的 CNN 文档模型来构建情感分类器。 我们将使用[“亚马逊情感分析评论”](https://www.kaggle.com/bittlingmayer/amazonreviews)数据集来训练该模型。 该数据集由数百万个 Amazon 客户评论(输入文本)和星级(输出标签)组成。 数据格式如下:标签,后跟空格,审阅标题,后跟`:`和空格,位于审阅文本之前。 该数据集比流行的 IMDB 电影评论数据集大得多。 此外,此数据集包含各种产品和电影的相当多的评论集:
......@@ -459,7 +459,7 @@ Example:
__label__2 Good Movie: Awesome.... simply awesome. I couldn't put this down and laughed, smiled, and even got tears! A brand new favorite author.
```
在此,`__label__1`对应于 1 星和 2 星评论,`__label__2`对应于 4 星和 5 星评论。 但是,此数据集中未包含三星级评论,即具有中性情的评论。 在此数据集中,我们总共有 360 万个培训示例和 40 万个测试示例。 我们将从训练示例中随机抽取一个大小为 200,000 的样本,以便我们可以猜测一个很好的超参数来进行训练:
在此,`__label__1`对应于 1 星和 2 星评论,`__label__2`对应于 4 星和 5 星评论。 但是,此数据集中未包含三星级评论,即具有中性情的评论。 在此数据集中,我们总共有 360 万个培训示例和 40 万个测试示例。 我们将从训练示例中随机抽取一个大小为 200,000 的样本,以便我们可以猜测一个很好的超参数来进行训练:
```py
train_df = Loader.load_amazon_reviews('train')
......@@ -587,7 +587,7 @@ Train on 190000 samples, validate on 10000 samples
我们对 40 万条评论进行了评估,对模型进行了评估,结果的**准确度也达到 92%**。 这清楚地表明该模型非常适合此审阅数据,并且随着数据的增加,还有更多的改进空间。 到目前为止,在整个培训过程中,迁移学习的主要用途是用于初始化单词嵌入的 GloVe 嵌入向量。 在这里,由于我们拥有大量数据,因此我们可以从头开始学习权重。 但是,让我们看看在整个训练过程中,哪些词嵌入更新最多。
# 嵌入变化最大的是什么?
# 变化最大的嵌入是什么?
我们可以采用初始 GloVe 嵌入和最终学习的嵌入,并通过对每个单词的差异进行归一化来比较它们。 然后,我们可以对标准值进行排序,以查看哪些词变化最大。 这是执行此操作的代码:
......@@ -606,7 +606,7 @@ embd_change[0:20]
您可以检查是否最新的嵌入是针对意见词的。
# 迁移学习应用到 IMDB 数据集
# 迁移学习应用到 IMDB 数据集
我们应该使用迁移学习的一种情况是,手头任务的标签数据少得多,而相似但不同的领域的培训数据很多。 [IMDB 数据集](http://ai.stanford.edu/~amaas/data/sentiment/)是二进制情​​感分类数据集。 它拥有 25,000 条用于培训的电影评论和 25,000 条用于测试的电影评论。 关于此数据集,有很多已发表的论文,并且可能通过来自 Google 的 Mikolov 的[段落向量](https://arxiv.org/pdf/1405.4053.pdf)在此数据集上获得最佳结果。 他们在此数据集上实现了 **92.58%** 的准确性。 SVM 达到了 89%。 这个数据集的大小不错,我们可以从头开始训练 CNN 模型。 这为我们提供了与 SVM 相当的结果。 下一节将对此进行讨论。
......@@ -709,7 +709,7 @@ for l_name in ['word_conv','sentence_conv','hidden_0', 'final']:
在经过几个时期的训练之后,仅对隐藏层和最终的 S 型层进行了微调,我们在 25k 测试集上获得了 **86%** 测试精度。 如果我们尝试在这个小的数据集上训练 SVM 模型并预测整个 25k 测试集,则只能获得 82% 的准确性。 因此,即使我们的数据较少,迁移学习显然也有助于建立更好的模型。
# 使用 Word2vec 嵌入对完整 IMDB 数据集进行培训
# 使用 Word2vec 嵌入来训练完整 IMDB 数据集
现在,让我们尝试通过迁移学习到的 Word2vec 嵌入,在完整的 IMDB 数据集上训练文档 CNN 模型。
......
......@@ -275,7 +275,7 @@ plt.tight_layout()
随着时间的推移,我们可以清楚地看到`gun_shot`音频样本的各种音调强度,这对于作为特征提取的基础图像肯定是有效的。 在下一节中,我们将使用其中一些技术进行特征提取。
# 功能工程和音频事件的表示
# 特征工程和音频事件的表示
要构建可靠的分类模型,我们需要从原始音频数据中获得可靠且良好的特征表示。 我们将利用上一节中学到的一些技术进行要素工程。 如果您想自己运行示例,可以在`Feature Engineering.ipynb` Jupyter 笔记本中使用本节中使用的代码段。 我们将重用先前导入的所有库,并在此处利用`joblib`将功能保存到磁盘:
......@@ -444,11 +444,11 @@ joblib.dump(labels, 'dataset_labels.pkl')
这些基本功能将作为下一部分进一步功能设计的起点,在此我们将释放迁移学习的真正力量。
# 带有迁移学习的音频事件分类
# 使用迁移学习的音频事件分类
现在,我们准备开始构建音频事件分类器。 我们有基本的特征图,但仍然需要做更多的特征工程。 您始终可以从头开始构建 CNN 以摄取这些图像,然后将其连接到完全连接的深**多层感知器****MLP**)来构建分类器。 但是,在这里,我们将通过使用一种预训练的模型进行特征提取来利用迁移学习的力量。 更具体地说,我们将使用 VGG-16 模型作为特征提取器,然后在这些特征上训练完全连接的深度网络。
# 从基本要素构建数据集
# 从基本特征构建数据集
第一步是加载基本功能,并创建训练,验证和测试数据集。 为此,我们需要从磁盘加载基本功能和标签:
......@@ -809,7 +809,7 @@ model.save('sound_classification_model.h5')
您现在可能会认为这很好。 但是,我们在静态数据集上进行了所有操作。 我们将如何在现实世界中使用此模型进行音频事件识别和分类? 我们将在下一节中讨论策略。
# 构建深度学习音频事件标识符
# 构建深度学习音频事件识别器
现在,我们将研究一种策略,利用该策略,我们可以利用上一节中构建的分类模型来构建实际的音频事件标识符。 这将使我们能够利用本章中定义的整个工作流程来获取任何新的音频文件,并预测该文件可能属于的类别,从构建基本特征图开始,使用 VGG-16 模型提取特征,然后利用我们的分类模型做出预测。 如果您想自己运行示例,可以在`Prediction Pipeline.ipynb` Jupyter 笔记本中使用本节中使用的代码段。 笔记本包含`AudioIdentifier`类,该类是通过重用本章前面各节中构建的所有组件而创建的。 请参阅笔记本以访问该类的完整代码,因为我们将更加关注实际的预测管道,以使内容更加简洁。 我们将通过为类的实例提供分类模型的路径来初始化它:
......
# 深梦
# DeepDream
本章重点介绍了生成型深度学习的领域,这已成为真正的**人工智能****AI**)最前沿的核心思想之一。 我们将关注**卷积神经网络****CNN**)如何利用迁移学习来思考或可视化图像中的图案。 它们可以生成描述这些卷积网络思维甚至梦想方式之前从未见过的图像模式! DeepDream 于 2015 年由 Google 首次发布,由于深层网络开始从图像生成有趣的图案,因此引起了轰动。 本章将涵盖以下主要主题:
......@@ -234,7 +234,7 @@ def deprocess_image(x):
![](img/9b87a770-3ad0-498a-848e-7ab85919b52b.png)
# 深梦
# DeepDream
**DeepDream** 是一种艺术性的图像修改技术,它利用了以同名电影命名的深层 CNN 代码 *Inception* 所学习的表示形式。 我们可以拍摄任何输入图像并对其进行处理,以生成令人毛骨悚然的图片,其中充满了算法上的拟南芥伪像,鸟羽毛,狗似的面孔,狗眼-这是 DeepDream 修道院在 ImageNet 上接受过训练的事实,狗在这里繁殖,鸟类种类过多。
......@@ -360,7 +360,7 @@ for shape in successive_shapes:
save_img(img, fname='final_dream.png')
```
# 例子
# 示例
以下是 DeepDream 输出的一些示例:
......@@ -386,7 +386,7 @@ save_img(img, fname='final_dream.png')
# 风格迁移
绘画需要特殊技能,只有少数人已经掌握。 绘画呈现出内容和风格的复杂相互作用。 另一方面,照片是视角和光线的结合。 当两者结合时,结果是惊人的和令人惊讶的。 该过程称为**艺术风格移**。 以下是一个示例,其中输入图像是德国图宾根的 Neckarfront,风格图像是梵高着名的画作《星空》。 有趣,不是吗? 看一下以下图像:
绘画需要特殊技能,只有少数人已经掌握。 绘画呈现出内容和风格的复杂相互作用。 另一方面,照片是视角和光线的结合。 当两者结合时,结果是惊人的和令人惊讶的。 该过程称为**艺术风格移**。 以下是一个示例,其中输入图像是德国图宾根的 Neckarfront,风格图像是梵高着名的画作《星空》。 有趣,不是吗? 看一下以下图像:
![](img/794949a4-3e20-4ad0-8d38-060bc707b82a.png)
......@@ -506,11 +506,11 @@ model = vgg16.VGG16(input_tensor=input_tensor,
include_top=False)
```
# 建筑损失功能
# 构建损失函数
如背景小节所述,神经风格迁移的问题围绕内容和风格的损失函数。 在本小节中,我们将讨论和定义所需的损失函数。
# 内容
# 内容
在任何基于 CNN 的模型中,来自顶层的激活都包含更多的全局和抽象信息(例如,诸如人脸之类的高级结构),而底层将包含局部信息(例如,诸如眼睛,鼻子, 边缘和角落)。 我们希望利用 CNN 的顶层来捕获图像内容的正确表示。 因此,对于内容损失,考虑到我们将使用预训练的 VGG-16 模型,我们可以将损失函数定义为通过计算得出的顶层激活(给出特征表示)之间的 L2 范数(缩放和平方的欧几里得距离)。 目标图像,以及在生成的图像上计算的同一层的激活。 假设我们通常从 CNN 的顶层获得与图像内容相关的特征表示,则预期生成的图像看起来与基本目标图像相似。 以下代码段显示了计算内容丢失的函数:
......@@ -521,7 +521,7 @@ def content_loss(base, combination):
# 风格损失
关于神经风格移的原始论文,[《一种由神经科学风格的神经算法》](https://arxiv.org/abs/1508.06576),由 Gatys 等人撰写。利用 CNN 中的多个卷积层(而不是一个)来从参考风格图像中提取有意义的风格和表示,捕获与外观或风格有关的信息。 不论图像内容如何,​​在所有空间尺度上都可以工作。风格表示可计算 CNN 不同层中不同要素之间的相关性。
关于神经风格移的原始论文,[《一种由神经科学风格的神经算法》](https://arxiv.org/abs/1508.06576),由 Gatys 等人撰写。利用 CNN 中的多个卷积层(而不是一个)来从参考风格图像中提取有意义的风格和表示,捕获与外观或风格有关的信息。 不论图像内容如何,​​在所有空间尺度上都可以工作。风格表示可计算 CNN 不同层中不同要素之间的相关性。
忠于原始论文,我们将利用 **Gram 矩阵**并在由卷积层生成的特征表示上进行计算。 Gram 矩阵计算在任何给定的卷积层中生成的特征图之间的内积。 内积项与相应特征集的协方差成正比,因此可以捕获趋于一起激活的图层的特征之间的相关性。 这些特征相关性有助于捕获特定空间比例的图案的相关汇总统计信息,这些统计信息与风格,纹理和外观相对应,而不与图像中存在的组件和对象相对应。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册