提交 cb273900 编写于 作者: W wizardforcel

2020-08-28 11:34:55

上级 cfd66844
......@@ -96,7 +96,7 @@ ML 是 AI 的一个流行子领域,涵盖了非常广泛的领域。 如此受
形式上,分类算法的主要目标是根据输入数据点预测本质上属于分类的输出标签。 输出标签本质上是分类的; 也就是说,它们每个都属于离散的类或类别。
**Logistic 回归****支持向量机****SVM**),**神经网络****随机森林****k 最近邻****KNN**),**决策树**等是一些流行的分类算法。
**Logistic 回归****支持向量机****SVM**),**神经网络****随机森林****K 最近邻****KNN**),**决策树**等是一些流行的分类算法。
假设我们有一个真实的用例来评估不同的汽车模型。 为简单起见,让我们假设该模型可以根据多个输入训练样本预测每种汽车模型的输出是可接受的还是不可接受的。 输入的训练样本具有诸如购买价格,门数,容量(以人数计)和安全性的属性。
......
......@@ -836,7 +836,7 @@ vocab_size = vocab_metadata['vocab_size']
一种方法称为**采样****贪婪搜索**,我们从`<START>`令牌开始,输入图像特征,然后生成第一个单词 基于 LSTM 输出中的`p1`。 然后,我们将相应的预测词嵌入作为输入,并根据来自下一个 LSTM 的`p2`生成下一个词(以我们之前讨论的展开形式)。 继续此步骤,直到到达`<END>`令牌(表示字幕结束)为止,或者达到基于预定义阈值的令牌的最大可能长度。
第二种方法称为**集束搜索**,它比基于贪婪的搜索更有效,在基于贪婪的搜索中,我们在考虑到每个单词之前生成的单词的基础上,根据最高概率在每个步骤中选择最可能的单词 顺序,这正是采样的作用。 Beam 搜索扩展了贪婪搜索技术,并始终返回最可能输出的术语序列的列表。 因此,在构建每个序列时,为了在时间步`t+1`生成下一项,而不是进行贪婪搜索并生成最可能的下一项,迭代地考虑了一组`k`最佳句子基于下一步扩展到所有可能的下一词。 `k`的值通常是用户指定的参数,用于控制进行平行搜索或集束搜索以生成字幕序列的总数。 因此,在集束搜索中,我们以`k`最可能的单词作为字幕序列中的第一时间步输出开始,并继续生成下一个序列项,直到其中一个达到结束状态为止。 涵盖围绕集束搜索的详细概念的全部范围将不在当前范围之内,因此,如果您有兴趣,我们建议您查看有关 AI 上下文中集束搜索的任何标准文献。
第二种方法称为**集束搜索**,它比基于贪婪的搜索更有效,在基于贪婪的搜索中,我们在考虑到每个单词之前生成的单词的基础上,根据最高概率在每个步骤中选择最可能的单词 顺序,这正是采样的作用。 集束搜索扩展了贪婪搜索技术,并始终返回最可能输出的术语序列的列表。 因此,在构建每个序列时,为了在时间步`t+1`生成下一项,而不是进行贪婪搜索并生成最可能的下一项,迭代地考虑了一组`k`最佳句子基于下一步扩展到所有可能的下一词。 `k`的值通常是用户指定的参数,用于控制进行平行搜索或集束搜索以生成字幕序列的总数。 因此,在集束搜索中,我们以`k`最可能的单词作为字幕序列中的第一时间步输出开始,并继续生成下一个序列项,直到其中一个达到结束状态为止。 涵盖围绕集束搜索的详细概念的全部范围将不在当前范围之内,因此,如果您有兴趣,我们建议您查看有关 AI 上下文中集束搜索的任何标准文献。
# 实现基于集束搜索的字幕生成器
......@@ -936,7 +936,7 @@ def preprocess_captions(caption_list):
BLEU 算法的简单原理是针对一组参考字幕评估生成的文本字幕(通常针对一个或多个字幕评估一个字幕,在这种情况下,每个图像五个字幕)。 计算每个字幕的分数,然后在整个语料库中平均以得到质量的总体估计。 BLEU 分数始终介于 0 到 1 之间,分数接近 1 表示高质量的翻译。 甚至参考文本数据也不是完美的,因为人类在字幕图像期间也会出错,因此,其想法不是获得完美的 1,而是获得良好的整体 BLEU 分数。
我们将使用 NLTK 中的翻译模块中的[`corpus_bleu(...)`函数](http://www.nltk.org/api/nltk.translate.html#nltk.translate.bleu_score.corpus_bleu)来计算 BLEU 分数。 我们将计算 1、2、3 和 4 的总累积 BLEU 分数。 如我们已实现的评估功能所示,为`bleu2``bleu3``bleu4`分数的每个 n-gram 分数分配了相等的权重:
我们将使用 NLTK 中的翻译模块中的[`corpus_bleu(...)`函数](http://www.nltk.org/api/nltk.translate.html#nltk.translate.bleu_score.corpus_bleu)来计算 BLEU 分数。 我们将计算 1、2、3 和 4 元组的总累积 BLEU 分数。 如我们已实现的评估功能所示,为`bleu2``bleu3``bleu4`分数的每个 n-gram 分数分配了相等的权重:
```py
from nltk.translate.bleu_score import corpus_bleu
......
......@@ -35,7 +35,7 @@
![](img/8f1cb58e-6396-4356-882e-e773f540c85e.png)
托马斯·杨(Thomas Young)和赫尔曼·赫尔姆霍尔茨(Hermann Helmholtz):三锥细胞理论(来源:https://en.wikipedia.org/wiki/Color_space#/media/File:YoungHelm.jpg)
托马斯·杨(Thomas Young)和赫尔曼·赫尔姆霍尔茨(Hermann Helmholtz):[三锥细胞理论](https://en.wikipedia.org/wiki/Color_space#/media/File:YoungHelm.jpg)
我们对颜色的理解以及对颜色的理解方式的进步导致了颜色理论的形式化。 由于色彩理论本身是一个完整的领域,因此在本章中,我们将对其进行简要介绍。 关于这些主题的详细讨论超出了本书的范围。
......@@ -53,7 +53,7 @@
![](img/4411249b-c6c4-4faf-bb66-9598ca848e6c.png)
RGB 颜色空间(来源:英语 Wikipedia 的 SharkD。更高版本由 Jacobolus 上载,已从 en.wikipedia 转移到 Commons.Public 域,https://commons.wikimedia.org/w/index.php?curid = 2529435
RGB 颜色空间([来源:英语 Wikipedia 的 SharkD。更高版本由 Jacobolus 上传,已从 wikipedia en 转移到 Public Commons 域](https://commons.wikimedia.org/w/index.php?curid=2529435)
每种成分的零强度会导致黑色,而全强度会导致对白色的感觉。 尽管简单,但此颜色模型和颜色空间构成了大多数电子显示器(包括 CRT,LCD 和 LED)的基础。
......@@ -75,7 +75,7 @@ YUV 色彩空间([来源:Tonyle](https://commons.wikimedia.org/w/index.php?c
![](img/9f139cfc-8df5-44ca-b88e-db6314c11a3b.png)
LAB 色彩空间(来源:Holger kkk Everding –自己的作品,CC BY-SA 4.0,https://commons.wikimedia.org/w/index.php?curid = 38366968
LAB 色彩空间([来源:Holger kkk Everding](https://commons.wikimedia.org/w/index.php?curid=38366968),自己的作品,CC BY-SA 4.0
除了这三种以外,还存在其他各种颜色模型。 出于当前有关图像着色的用例的目的,我们将采用一种非常有趣的方法。
......@@ -105,7 +105,7 @@ colornet 转换
![](img/9ff5a5d4-1ebb-4948-9c61-6e45b7a3a6d5.png)
彩色图像及其组件-RGB,YUV 和 LAB
彩色图像及其组件 -- RGB,YUV 和 LAB
前面的图像显示了彩色图像的`L``A``B`通道,基于 [Zhang 及其合著者(2016)和 Federico 及其合著者(2017)](https://arxiv.org/abs/1603.08511)的作品。 我们将在接下来的部分中详细研究它们。
......@@ -135,7 +135,7 @@ colornet 转换
# 标准化
LAB 颜色空间的值介于-128 至+128 之间。 由于神经网络对输入值的大小敏感,因此我们将从-128 到+128 的变换后的像素值归一化,并将它们置于-1 到+1 范围内。 以下代码片段中展示了相同的内容:
LAB 颜色空间的值介于 -128 至 +128 之间。 由于神经网络对输入值的大小敏感,因此我们将从-128 到+128 的变换后的像素值归一化,并将它们置于 -1 到 +1 范围内。 以下代码片段中展示了相同的内容:
```py
def prep_data(file_list=[],
......@@ -236,7 +236,7 @@ def create_vgg_embedding(grayscaled_rgb):
return embedding
```
前面的代码段生成大小为 1,000 x 1 x 1 的输出特征向量。
前面的代码段生成大小为`1,000 x 1 x 1`的输出特征向量。
# 融合层
......@@ -302,7 +302,7 @@ Colornet 由编码器,作为特征提取器的预训练模型,融合层和
# 后期处理
解决问题的技巧还没有结束。 如“预处理”小节中所述,我们将-1 到+1 之间的像素值标准化,以确保我们的网络正确训练。 同样,两个颜色通道的 LAB 颜色空间的值在-128 到+128 之间。 因此,执行以下两个后处理步骤:
解决问题的技巧还没有结束。 如“预处理”小节中所述,我们将 -1 到 +1 之间的像素值标准化,以确保我们的网络正确训练。 同样,两个颜色通道的 LAB 颜色空间的值在 -128 到 +128 之间。 因此,执行以下两个后处理步骤:
* 我们将每个像素值乘以 128,以将值带入所需的颜色通道范围
* 我们将灰度输入图像与输出两通道图像连接起来,以获得幻觉的彩色图像
......@@ -387,7 +387,7 @@ Colornet 输出:第一列代表灰度输入,第二列代表模型输出,
在本章中,我们学习了颜色理论,不同的颜色模型和颜色空间。 这种理解帮助我们将问题陈述重新表述为从单通道灰度图像到两通道输出的映射。 然后,我们根据 Baldassarre 和他的合著者的作品,着手建立一个色网。 该实现涉及一个独特的三层网络,该网络由编码器,解码器和融合层组成。 融合层使我们能够通过将 VGG16 嵌入与编码器输出串联来利用传输学习。 网络需要一些特定的预处理和后处理步骤来训练给定的图像集。 我们的训练和测试数据集由 ImageNet 样本的子集组成。 我们对色网进行了数百次培训。 最后,我们提供了一些幻影图像,以了解该模型对着色任务的学习程度。 训练有素的色网学习了某些高级对象,例如草,但在较小或较不频繁的对象上表现不佳。 我们还讨论了这种类型的网络带来的一些挑战。
这结束了本书中由用例驱动的系列文章中的最后一章。 我们介绍了跨不同领域的不同用例。 每个用例都帮助我们利用了迁移学习的概念,本书的前两部分对此进行了详细讨论。 机器学习和深度学习领域的领先人物之一安德鲁·伍(Andrew Ng)在他的 NIPS 2016 教程中表示:
这结束了本书中由用例驱动的系列文章中的最后一章。 我们介绍了跨不同领域的不同用例。 每个用例都帮助我们利用了迁移学习的概念,本书的前两部分对此进行了详细讨论。 机器学习和深度学习领域的领先人物之一 Andrew Ng 在他的 NIPS 2016 教程中表示:
*迁移学习将成为机器学习商业成功的下一个推动力。*
......
......@@ -38,19 +38,19 @@
给定文本文档的语料库,我们可以应用前面的步骤,然后获得构成语料库的单词的纯净词汇。 下一步是文本表示。 **词袋****BoW**)模型是从文本文档中提取特征并创建文本向量表示的最简单但功能最强大的技术之一。 如果我们在提取的词汇表中有`N`个单词,则任何文档都可以表示为`D = {w[1], w[2], ...`,其中`w[i]`代表文档中单词出现的频率。 这种文本作为稀疏向量的表示称为 BoW 模型。 在这里,我们不考虑文本数据的顺序性质。 一种部分捕获顺序信息的方法是在构建词汇表时考虑单词短语或 n-gram 和单个单词特征。 但是,挑战之一是我们的代表人数。 也就是说,我们的词汇量爆炸了。
文档向量也可以表示为二进制向量,其中每个`w[i] ∈ {01}`表示文档中单词的存在或不存在。 最受欢迎的表示形式是单词频率的归一化表示形式,称为**词频-逆文档频率****TF-IDF**)表示形式。 通过将我们语料库中的文档总数除以每个术语的文档频率,然后对结果应用对数缩放,可以计算出 IDF 表示的文档逆频率。 TF-IDF 值是*词频**逆文档频率*的乘积。 它与单词在文档中出现的次数成正比地增加,并根据语料库中单词的频率按比例缩小,这有助于调整某些单词通常更频繁出现的事实。
文档向量也可以表示为二进制向量,其中每个`w[i] ∈ {0, 1}`表示文档中单词的存在或不存在。 最受欢迎的表示形式是单词频率的归一化表示形式,称为**词频-逆文档频率****TF-IDF**)表示形式。 通过将我们语料库中的文档总数除以每个术语的文档频率,然后对结果应用对数缩放,可以计算出 IDF 表示的文档逆频率。 TF-IDF 值是*词频**逆文档频率*的乘积。 它与单词在文档中出现的次数成正比地增加,并根据语料库中单词的频率按比例缩小,这有助于调整某些单词通常更频繁出现的事实。
现在,我们都准备建立一个分类模型。 我们需要一套带有标签的文件或培训数据。 以下是一些流行的文本分类算法:
* 多项式朴素贝叶斯
* 支持向量机
* k 最近邻
* K 最近邻
具有线性核的**支持向量机****SVM**)与用于文本分类的基准数据集相比,通常显示出更高的准确性。
# BoW 模型的缺点
使用基于单词计数的 BoW 模型,我们将丢失其他信息,例如每个文本文档中附近单词周围的语义,结构,序列和上下文。 在 BoW 中,具有相似含义的单词将得到不同的对待。 其他文本模型是**潜在语义索引****LSI**),其中文档以低维度(k < <词汇量)-隐藏的主题空间表示。 在 LSI 中,文档中的组成词也可以表示为`k`维密集向量。 据观察,在 LSI 模型中,具有相似语义的单词具有紧密的表示形式。 而且,单词的这种密集表示是将深度学习模型应用于文本的第一步,被称为**单词嵌入**。 基于神经网络的语言模型试图通过查看语料库中的单词序列来预测其相邻单词的单词,并在此过程中学习分布式表示,从而使我们能够密集地嵌入单词。
使用基于单词计数的 BoW 模型,我们将丢失其他信息,例如每个文本文档中附近单词周围的语义,结构,序列和上下文。 在 BoW 中,具有相似含义的单词将得到不同的对待。 其他文本模型是**潜在语义索引****LSI**),其中文档以低维度(k 远小于词汇量)-隐藏的主题空间表示。 在 LSI 中,文档中的组成词也可以表示为`k`维密集向量。 据观察,在 LSI 模型中,具有相似语义的单词具有紧密的表示形式。 而且,单词的这种密集表示是将深度学习模型应用于文本的第一步,被称为**单词嵌入**。 基于神经网络的语言模型试图通过查看语料库中的单词序列来预测其相邻单词的单词,并在此过程中学习分布式表示,从而使我们能够密集地嵌入单词。
# 基准数据集
......@@ -175,14 +175,14 @@ pd.DataFrame(similar_words).transpose()
GloVe 模型代表全局向量,它是一种无监督的学习模型,可用于获取类似于 Word2Vec 的密集词向量。 但是,该技术不同,并且对聚合的全局单词-单词共现矩阵执行训练,从而为我们提供了具有有意义子结构的向量空间。 该方法发表在 Pennington 及其合作者的论文[《GloVe:用于词表示的全局向量》](https://www.aclweb.org/anthology/D14-1162)。 我们已经讨论了基于计数的矩阵分解方法,例如**潜在语义分析****LSA**)和预测方法,例如 Word2vec。 本文声称,目前这两个家庭都遭受重大弊端。 像 LSA 之类的方法可以有效地利用统计信息,但是它们在词类比任务上的表现相对较差-我们是如何找到语义相似的词的。 像 skip-gram 这样的方法在类比任务上可能会做得更好,但它们在全局级别上却很少利用语料库的统计信息。
GloVe 模型的基本方法是首先创建一个庞大的单词-上下文共现矩阵,该矩阵由(单词,上下文)对组成,这样该矩阵中的每个元素都代表一个单词在上下文中出现的频率(可以是一个单词 单词顺序)。 这个词-语境矩阵`WC`与在各种任务的文本分析中普遍使用的术语-文档矩阵非常相似。 矩阵分解用于将矩阵`WC`表示为两个矩阵的乘积。 **字特征****WF**)矩阵和**特征上下文****FC**)矩阵。 `WC WF x FC`。 用一些随机权重初始化`WF``FC`,然后将它们相乘得到`WC'`(近似于`WC`)并测量与`WC`有多近。 我们使用**随机梯度下降****SGD**)进行多次操作,以最大程度地减少误差。 最后,`WF`矩阵为我们提供了每个单词的单词嵌入,其中`F`可以预设为特定数量的维。 要记住的非常重要的一点是,Word2vec 和 GloVe 模型在工作方式上非常相似。 他们两个的目的都是建立一个向量空间,每个词的位置根据其上下文和语义而受到其相邻词的影响。 Word2vec 从单词共现对的本地单个示例开始,而 GloVe 从整个语料库中所有单词的全局汇总共现统计开始。
GloVe 模型的基本方法是首先创建一个庞大的单词-上下文共现矩阵,该矩阵由(单词,上下文)对组成,这样该矩阵中的每个元素都代表一个单词在上下文中出现的频率(可以是一个单词 单词顺序)。 这个词-语境矩阵`WC`与在各种任务的文本分析中普遍使用的术语-文档矩阵非常相似。 矩阵分解用于将矩阵`WC`表示为两个矩阵的乘积。 **字特征****WF**)矩阵和**特征上下文****FC**)矩阵。 `WC = WF x FC`。 用一些随机权重初始化`WF``FC`,然后将它们相乘得到`WC'`(近似于`WC`)并测量与`WC`有多近。 我们使用**随机梯度下降****SGD**)进行多次操作,以最大程度地减少误差。 最后,`WF`矩阵为我们提供了每个单词的单词嵌入,其中`F`可以预设为特定数量的维。 要记住的非常重要的一点是,Word2vec 和 GloVe 模型在工作方式上非常相似。 他们两个的目的都是建立一个向量空间,每个词的位置根据其上下文和语义而受到其相邻词的影响。 Word2vec 从单词共现对的本地单个示例开始,而 GloVe 从整个语料库中所有单词的全局汇总共现统计开始。
在以下各节中,我们将同时使用 Word2vec 和 GloVe 来解决各种分类问题。 我们已经开发了一些实用程序代码,可从文件读取和加载 GloVe 和 Word2vec 向量,并返回嵌入矩阵。 预期的文件格式是标准 GloVe 文件格式。 以下是几个单词的五维嵌入格式示例:单词后跟向量,所有空格分开:
* 甩动 7.068106 -5.410074 1.430083 -4.482612 -1.079401
*-1.584336 4.421625 -12.552878 4.940779 -5.281123
* 侧面 0.461367 4.773087 -0.176744 8.251079 -11.168787
* 恐怖 7.324110 -9.026680 -0.616853 -4.993752 -4.057131
* 甩动`7.068106 -5.410074 1.430083 -4.482612 -1.079401`
*`-1.584336 4.421625 -12.552878 4.940779 -5.281123`
* 侧面`0.461367 4.773087 -0.176744 8.251079 -11.168787`
* 恐怖`7.324110 -9.026680 -0.616853 -4.993752 -4.057131`
以下是读取 GloVe 向量的主要功能,给定一个词汇表作为 Python 字典,字典键作为词汇表中的单词。 仅需要为我们的训练词汇中出现的单词加载所需的嵌入。 同样,用所有嵌入的均值向量和一些白噪声来初始化 GloVe 嵌入中不存在的词汇。 `0``1`行专用于空格和**语音外****OOV**)单词。 这些单词不在词汇表中,而是在语料库中,例如非常少见的单词或一些过滤掉的杂音。 空间的嵌入是零向量。 OOV 的嵌入是所有其余嵌入的均值向量:
......@@ -243,7 +243,7 @@ def update_embeddings(self, word_index_dict, other_embedding, other_word_index):
先前我们看到了词嵌入如何能够捕获它们表示的概念之间的许多语义关系。 现在,我们将介绍一个 ConvNet 文档模型,该模型可构建文档的分层分布式表示形式。 这发表在 [Misha Denil 等人的论文](https://arxiv.org/pdf/1406.3830.pdf)中。 该模型分为两个级别,一个句子级别和一个文档级别,这两个级别都使用 ConvNets 实现。 在句子级别,使用 ConvNet 将每个句子中单词的嵌入转换为整个句子的嵌入。 在文档级别,另一个 ConvNet 用于将句子嵌入转换为文档嵌入。
在任何 ConvNet 体系结构中,卷积层之后都是子采样/池化层。 在这里,我们使用 k-max 池。 k-max 合并操作与正常 max 合并略有不同,后者从神经元的滑动窗口获取最大值。 在 k-max 合并操作中,最大的`k`神经元取自下一层中的所有神经元。 例如,对[3,1,5,2]应用 2-max 合并将产生[3,5]。 在这里,内核大小为 3 且步幅为 1 的常规最大池将得到相同的结果。 让我们来考虑另一种情况。 如果我们对[1、2、3、4、5]应用最大池,则将得到[3、5],但是 2-max 池将给出[4、5]。 K-max 池可以应用于可变大小的输入,并且我们仍然可以获得相同数量的输出单位。
在任何 ConvNet 体系结构中,卷积层之后都是子采样/池化层。 在这里,我们使用 k-max 池。 k-max 合并操作与正常 max 合并略有不同,后者从神经元的滑动窗口获取最大值。 在 k-max 合并操作中,最大的`k`神经元取自下一层中的所有神经元。 例如,对`[3, 1, 5, 2]`应用 2-max 合并将产生`[3, 5]`。 在这里,内核大小为 3 且步幅为 1 的常规最大池将得到相同的结果。 让我们来考虑另一种情况。 如果我们对`[1, 2, 3, 4, 5]`应用最大池,则将得到`[3, 5]`,但是 2-max 池将给出`[4, 5]`。 K-max 池可以应用于可变大小的输入,并且我们仍然可以获得相同数量的输出单位。
下图描述了**卷积神经网络****CNN**)架构。 我们已针对各种用例对该结构进行了一些微调,将在此处进行讨论:
......@@ -416,7 +416,7 @@ for sent in range(num_sentences):
## shape post k-max pooling and reshape (None, 18=6*3, 1)
```
因此,我们将形状为 30×50 的每个句子转换为 18×1,然后将这些张量连接起来以获得句子嵌入。 我们使用 Keras 中的`Concatenate`层来实现相同的功能:
因此,我们将形状为`30×50`的每个句子转换为`18×1`,然后将这些张量连接起来以获得句子嵌入。 我们使用 Keras 中的`Concatenate`层来实现相同的功能:
```py
z = Concatenate()(conv_blocks) if len(conv_blocks) > 1 else conv_blocks[0]
......@@ -608,7 +608,7 @@ embd_change[0:20]
# 迁移学习–应用到 IMDB 数据集
我们应该使用迁移学习的一种情况是,手头任务的标签数据少得多,而相似但不同的领域的培训数据很多。 [IMDB 数据集](http://ai.stanford.edu/~amaas/data/sentiment/)是二进制情​​感分类数据集。 它拥有 25,000 条用于培训的电影评论和 25,000 条用于测试的电影评论。 关于此数据集,有很多已发表的论文,并且可能通过 Le 和 Mikolov 的[段落向量](https://arxiv.org/pdf/1405.4053.pdf)在此数据集上获得最佳结果 来自 Google。 他们在此数据集上实现了 **92.58%** 的准确性。 SVM 达到了 89%。 这个数据集的大小不错,我们可以从头开始训练 CNN 模型。 这为我们提供了与 SVM 相当的结果。 下一节将对此进行讨论。
我们应该使用迁移学习的一种情况是,手头任务的标签数据少得多,而相似但不同的领域的培训数据很多。 [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 相当的结果。 下一节将对此进行讨论。
现在,让我们尝试使用少量的 IMDB 数据样本(例如 **5%**)构建模型。 在许多实际情况下,我们面临训练数据不足的问题。 我们无法使用此小型数据集训练 CNN。 因此,我们将使用迁移学习为该数据集构建模型。
......
......@@ -23,7 +23,7 @@
我们这里的实际案例研究的主要目标是音频事件的识别和分类。 这是一个监督学习问题,我们将在音频事件数据集上使用属于特定类别(它们是声音的来源)的音频数据样本进行处理。
我们将利用迁移学习和深度学习中的概念来构建可靠的分类器,从而在任何给定音频样本属于我们预定类别之一的情况下,我们都应该能够正确预测该声音的来源。 我们将使用的数据集通常被称为 [UrbanSound8K 数据集](https://urbansounddataset.weebly.com/),并且具有 8,732 个带标签的音频声音文件(其持续时间通常等于或大于 少于 4 秒),其中包含城市常见声音的摘录。 该数据集中的声音的十个类别如下:
我们将利用迁移学习和深度学习中的概念来构建可靠的分类器,从而在任何给定音频样本属于我们预定类别之一的情况下,我们都应该能够正确预测该声音的来源。 我们将使用的数据集通常被称为 [UrbanSound8K 数据集](https://urbansounddataset.weebly.com/),并且具有 8,732 个带标签的音频声音文件(其持续时间通常等于或大于 4 秒),其中包含城市常见声音的摘录。 该数据集中的声音的十个类别如下:
* `air_conditioner`
* `car_horn`
......@@ -254,7 +254,7 @@ plt.tight_layout()
您可以看到音频样本的两个不同成分显示为两个独特的声谱图,分别描述了谐波成分和打击乐成分。
音频数据的另一个非常有趣的描述是使用一个色谱图,该图显示了基于十二种不同音高类别(即{`C``C#``D``D#`[ `E`,`F`,`F#`,`G`,`G#`,`A`,`A#`和`B`}。 这是用于描述音频信号随时间变化的各种音调强度的出色视觉工具。 通常,在构建色谱图之前,会对原始音频信号执行傅立叶变换或 Q 变换:
音频数据的另一个非常有趣的描述是使用一个色谱图,该图显示了基于十二种不同音高类别(即`{C, C#, D, D#, E, F, F#, G, G#, A, A#, B}`。 这是用于描述音频信号随时间变化的各种音调强度的出色视觉工具。 通常,在构建色谱图之前,会对原始音频信号执行傅立叶变换或 Q 变换:
```py
C = librosa.feature.chroma_cqt(y=y_harmonic, sr=sr)
......@@ -314,9 +314,9 @@ def windows(data, window_size):
这个想法来自 Karol J. Piczak 的出色论文,[《具有卷积神经网络的环境声音分类》](https://ieeexplore.ieee.org/document/7324337/)(IEEE2015)。他将梅尔频谱图用于一般必要的特征,CNN 可以使用这些特征来进行特征提取。 但是,我们已经考虑了对最终特征图的一些其他转换。
第一步是将帧(列)的总数定义为 **64** ,将波段(行)的总数定义为 **64**,这形成了每个特征图的尺寸(64 x 64)。 然后,基于此,我们提取音频数据的窗口,从每个音频数据样本中形成子样本。
第一步是将帧(列)的总数定义为 **64** ,将波段(行)的总数定义为 **64**,这形成了每个特征图的尺寸(`64 x 64`)。 然后,基于此,我们提取音频数据的窗口,从每个音频数据样本中形成子样本。
考虑每个音频子样本,我们首先创建一个梅尔声谱图。 由此,我们创建了一个对数缩放的梅尔频谱图,作为特征图之一,音频子样本的谐波分量和敲击分量的平均特征图(再次对数缩放)以及对数缩放的增量或导数 梅尔频谱图作为第三特征图。 这些特征图的每一个都可以表示为 64 x 64 图像,并且通过组合它们,我们可以为每个音频子样本获得尺寸为(64、64、3)的 3-D 特征图。 现在,为该工作流程定义函数:
考虑每个音频子样本,我们首先创建一个梅尔声谱图。 由此,我们创建了一个对数缩放的梅尔频谱图,作为特征图之一,音频子样本的谐波分量和敲击分量的平均特征图(再次对数缩放)以及对数缩放的增量或导数 梅尔频谱图作为第三特征图。 这些特征图的每一个都可以表示为`64 x 64`图像,并且通过组合它们,我们可以为每个音频子样本获得尺寸为`(64, 64, 3)`的 3-D 特征图。 现在,为该工作流程定义函数:
```py
def extract_features(file_names, bands=64, frames=64):
......@@ -396,7 +396,7 @@ features.shape, labels.shape
((30500, 64, 64, 3), (30500,))
```
我们从 8,732 个音频数据文件中总共获得了 30,500 个特征图。 这非常好,并且正如我们前面所讨论的,每个特征图都是尺寸(64、64、3)。 现在,基于以下 30,500 个数据点,查看音频源的整体类表示形式:
我们从 8,732 个音频数据文件中总共获得了 30,500 个特征图。 这非常好,并且正如我们前面所讨论的,每个特征图都是尺寸`(64, 64, 3)`。 现在,基于以下 30,500 个数据点,查看音频源的整体类表示形式:
```py
from collections import Counter
......
......@@ -386,11 +386,11 @@ save_img(img, fname='final_dream.png')
# 风格迁移
绘画需要特殊技能,只有少数人已经掌握。 绘画呈现出内容和风格的复杂相互作用。 另一方面,照片是视角和光线的结合。 当两者结合时,结果是惊人的和令人惊讶的。 该过程称为**艺术风格转移**。 以下是一个示例,其中输入图像是德国图宾根的 Neckarfront,风格图像是 Vincent van Gogh 着名的画作《星空》。 有趣,不是吗? 看一下以下图像:
绘画需要特殊技能,只有少数人已经掌握。 绘画呈现出内容和风格的复杂相互作用。 另一方面,照片是视角和光线的结合。 当两者结合时,结果是惊人的和令人惊讶的。 该过程称为**艺术风格转移**。 以下是一个示例,其中输入图像是德国图宾根的 Neckarfront,风格图像是梵高着名的画作《星空》。 有趣,不是吗? 看一下以下图像:
![](img/794949a4-3e20-4ad0-8d38-060bc707b82a.png)
左图:描绘德国蒂宾根 Neckarfront 的原始照片。 右图:为相应生成的图像提供风格的绘画(插图:Vincent van Gogh 的《星夜》)。 来源:《一种艺术风格的神经算法》(Gatys 等人,arXiv:1508.06576v2)
左图:描绘德国蒂宾根 Neckarfront 的原始照片。 梵高的《星空》)。 来源:《一种艺术风格的神经算法》(Gatys 等人,arXiv:1508.06576v2)
如果您仔细查看前面的图像,则右侧的绘画风格图像似乎已经从左侧的照片中拾取了内容。 绘画的风格,颜色和笔触风格产生了最终结果。 令人着迷的结果是 Gatys 等人在论文[《一种用于艺术风格的神经算法》](https://arxiv.org/abs/1508.06576)中提出的一种迁移学习算法的结果。 我们将从实现的角度讨论本文的复杂性,并了解如何自己执行此技术。
......@@ -523,7 +523,7 @@ def content_loss(base, combination):
关于神经风格转移的原始论文,[《一种由神经科学风格的神经算法》](https://arxiv.org/abs/1508.06576),由 Gatys 等人撰写。利用 CNN 中的多个卷积层(而不是一个)来从参考风格图像中提取有意义的风格和表示,以捕获与外观或风格有关的信息 不论图像内容如何,​​在所有空间尺度上都可以。 风格表示可计算 CNN 不同层中不同要素之间的相关性。
忠于原始论文,我们将利用 **Gram 矩阵**并在由卷积层生成的特征表示上进行计算。 Gram 矩阵计算在任何给定的 conv 层中生成的特征图之间的内积。 内积项与相应特征集的协方差成正比,因此可以捕获趋于一起激活的图层的特征之间的相关性。 这些特征相关性有助于捕获特定空间比例的图案的相关汇总统计信息,这些统计信息与风格,纹理和外观相对应,而不与图像中存在的组件和对象相对应。
忠于原始论文,我们将利用 **Gram 矩阵**并在由卷积层生成的特征表示上进行计算。 Gram 矩阵计算在任何给定的卷积层中生成的特征图之间的内积。 内积项与相应特征集的协方差成正比,因此可以捕获趋于一起激活的图层的特征之间的相关性。 这些特征相关性有助于捕获特定空间比例的图案的相关汇总统计信息,这些统计信息与风格,纹理和外观相对应,而不与图像中存在的组件和对象相对应。
因此,风格损失定义为参考风格的 Gram 矩阵与生成的图像之间的差异的按比例缩放的 Frobenius 范数(矩阵上的欧几里得范数)。 最小化此损失有助于确保参考风格图像中不同空间比例下找到的纹理在生成的图像中相似。 因此,以下代码段基于 Gram 矩阵计算定义了风格损失函数:
......@@ -559,7 +559,7 @@ def total_variation_loss(x):
# 总损失函数
在定义了用于神经风格传递的整体损失函数的组成部分之后,下一步就是将这些构造块缝合在一起。 由于内容和风格信息是由 CNN 在网络中的不同深度捕获的,因此我们需要针对每种损失类型在适当的层上应用和计算损失。 我们将对 conv 图层进行 1 到 5 层的风格损失,并为每一层设置适当的权重。
在定义了用于神经风格传递的整体损失函数的组成部分之后,下一步就是将这些构造块缝合在一起。 由于内容和风格信息是由 CNN 在网络中的不同深度捕获的,因此我们需要针对每种损失类型在适当的层上应用和计算损失。 我们将对卷积层进行 1 到 5 层的风格损失,并为每一层设置适当的权重。
这是构建整体损失函数的代码片段:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册