提交 b6885410 编写于 作者: W wizardforcel

2020-12-06 13:27:02

上级 1bcba9e2
......@@ -22,97 +22,97 @@
# 这本书涵盖的内容
*第 1 章**人工智能简介*
第 1 章,“人工智能简介”
本章提供了将在整本书中使用的一些基本定义和分组。 它还将提供当今人工智能和机器学习领域的总体分类。
*第 2 章**人工智能的基本用例*
第 2 章,“人工智能的基本用例”
人工智能是一个引人入胜的话题,知识领域广泛。 在当前状态下,它产生的问题多于答案,但是肯定有很多地方在应用人工智能,甚至在许多情况下,我们甚至都没有意识到。 在深入研究驱动 AI 的基本算法之前,我们将分析迄今为止该技术的一些最受欢迎的用例。
*第 3 章**机器学习管道*
第 3 章,“机器学习管道”
模型训练只是机器学习过程中的一小部分。 数据科学家经常花费大量时间来清理,转换和准备数据,以备 AI 模型使用。 由于数据准备是一项非常耗时的活动,因此,我们将介绍最先进的技术来促进此活动以及精心设计的生产数据管道应具有的其他组件。
*第 4 章**特征选择和特征工程*
第 4 章,“特征选择和特征工程”
通过选择正确的尺寸传递给模型以及发现可以丰富输入数据集的新尺寸,可以提高模型性能。 本章将说明如何从现有功能以及外部资源创建新功能。 它还将介绍如何消除冗余或低价值的功能。
*第 5 章**使用监督学习的分类和回归*
第 5 章,“使用监督学习的分类和回归”
本章详细定义了监督学习。 它提供了属于该分类的各种方法和算法的分类法。
*第 6 章**集成学习的预测分析*
第 6 章,“集成学习的预测分析”
集成学习是一项强大的技术,可让您汇总各个模型的功能。 本章介绍了不同的合奏方法,以及何时使用它们的指南。 最后,本章将介绍如何将这些技术应用于实际事件预测。
*第 7 章**在无监督学习的情况下检测模式*
第 7 章,“在无监督学习的情况下检测模式”
本章将探讨聚类和数据分割的概念,以及它们与无监督学习的关系。 它还将介绍如何执行聚类以及如何应用各种聚类算法。 它将显示几个示例,使读者可以直观地看到这些算法的工作方式。 最后,它将介绍这些算法在实际情况下执行聚类和分段的应用。
*第 8 章**构建推荐系统*
第 8 章,“构建推荐系统”
本章将演示如何构建推荐系统。 它还将显示如何保留用户首选项。 它将涵盖最近邻居搜索和协作过滤的概念。 最后,将有一个示例显示如何构建电影推荐系统。
*第 9 章**逻辑编程*
第 9 章,“逻辑编程”
本章将介绍如何使用逻辑编程编写程序。 它将讨论各种编程范例,并了解如何使用逻辑编程构造程序。 它将重点介绍逻辑编程的构建块,并介绍如何解决该领域的问题。 最后,将为解决各种问题的各种求解器构建各种 Python 程序实现。
*第 10 章**启发式搜索技术*
第 10 章,“启发式搜索技术”
本章介绍启发式搜索技术。 启发式搜索技术用于搜索解决方案空间以得出答案。 使用指导搜索算法的试探法进行搜索。 启发式算法允许算法加快处理过程,否则将需要很长时间才能得出解决方案。
*第 11 章**遗传算法和遗传编程*
第 11 章,“遗传算法和遗传编程”
我们将讨论基因编程的基础及其在 AI 领域中的重要性。 我们将学习如何使用遗传算法解决简单的问题。 我们将了解一些用于基因编程的基本概念。 然后,我们将看到如何将此应用于实际问题。
*第 12 章**云上的人工智能*
第 12 章,“云上的人工智能”
云使我们能够加速 AI 开发,工作负载和部署。 在本章中,我们将探讨支持和加速 AI 项目的最受欢迎供应商提供的不同产品。
*第 13 章**使用人工智能构建游戏*
第 13 章,“使用人工智能构建游戏”
本章将介绍如何使用人工智能技术构建游戏。 搜索算法将用于制定制胜游戏的策略和战术。 最后,将为各种游戏构建智能机器人。
*第 14 章**构建语音识别器*
第 14 章,“构建语音识别器”
本章将介绍如何执行语音识别。 它将显示如何处理语音数据并从中提取特征。 最后,它将演示如何使用提取的功能来构建语音识别系统。
*第 15 章**自然语言处理*
第 15 章,“自然语言处理”
本章将重点介绍 AI 的重要领域,即**自然语言处理****NLP**)。 它将讨论各种概念,例如标记化,词干化和词形化处理文本。 它还将介绍如何构建“语言袋”模型并将其用于分类文本。 它将演示如何使用机器学习来分析给定句子的情感。 最后,它将显示主题建模并介绍用于识别文档中主题的系统实现。
*第 16 章**聊天机器人*
第 16 章,“聊天机器人”
聊天机器人可以通过提高生产力和转移呼叫帮助节省资金并更好地为客户服务。 在本章中,我们将介绍聊天机器人的基础知识以及可用于构建聊天机器人的工具。
最后,我们将从头开始构建一个成熟的聊天机器人,它将实现一个实际的用例,包括错误处理,将其连接到外部 API 以及部署该聊天机器人。
*第 17 章**顺序数据和时间序列分析*
第 17 章,“序列数据和时间序列分析”
我们将讨论概率推理的概念。 我们将学习如何应用该概念为顺序数据建立模型。 我们将学习时间序列数据的各种特征。 我们将讨论隐马尔可夫模型以及如何使用它们分析顺序数据。 然后,我们将使用此技术来分析股票市场数据。
*第 18 章**图像识别*
第 18 章,“图像识别”
在本章中,我们将讨论如何处理图像。 我们将学习如何检测和跟踪实时视频中的对象。 然后,我们将学习如何应用这些技术来跟踪人脸的各个部分。
*第 19 章**神经网络*
第 19 章,“神经网络”
我们将讨论人工神经网络。 我们将学习感知器,并了解它们如何用于构建神经网络。 我们将学习如何构建单层和多层神经网络。 我们将讨论神经网络如何学习训练数据并建立模型。 我们将学习成本函数和反向传播。 然后,我们将使用这些技术来执行光学字符识别。
*第 20 章**带卷积神经网络的深度学习*
第 20 章,“卷积神经网络与深度学习”
我们将在本章中讨论深度学习的基础知识。 将向读者介绍卷积神经网络中的各种概念,以及如何将它们用于图像识别。 我们将讨论卷积神经网络中的各个层。 然后,我们将使用这些技术来构建实际应用程序。
*第 21 章**递归神经网络和其他深度学习模型*
第 21 章,“循环神经网络和其他深度学习模型”
本章将继续涵盖其他类型的深度学习算法。 首先将介绍递归神经网络,然后将介绍较新的算法,例如注意力,自我注意和变压器模型。 本章将介绍使用这些网络的用例以及使用这些模型体系结构的优势及其局限性。 最后,讨论的技术将用于构建实际应用程序。
本章将继续涵盖其他类型的深度学习算法。 首先将介绍循环神经网络,然后将介绍较新的算法,例如注意力,自我注意和变压器模型。 本章将介绍使用这些网络的用例以及使用这些模型体系结构的优势及其局限性。 最后,讨论的技术将用于构建实际应用程序。
*第 22 章**通过强化学习创建智能代理*
第 22 章,“通过强化学习创建智能体”
本章将定义**强化学习****RL**),并涵盖 RL 模型中的组件。 它将详细介绍用于构建 RL 系统的技术。 最后,它将演示如何构建可以通过与环境交互进行学习的学习代理。
*第 23 章**人工智能和大数据*
第 23 章,“人工智能和大数据”
本章将分析如何将大数据技术应用于加速机器学习流程,以及涵盖可用于简化数据集提取,转换和验证的各种技术。 最后,它将引导读者阅读使用 Apache Spark 的实际示例,以演示本章介绍的概念。
......
......@@ -19,7 +19,7 @@
# 启发式搜索是人工智能吗?
*第 2 章**人工智能的基本用例*中,我们了解了 Pedro Domingos 定义的五个部落。 *象征主义者*部落是最“古老”的部落之一。 至少对我来说,这一事实不足为奇。 作为人类,我们尝试在所有事物中找到规则和模式。 不幸的是,世界有时是混乱的,并非所有事物都遵循简单的规则。
第 2 章,“人工智能的基本用例”中,我们了解了 Pedro Domingos 定义的五个部落。 *象征主义者*部落是最“古老”的部落之一。 至少对我来说,这一事实不足为奇。 作为人类,我们尝试在所有事物中找到规则和模式。 不幸的是,世界有时是混乱的,并非所有事物都遵循简单的规则。
这就是为什么当我们没有秩序的世界时,其他部落出现来帮助我们的原因。 但是,当我们的搜索空间较小且域受到限制时,使用启发式,约束满足以及本章中介绍的其他技术对于这组问题很有用。 当组合的数量相对较少且组合爆炸受到限制时,这些技术很有用。 例如,当城市数量大约为 20 时,使用这些技术解决旅行商问题很简单。如果我们尝试对`n`= 2000 求解相同的问题,则必须使用其他方法来解决。 不要探索整个空间,而只能给出结果的近似值。
......
......@@ -1183,7 +1183,7 @@ GP 算法广泛用于金融交易,时间序列预测和经济建模领域;
**并行化**-GA 也具有并行处理功能,并且被证明是解决需要并行处理的问题的有效方法。 并行化是 GA 和 GP 研究的活跃领域。
**神经网络**-GA 用于训练神经网络,尤其是递归神经网络(RNN)。
**神经网络**-GA 用于训练神经网络,尤其是循环神经网络(RNN)。
**经济学**-GA 通常用于对经济系统进行建模,例如:
......
......@@ -222,7 +222,7 @@ SageMaker 部署支持一次性和批量预测。 批次预测对可以存储在
在前面的章节中,我们讨论了 Alexa 及其在家庭中越来越普遍的存在。 现在,我们将深入研究为 Alexa 提供支持的技术,并允许您创建自己的对话机器人。
Amazon Lex 是用于建立对话代理的服务。 Amazon Lex 和其他聊天机器人是我们这一代人的尝试通过图灵测试,我们在前面的章节中已经进行了讨论。 任何人将与 Alexa 的对话与人类对话混淆都需要一段时间。 但是,亚马逊和其他公司在使这些对话越来越自然的过程中不断取得进步。 Amazon Lex,使用与 Amazon Alexa 相同的技术,使开发人员可以快速构建复杂的自然语言,会话代理或*聊天机器人*。 对于简单的情况,无需任何编程就可以构建其中的一些聊天机器人。 但是,可以使用 AWS Lambda 作为集成技术将 Lex 与 AWS 堆栈中的其他服务集成。
Amazon Lex 是用于建立对话代理的服务。 Amazon Lex 和其他聊天机器人是我们这一代人的尝试通过图灵测试,我们在前面的章节中已经进行了讨论。 任何人将与 Alexa 的对话与人类对话混淆都需要一段时间。 但是,亚马逊和其他公司在使这些对话越来越自然的过程中不断取得进步。 Amazon Lex,使用与 Amazon Alexa 相同的技术,使开发人员可以快速构建复杂的自然语言,会话代理或“聊天机器人”。 对于简单的情况,无需任何编程就可以构建其中的一些聊天机器人。 但是,可以使用 AWS Lambda 作为集成技术将 Lex 与 AWS 堆栈中的其他服务集成。
稍后,我们将整整一章专门介绍如何创建聊天机器人,因此我们将在本节中简短介绍。
......@@ -383,7 +383,7 @@ Amazon Textract 使用户可以从文档,表单和表格中提取文本。 Ama
Microsoft Azure Machine Learning Studio 是 Microsoft 对 Amazon SageMaker 的回答。 Machine Learning Studio 是一个协作工具,具有简单的拖放界面,允许用户构建,测试和部署机器学习模型。 Machine Learning Studio 支持模型发布,该模型发布可被其他应用程序使用,并可轻松与 BI 工具(例如 Excel)集成。
**Machine Learning Studio 交互式工作区** –在*第 3 章**机器学习管道*中,我们学习了关于机器学习管道的信息。 Machine Learning Studio 交互式工作区通过允许用户轻松地将数据摄取到工作区,转换数据,然后通过各种数据操作和统计功能分析数据并最终生成预测,从而简化了管道开发。 开发机器学习管道通常是一个迭代过程,而工作区使执行此迭代开发变得简单。 在修改各种功能及其参数时,您将能够可视化和分析模型的性能,直到对结果满意为止。
**Machine Learning Studio 交互式工作区** –在第 3 章,“机器学习管道”中,我们学习了关于机器学习管道的信息。 Machine Learning Studio 交互式工作区通过允许用户轻松地将数据摄取到工作区,转换数据,然后通过各种数据操作和统计功能分析数据并最终生成预测,从而简化了管道开发。 开发机器学习管道通常是一个迭代过程,而工作区使执行此迭代开发变得简单。 在修改各种功能及其参数时,您将能够可视化和分析模型的性能,直到对结果满意为止。
Azure Machine Learning Studio 提供了一个交互式的可视化工作区,可以轻松地构建,测试和迭代预测分析模型。 要将数据集带入工作区,可以将其拖放。 您还可以将分析模块拖到交互式画布上,并将它们连接在一起以形成初始*实验*,然后可以在 Machine Learning Studio 中运行。 如果结果不令人满意,可以修改实验参数并一次又一次地运行直到结果令人满意。 一旦性能令人满意,就可以将*训练实验*转换为*预测性实验*,并且可以将其发布为网络服务,以便用户和其他服务可以访问该模型 。
......
......@@ -4,14 +4,14 @@
在本章中,我们将学习神经网络。 我们将从神经网络的介绍和相关库的安装开始。 然后,我们将讨论感知器以及如何基于它们构建分类器。 之后,我们将更深入地学习单层神经网络和多层神经网络。
稍后,我们将看到如何使用神经网络构建矢量量化器。 我们将使用递归神经网络分析顺序数据,最后将使用神经网络构建光学字符识别引擎。 在本章的最后,我们将介绍:
稍后,我们将看到如何使用神经网络构建矢量量化器。 我们将使用循环神经网络分析顺序数据,最后将使用神经网络构建光学字符识别引擎。 在本章的最后,我们将介绍:
* 神经网络简介
* 构建基于感知器的分类器
* 构建单层神经网络
* 构建多层神经网络
* 构建矢量量化器
* 使用递归神经网络分析顺序数据
* 使用循环神经网络分析顺序数据
***光学字符识别****OCR**)数据库中可视化字符
* 构建**光学字符识别****OCR**)引擎
......@@ -517,9 +517,9 @@ plt.show()
在上一节中,我们学习了如何使用矢量量化器构建神经网络。 在下一节中,我们将继续学习神经网络。 接下来,我们将学习如何使用递归神经 网络(RNN)分析顺序数据。
# 使用递归神经网络分析顺序数据
# 使用循环神经网络分析顺序数据
到目前为止,在我们所有的神经网络示例中,一直在使用静态数据。 神经网络也可以有效地用于构建处理顺序数据的模型。 **递归神经网络****RNN**)在建模顺序数据方面非常出色。 [您可以在以下位置了解有关递归神经网络的更多信息](https://www.jeremyjordan.me/introduction-to-recurrent-neural-networks/)
到目前为止,在我们所有的神经网络示例中,一直在使用静态数据。 神经网络也可以有效地用于构建处理顺序数据的模型。 **循环神经网络****RNN**)在建模顺序数据方面非常出色。 [您可以在以下位置了解有关循环神经网络的更多信息](https://www.jeremyjordan.me/introduction-to-recurrent-neural-networks/)
当我们使用时间序列数据时,我们通常不能使用通用学习模型。 我们需要捕获数据中的时间依赖性,以便可以构建健壮的模型。 让我们看看如何构建它。
......@@ -580,7 +580,7 @@ if __name__=='__main__':
wave, amp = get_data(num_points)
```
创建一个具有两层的递归神经网络:
创建一个具有两层的循环神经网络:
```py
# Create a recurrent neural network with 2 layers
......@@ -913,4 +913,4 @@ for i in range(num_test):
# 摘要
在本章中,我们学习了神经网络。 我们讨论了如何构建和训练神经网络。 我们讨论了感知器,并在此基础上构建了分类器。 我们了解了单层神经网络以及多层神经网络。 我们讨论了如何将神经网络用于构建矢量量化器。 我们使用递归神经网络分析了顺序数据。 然后,我们使用神经网络构建了光学字符识别引擎。 在第 t 章中,我们将学习强化学习,并了解如何构建智能学习代理。
\ No newline at end of file
在本章中,我们学习了神经网络。 我们讨论了如何构建和训练神经网络。 我们讨论了感知器,并在此基础上构建了分类器。 我们了解了单层神经网络以及多层神经网络。 我们讨论了如何将神经网络用于构建矢量量化器。 我们使用循环神经网络分析了顺序数据。 然后,我们使用神经网络构建了光学字符识别引擎。 在第 t 章中,我们将学习强化学习,并了解如何构建智能学习代理。
\ No newline at end of file
......@@ -657,7 +657,7 @@ print('Test accuracy =', accuracy.eval(feed_dict = {
在本章中,我们学习了深度学习和 CNN。 我们讨论了什么是 CNN,以及我们为什么需要它们。 我们讨论了 CNN 的体系结构。 我们了解了 CNN 中使用的各种类型的图层。 我们讨论了如何使用 TensorFlow。 我们使用它来构建基于感知器的线性回归器。 我们学习了如何使用单层神经网络构建图像分类器。 然后,我们使用 CNN 构建了图像分类器。
在下一章中,我们将了解 CNN 的另一个受欢迎的兄弟– **递归神经网络****RNN**)。 像 CNN 一样,RNN 也已流行,并且现在非常流行。 与以前的模型相比,它们取得了令人印象深刻的结果。 在某些情况下,甚至在某些情况下甚至超过了人类的表现。
在下一章中,我们将了解 CNN 的另一个受欢迎的兄弟– **循环神经网络****RNN**)。 像 CNN 一样,RNN 也已流行,并且现在非常流行。 与以前的模型相比,它们取得了令人印象深刻的结果。 在某些情况下,甚至在某些情况下甚至超过了人类的表现。
# 参考
......
# 21
# 递归神经网络和其他深度学习模型
# 循环神经网络和其他深度学习模型
在本章中,我们将学习深度学习和**递归神经网络****RNN**)。 像前几章所介绍的 CNN 一样,RNN 在过去几年中也获得了很大发展。 就 RNN 而言,它们在语音识别领域被大量使用。 当今许多聊天机器人都基于 RNN 技术建立了基础。 使用 RNN 预测金融市场已经取得了一些成功。 例如,我们可能有一个带有单词序列的文本,并且我们有一个目标来预测序列中的下一个单词。
在本章中,我们将学习深度学习和**循环神经网络****RNN**)。 像前几章所介绍的 CNN 一样,RNN 在过去几年中也获得了很大发展。 就 RNN 而言,它们在语音识别领域被大量使用。 当今许多聊天机器人都基于 RNN 技术建立了基础。 使用 RNN 预测金融市场已经取得了一些成功。 例如,我们可能有一个带有单词序列的文本,并且我们有一个目标来预测序列中的下一个单词。
我们将讨论 RNN 的体系结构及其组件。 我们将继续使用上一章开始学习的 TensorFlow。 我们将使用 TensorFlow 快速构建 RNN。 我们还将学习如何使用单层神经网络构建 RNN 分类器。 然后,我们将使用 CNN 构建图像分类器。
......@@ -17,9 +17,9 @@
让我们从 RNN 的基础开始。
# 递归神经网络的基础
# 循环神经网络的基础
RNN 是另一种流行的模型,目前正在获得很大的关注。 正如我们在*第 1 章**人工智能导论*中讨论的那样,对一般神经网络(尤其是 RNN)的研究是*联系主义者*部落( 在 Pedro Domingos 的 AI 分类中进行了介绍)。 RNN 通常用于解决自然语言处理(**NLP**)和**自然语言理解****NLU**)问题 。
RNN 是另一种流行的模型,目前正在获得很大的关注。 正如我们在第 1 章*人工智能导论*中讨论的那样,对一般神经网络(尤其是 RNN)的研究是*联系主义者*部落( 在 Pedro Domingos 的 AI 分类中进行了介绍)。 RNN 通常用于解决自然语言处理(**NLP**)和**自然语言理解****NLU**)问题 。
RNN 背后的数学有时可能会令人不知所措。 在深入研究 RNN 之前,请牢记以下思想:赛车手不需要完全了解其赛车的机械原理即可使其快速行驶并赢得比赛。 同样,我们不一定需要完全了解 RNN 在幕后的工作方式,以使其对我们有用,有时甚至是令人印象深刻的工作。 Keras 库的创建者 Francois Chollet 描述了**长短期记忆****LSTM**)网络,这是 RNN 的一种形式,如下所示:
......@@ -114,7 +114,7 @@ RNN 之所以称为递归,是因为这些算法对序列的每个元素执行
![1: A recurrent neural network and the unfolding in time of the computation involved in its forward computation. Source: LeCun, Bengio, and G. Hinton 2015 ](img/B15441_21_06.png)
图 6:递归神经网络及其正向计算所涉及的计算时间的展开
图 6:循环神经网络及其正向计算所涉及的计算时间的展开
资料来源:LeCun,Bengio 和 G. Hinton,2015 年,《深度学习》,《自然》
......@@ -122,7 +122,7 @@ RNN 之所以称为递归,是因为这些算法对序列的每个元素执行
![](img/B15441_21_07.png)
图 7:3 层递归神经网络
图 7:3 层循环神经网络
资料来源:LeCun,Bengio 和 G. Hinton,2015 年,《深度学习》,《自然》
......
......@@ -41,11 +41,11 @@ RL 是指学习操作方法并将情况映射到某些动作以最大化回报
**游戏性** –让我们考虑一下棋类游戏,例如 Go 或 Chess。 为了确定最佳动作,玩家需要考虑各种因素。 可能性的数量如此之大,以至于无法进行暴力搜索。 如果我们要使用传统技术制造一台可以玩这种游戏的机器,则需要指定许多规则来涵盖所有这些可能性。 RL 完全绕过了这个问题。 我们不需要手动指定任何逻辑规则。 学习代理仅通过示例学习并与自己玩游戏。
有关此主题的更详尽讨论,请参阅*第 2 章**人工智能基本用例*中的*游戏*部分。
有关此主题的更详尽讨论,请参阅第 2 章,*人工智能基本用例*中的*游戏*部分。
**机器人技术** –让我们考虑一个机器人的工作,该机器人的工作是探索新建筑物。 它应确保它有足够的功率返回基站。 该机器人必须通过考虑所收集的信息量与安全返回基站的能力之间的权衡来决定是否应该做出决定。
有关此主题的更多信息,请跳至*第 2 章**人工智能基本用例*中的*装运和仓库管理*部分。
有关此主题的更多信息,请跳至第 2 章,*人工智能基本用例*中的*装运和仓库管理*部分。
**工业控制器** –考虑调度电梯的情况。 一个好的调度程序将花费最少的电量,并为最多的人员服务。 对于此类问题,RL 代理可以学习如何在模拟环境中执行此操作。 然后,他们可以利用这些知识来制定最佳计划。
......
......@@ -92,7 +92,7 @@ GAN 具有一些相当有用的实际应用,其中包括:
GAN 的体系结构具有两个基本元素:生成器网络和鉴别器网络。 每个网络都可以是任何神经网络,例如**人工神经网络****ANN**),**卷积神经网络****CNN**), **递归神经网络****RNN**),或**长短期记忆****LSTM**)。 鉴别器必须具有完全连接的层,最后是分类器。
GAN 的体系结构具有两个基本元素:生成器网络和鉴别器网络。 每个网络都可以是任何神经网络,例如**人工神经网络****ANN**),**卷积神经网络****CNN**), **循环神经网络****RNN**),或**长短期记忆****LSTM**)。 鉴别器必须具有完全连接的层,最后是分类器。
让我们仔细看一下 GAN 架构的组件。 在此示例中,我们将想象正在创建一个虚拟 GAN。
......
......@@ -4,7 +4,7 @@
众所周知,卷积层确实擅长处理图像。 他们能够学习重要的特征,例如边缘,形状和复杂的对象,有效的, ,例如神经网络,例如 Inception,AlexNet, **视觉几何组****VGG**)和 ResNet。 Ian Goodfellow 等人在其名为*生成对抗性网络*的论文中提出了具有密集层的**生成对抗网络****GAN**),[该网络可在以下链接获得](https://arxiv.org/pdf/1406.2661.pdf)。 复杂的神经网络,例如**卷积神经网络****CNN**),**递归神经网络****RNN**)和**长短 长期记忆****LSTM**)最初并未在 GAN 中进行测试。 **深度卷积生成对抗网络****DCGAN**)的发展是使用 CNN 进行图像生成的重要一步。 DCGAN 使用卷积层而不是密集层。 它们是由研究人员 Alec Radford , Luke Metz , Soumith Chintala 等提出的,我在其论文中,*通过深度卷积生成对抗性技术* *网络*的无监督表示学习,[可以在以下链接中找到](https://arxiv.org/pdf/1511.06434.pdf)。 从那时起,DCGAN 被广泛用于各种图像生成任务。 在本章中,我们将使用 DCGAN 架构生成动漫角色。
众所周知,卷积层确实擅长处理图像。 他们能够学习重要的特征,例如边缘,形状和复杂的对象,有效的, ,例如神经网络,例如 Inception,AlexNet, **视觉几何组****VGG**)和 ResNet。 Ian Goodfellow 等人在其名为*生成对抗性网络*的论文中提出了具有密集层的**生成对抗网络****GAN**),[该网络可在以下链接获得](https://arxiv.org/pdf/1406.2661.pdf)。 复杂的神经网络,例如**卷积神经网络****CNN**),**循环神经网络****RNN**)和**长短 长期记忆****LSTM**)最初并未在 GAN 中进行测试。 **深度卷积生成对抗网络****DCGAN**)的发展是使用 CNN 进行图像生成的重要一步。 DCGAN 使用卷积层而不是密集层。 它们是由研究人员 Alec Radford , Luke Metz , Soumith Chintala 等提出的,我在其论文中,*通过深度卷积生成对抗性技术* *网络*的无监督表示学习,[可以在以下链接中找到](https://arxiv.org/pdf/1511.06434.pdf)。 从那时起,DCGAN 被广泛用于各种图像生成任务。 在本章中,我们将使用 DCGAN 架构生成动漫角色。
在本章中,我们将介绍以下主题:
......
......@@ -24,23 +24,23 @@
第 1 章,*无监督学习入门* 从非常务实的角度介绍了机器学习和数据科学。 讨论了主要概念,并显示了一些简单的示例,特别关注了无监督问题结构。
第 1 章,“无监督学习入门” 从非常务实的角度介绍了机器学习和数据科学。 讨论了主要概念,并显示了一些简单的示例,特别关注了无监督问题结构。
第 2 章,*聚类基础知识* 开始研究聚类算法。 分析了最常见的方法和评估指标,并给出了具体示例,这些示例演示了如何从不同的角度调整超参数和评估性能。
第 2 章,“聚类基础知识” 开始研究聚类算法。 分析了最常见的方法和评估指标,并给出了具体示例,这些示例演示了如何从不同的角度调整超参数和评估性能。
第 3 章,*高级聚类* *和*讨论了一些更复杂的算法。 第 2 章,*聚类基础知识*中分析的许多问题都使用更强大,更灵活的方法进行了重新评估,只要基本算法的性能不符合要求,就可以轻松采用这些方法。 。
第 3 章,“高级聚类”讨论了一些更复杂的算法。 第 2 章,“聚类基础知识”中分析的许多问题都使用更强大,更灵活的方法进行了重新评估,只要基本算法的性能不符合要求,就可以轻松采用这些方法。 。
第 4 章,*分层聚类在起作用* 完全致力于可以根据特定标准计算完整聚类层次的一系列算法。 分析了最常见的策略,以及可以提高方法有效性的特定性能指标和算法变体。
第 4 章,“实用的分层聚类”完全致力于可以根据特定标准计算完整聚类层次的一系列算法。 分析了最常见的策略,以及可以提高方法有效性的特定性能指标和算法变体。
第 5 章,*软聚类和高斯混合模型* 着重介绍了几种著名的软聚类算法,特别着重于高斯混合,这允许定义生成式 模型在相当合理的假设下。
第 5 章,“软聚类和高斯混合模型”着重介绍了几种著名的软聚类算法,特别着重于高斯混合,这允许定义生成式 模型在相当合理的假设下。
第 6 章,*异常检测* 讨论了无监督学习的一种特殊应用:新颖性和异常检测。 目的是分析一些可以有效使用的常用方法,以了解新样本是否可以被视为有效样本,还是需要特别注意的异常样本。
第 6 章,“异常检测”讨论了无监督学习的一种特殊应用:新颖性和异常检测。 目的是分析一些可以有效使用的常用方法,以了解新样本是否可以被视为有效样本,还是需要特别注意的异常样本。
第 7 章,*降维和成分分析,*涵盖了降维,成分分析和字典学习的最常用和最有效的方法。 这些示例说明了如何在不同的特定情况下有效地执行此类操作。
第 7 章,“降维和成分分析”涵盖了降维,成分分析和字典学习的最常用和最有效的方法。 这些示例说明了如何在不同的特定情况下有效地执行此类操作。
第 8 章, *无监督神经网络模型* 讨论了一些非常重要的无监督神经模型。 特别地,焦点既针对可以学习通用数据生成过程的结构的网络,又针对执行降维。
第 8 章,“无监督神经网络模型” 讨论了一些非常重要的无监督神经模型。 特别地,焦点既针对可以学习通用数据生成过程的结构的网络,又针对执行降维。
第 9 章,*生成对抗网络和 SOM* 继续分析一些深层神经网络,这些神经网络可以学习数据生成过程的结构并输出从这些过程中提取的新样本。 此外,讨论了一种特殊的网络(SOM),并显示了一些实际示例。
第 9 章,“生成对抗网络和 SOM”继续分析一些深层神经网络,这些神经网络可以学习数据生成过程的结构并输出从这些过程中提取的新样本。 此外,讨论了一种特殊的网络(SOM),并显示了一些实际示例。
......
......@@ -507,7 +507,7 @@ print('Completeness: {}'.format(completeness_score(kmdff['diagnosis'], kmdff['pr
Completeness: 0.5168089972809706
```
该结果证实,对于 *K = 2* ,K-均值不能完美地分离聚类,因为如我们所见,因为某些恶性样本被错误地分配给包含大量 大多数良性样本。 但是,由于`c`并不是非常小,因此我们可以确保将这两个类别的大多数样本分配给了不同的群集。 邀请读者使用其他方法(在第 3 章,*高级聚类*中讨论)检查该值,并提供不同结果的简要说明。
该结果证实,对于 *K = 2* ,K-均值不能完美地分离聚类,因为如我们所见,因为某些恶性样本被错误地分配给包含大量 大多数良性样本。 但是,由于`c`并不是非常小,因此我们可以确保将这两个类别的大多数样本分配给了不同的群集。 邀请读者使用其他方法(在第 3 章,“高级聚类”中讨论)检查该值,并提供不同结果的简要说明。
......@@ -834,7 +834,7 @@ Y_qv = np.argmin(distances, axis=1)
Final configuration of the quantization vectors (left). Influence area of each quantization vector (right)
正如预期的那样,量化矢量已达到最终配置,其中每个量化矢量都代表数据集的一小部分(如右图所示)。 在这一点上,给定一个点,最接近的向量将代表它。 有趣的是,全局方差并未受到影响,但是,选择任何子集后,内部方差会大大降低。 向量的相对位置反映了数据集的密度,因为区域中的*更多样本吸引了更多向量*。 这样,通过构建距离矩阵,可以获得粗略的密度估计(例如,当向量与向量的近邻的平均距离较高时,意味着底层区域的密度较小)。 我们将在第 6 章,*异常检测*中更详细地讨论此主题。
正如预期的那样,量化矢量已达到最终配置,其中每个量化矢量都代表数据集的一小部分(如右图所示)。 在这一点上,给定一个点,最接近的向量将代表它。 有趣的是,全局方差并未受到影响,但是,选择任何子集后,内部方差会大大降低。 向量的相对位置反映了数据集的密度,因为区域中的*更多样本吸引了更多向量*。 这样,通过构建距离矩阵,可以获得粗略的密度估计(例如,当向量与向量的近邻的平均距离较高时,意味着底层区域的密度较小)。 我们将在第 6 章,“异常检测”中更详细地讨论此主题。
现在让我们考虑一个示例,该示例具有一个代表浣熊图片的单个样本。 由于过程可能很长,因此第一步是加载示例 RGB 图像(由 SciPy 提供)并将其大小调整为 192×256,如下所示:
......
......@@ -70,7 +70,7 @@ Example of a graph: Point x<sub class="calibre26">0</sub> is the only one that i
Bidimensional RBFs as functions of the distance between x and 0 computed for γ = 0.1, 1.0, and 5.0
*γ= 0.1* 时, *x = 1* (相对于 0.0)的权重约为 0.9。 对于*γ= 1.0* ,该值约为 0.5;对于*γ= 5.0* ,该值几乎为零。 因此,在调整频谱聚类模型时,考虑*γ*的不同值并选择产生最佳性能的值(例如,使用第 2 章,*聚类基础知识*)。 一旦创建了图,就可以使用对称**亲和矩阵** *W = {w <sub class="calibre20">ij</sub> }* 来表示。 对于 KNN *,W* 通常比较稀疏,可以使用专门的库进行有效地存储和操作。 相反,对于 RBF,它始终是密集的,并且如果 *X∈ <sup class="calibre27">N×M</sup>* ,则它需要存储 *N <sup class="calibre27">2</sup>* 值 。
*γ= 0.1* 时, *x = 1* (相对于 0.0)的权重约为 0.9。 对于*γ= 1.0* ,该值约为 0.5;对于*γ= 5.0* ,该值几乎为零。 因此,在调整频谱聚类模型时,考虑*γ*的不同值并选择产生最佳性能的值(例如,使用第 2 章,“聚类基础知识”)。 一旦创建了图,就可以使用对称**亲和矩阵** *W = {w <sub class="calibre20">ij</sub> }* 来表示。 对于 KNN *,W* 通常比较稀疏,可以使用专门的库进行有效地存储和操作。 相反,对于 RBF,它始终是密集的,并且如果 *X∈ <sup class="calibre27">N×M</sup>* ,则它需要存储 *N <sup class="calibre27">2</sup>* 值 。
不难证明到目前为止我们分析过的程序等同于将`X`分割为多个内聚区域。 实际上,让我们考虑例如具有通过 KNN 获得的亲和度矩阵的图`G`。 连接的组件 *C <sub class="calibre20">i</sub>* 是一个子图,其中每对顶点 *x <sub class="calibre20">a</sub>**x <sub class="calibre20">b</sub> ∈C <sub class="calibre20">i</sub>* 通过属于`C`<sub class="calibre20">`i`</sub> 的顶点的路径连接,并且没有连接任何顶点的边 *C <sub class="calibre20">i</sub>* 的顶点具有不属于 *C <sub class="calibre20">i</sub>* 的顶点。 换句话说,连接的组件是一个内聚子集 *C <sub class="calibre20">i</sub> ![](img/055b1708-309e-409f-ab58-e4017eae690d.png) G* ,它代表群集选择的最佳候选者。 在下图中,有一个从图中提取的连接组件的示例:
......@@ -145,9 +145,9 @@ Original dataset (left). Spectral clustering result (center). K-means result (ri
让我们考虑一个数据集 *X∈ <sup class="calibre27">M×N</sup>**MN* 维样本)是从多元数据生成过程 *p <sub class="calibre20">数据中得出的</sub>***均值漂移**算法应用于聚类问题的目的是找到 *p <sub class="calibre20">数据</sub>* 最大的区域,并将周围子区域中包含的样本与 同一集群。 由于 *p <sub class="calibre20">数据</sub>* 是 P **鲁棒性密度函数****PDF**),因此将其表示为 以一小部分参数(例如均值和方差)为特征的常规 PDF(例如,高斯)的总和。 以这种方式,可以认为 PDF 由样本生成的概率最高。 我们还将在第 5 章,*软聚类和高斯混合模型,*和第 6 章,*异常检测*中讨论该过程。 出于我们的目的,将问题重构为一个迭代过程,可以更新均值矢量(质心)的位置,直到达到最大值为止。 当质心到达其最终位置时,将使用标准邻域函数将样本分配给每个聚类。
让我们考虑一个数据集 *X∈ <sup class="calibre27">M×N</sup>**MN* 维样本)是从多元数据生成过程 *p <sub class="calibre20">数据中得出的</sub>***均值漂移**算法应用于聚类问题的目的是找到 *p <sub class="calibre20">数据</sub>* 最大的区域,并将周围子区域中包含的样本与 同一集群。 由于 *p <sub class="calibre20">数据</sub>* 是 P **鲁棒性密度函数****PDF**),因此将其表示为 以一小部分参数(例如均值和方差)为特征的常规 PDF(例如,高斯)的总和。 以这种方式,可以认为 PDF 由样本生成的概率最高。 我们还将在第 5 章,*软聚类和高斯混合模型,*和第 6 章,“异常检测”中讨论该过程。 出于我们的目的,将问题重构为一个迭代过程,可以更新均值矢量(质心)的位置,直到达到最大值为止。 当质心到达其最终位置时,将使用标准邻域函数将样本分配给每个聚类。
该算法的第一步是确定近似 p <sub class="calibre20">数据</sub>的合适方法。 一种经典方法(将在 **Parzen 的使用上(将在[第 6](https://cdp.packtpub.com/hands_on_unsupervised_learning_with_python/wp-admin/post.php?post=26&action=edit#post_29) , *异常检测*中进行讨论)。 Windows** 。 就目前而言,可以说 Parzen 窗口是一个非负内核函数 *f(•)*,其特征是称为**带宽**的参数(有关更多详细信息,请参阅原始论文) *关于概率密度函数和模式的估计,Parzen E。, 《数理统计年鉴》 33,* 1962)。 顾名思义,此参数的作用是加宽或限制 Parzen 窗口接近其最大值的区域。 考虑到与高斯分布的类比,带宽具有与方差相同的作用。 因此,较小的带宽将产生在均值附近非常峰值的函数,而较大的值与较平坦的函数关联。 不难理解,在这种特定情况下,群集的数量由带宽和相反的方式隐式确定。 因此,大多数实现(例如 scikit-learn)仅采用一个参数,然后计算另一个参数。 考虑到该算法已设计为适用于概率分布,自然的选择是指定所需带宽或让实现检测最佳带宽。 这个过程看起来比施加特定数量的群集更为复杂,但是,在许多实际情况下,尤其是当至少部分地了解了基本事实时,测试不同带宽的结果会更容易。
该算法的第一步是确定近似 p <sub class="calibre20">数据</sub>的合适方法。 一种经典方法(将在 **Parzen 的使用上(将在[第 6](https://cdp.packtpub.com/hands_on_unsupervised_learning_with_python/wp-admin/post.php?post=26&action=edit#post_29) , “异常检测”中进行讨论)。 Windows** 。 就目前而言,可以说 Parzen 窗口是一个非负内核函数 *f(•)*,其特征是称为**带宽**的参数(有关更多详细信息,请参阅原始论文) *关于概率密度函数和模式的估计,Parzen E。, 《数理统计年鉴》 33,* 1962)。 顾名思义,此参数的作用是加宽或限制 Parzen 窗口接近其最大值的区域。 考虑到与高斯分布的类比,带宽具有与方差相同的作用。 因此,较小的带宽将产生在均值附近非常峰值的函数,而较大的值与较平坦的函数关联。 不难理解,在这种特定情况下,群集的数量由带宽和相反的方式隐式确定。 因此,大多数实现(例如 scikit-learn)仅采用一个参数,然后计算另一个参数。 考虑到该算法已设计为适用于概率分布,自然的选择是指定所需带宽或让实现检测最佳带宽。 这个过程看起来比施加特定数量的群集更为复杂,但是,在许多实际情况下,尤其是当至少部分地了解了基本事实时,测试不同带宽的结果会更容易。
均值平移的最常见选择是用`n`个扁平核的总和来近似数据生成过程(`n`是形心数):
......@@ -212,7 +212,7 @@ for b in bandwidths:
Mean shift clustering results for different bandwidths
如您所见,带宽的微小差异会导致群集数量不同。 在我们的情况下,最佳值为`h=1.2`,它产生的结果是确定了三个不同的区域(以及一个包含潜在异常值的额外聚类)。 最大聚类的质心大致对应于实际均值,但是聚类的形状与任何高斯分布都不相似。 这是可以通过采用其他方法解决的缺陷(在第 5 章 , *软聚类和高斯混合模型*中进行了讨论)。 实际上,均值偏移适用于局部邻域,并且 *p <sub class="calibre20">数据</sub>* 不被认为属于特定分布。 因此,最终结果是将数据集非常准确地分割为高度密集的区域(注意不再需要最大分隔),这也可以从多个标准分布的叠加中得出。 没有任何先前的假设,我们不能期望结果非常规则,但是,将该算法与 VQ 进行比较,很容易注意到分配是基于找到每个密集 Blob 的最佳代表的想法。 因此,由高斯 *N(μ,Σ)*产生的一些点以低概​​率分配给质心比 *更具代表性的另一个聚类。 μ*
如您所见,带宽的微小差异会导致群集数量不同。 在我们的情况下,最佳值为`h=1.2`,它产生的结果是确定了三个不同的区域(以及一个包含潜在异常值的额外聚类)。 最大聚类的质心大致对应于实际均值,但是聚类的形状与任何高斯分布都不相似。 这是可以通过采用其他方法解决的缺陷(在第 5 章 , “软聚类和高斯混合模型”中进行了讨论)。 实际上,均值偏移适用于局部邻域,并且 *p <sub class="calibre20">数据</sub>* 不被认为属于特定分布。 因此,最终结果是将数据集非常准确地分割为高度密集的区域(注意不再需要最大分隔),这也可以从多个标准分布的叠加中得出。 没有任何先前的假设,我们不能期望结果非常规则,但是,将该算法与 VQ 进行比较,很容易注意到分配是基于找到每个密集 Blob 的最佳代表的想法。 因此,由高斯 *N(μ,Σ)*产生的一些点以低概​​率分配给质心比 *更具代表性的另一个聚类。 μ*
......@@ -666,7 +666,7 @@ Example of a simple CF-Tree with a binary repartition
![](img/3a24c4e7-7463-4f9f-a215-c21bf165d098.png)
但是,如果没有控制权,则树很容易变得不平衡,从而导致性能损失。 因此,该算法执行一个附加步骤。 一旦确定了 CF,就计算更新后的半径 *r <sub class="calibre20">j</sub>* ,以及是否 *r <sub class="calibre20">j</sub> > T* 并且 CF 的数量大于分支因子,分配新的块并且原始的 CF 保持不变。 由于这个新块几乎完全是空的( *x <sub class="calibre20">i</sub>* 除外),BIRCH 会执行一个附加步骤来检查所有子集群之间的差异(此概念在[第 4 章中会更清楚](https://cdp.packtpub.com/hands_on_unsupervised_learning_with_python/wp-admin/post.php?post=26&action=edit#post_27)*分层聚类在起作用*;但是,读者可以考虑属于两个不同子类的点之间的平均距离)。 最不相似的一对分为两部分,其中之一移到新块中。 这样的选择确保了子群集的高度紧凑性,并加快了最终步骤。 实际上,实际聚类阶段中涉及的算法需要合并子聚类,直到总数减少到所需值为止。 因此,如果先前已将总不相似性最小化,则更容易执行此操作,因为*段*可以立即识别为连续并合并。 在本章中将不详细讨论此阶段,但不难想象。 将所有终端 CF 依次合并到较大的块中,直到确定单个群集为止(即使当数量与所需群集数目匹配时也可以停止该过程)。 因此,与小批量 K 均值相反,此方法可以轻松管理大量簇 *n <sub class="calibre20">c</sub>* ,而当 *n <sub class="calibre20">c 时效果不佳</sub>* 很小。 实际上,正如我们在示例中将要看到的那样,其准确性通常比使用小批量 k 均值所能达到的精度低,并且其最佳用法要求准确选择分支因子和阈值。 由于此算法的主要目的是在在线情况下工作,因此`B``T`在处理了某些批次后可能会失效(而小批量 K 均值通常可以纠正 在几次迭代后聚类),产生次优的结果。 因此,BIRCH 的主要用例是需要非常细粒度细分的在线过程,而在所有其他情况下,通常最好选择小批量 K 均值作为初始选项。
但是,如果没有控制权,则树很容易变得不平衡,从而导致性能损失。 因此,该算法执行一个附加步骤。 一旦确定了 CF,就计算更新后的半径 *r <sub class="calibre20">j</sub>* ,以及是否 *r <sub class="calibre20">j</sub> > T* 并且 CF 的数量大于分支因子,分配新的块并且原始的 CF 保持不变。 由于这个新块几乎完全是空的( *x <sub class="calibre20">i</sub>* 除外),BIRCH 会执行一个附加步骤来检查所有子集群之间的差异(此概念在[第 4 章中会更清楚](https://cdp.packtpub.com/hands_on_unsupervised_learning_with_python/wp-admin/post.php?post=26&action=edit#post_27)“实用的分层聚类”;但是,读者可以考虑属于两个不同子类的点之间的平均距离)。 最不相似的一对分为两部分,其中之一移到新块中。 这样的选择确保了子群集的高度紧凑性,并加快了最终步骤。 实际上,实际聚类阶段中涉及的算法需要合并子聚类,直到总数减少到所需值为止。 因此,如果先前已将总不相似性最小化,则更容易执行此操作,因为*段*可以立即识别为连续并合并。 在本章中将不详细讨论此阶段,但不难想象。 将所有终端 CF 依次合并到较大的块中,直到确定单个群集为止(即使当数量与所需群集数目匹配时也可以停止该过程)。 因此,与小批量 K 均值相反,此方法可以轻松管理大量簇 *n <sub class="calibre20">c</sub>* ,而当 *n <sub class="calibre20">c 时效果不佳</sub>* 很小。 实际上,正如我们在示例中将要看到的那样,其准确性通常比使用小批量 k 均值所能达到的精度低,并且其最佳用法要求准确选择分支因子和阈值。 由于此算法的主要目的是在在线情况下工作,因此`B``T`在处理了某些批次后可能会失效(而小批量 K 均值通常可以纠正 在几次迭代后聚类),产生次优的结果。 因此,BIRCH 的主要用例是需要非常细粒度细分的在线过程,而在所有其他情况下,通常最好选择小批量 K 均值作为初始选项。
......
......@@ -82,7 +82,7 @@
![](img/d851736e-2e48-4de6-b798-6fd828d24c42.png)
这些距离之间的主要差异在第 2 章,*聚类基础知识*中进行了讨论。 在本章中,介绍**余弦**距离很有用,这不是一个合适的距离度量(从数学角度来看),但是当样本之间的区分必须仅取决于角度时,这将非常有帮助 它们形成:
这些距离之间的主要差异在第 2 章,“聚类基础知识”中进行了讨论。 在本章中,介绍**余弦**距离很有用,这不是一个合适的距离度量(从数学角度来看),但是当样本之间的区分必须仅取决于角度时,这将非常有帮助 它们形成:
![](img/f6f3bba1-aaea-4d25-85a7-a5c056ec4320.png)
......@@ -272,7 +272,7 @@ plt.show()
前面的方程式基于以下假设:如果 *x <sub class="calibre20">i</sub>**x <sub class="calibre20">j</sub>**x <sub class="calibre20">p</sub>* 的距离,例如 *d(x <sub class="calibre20">i</sub> ,x <sub class="calibre20">j</sub> )< d(x <sub class="calibre20">i</sub> , x <sub class="calibre20">p</sub> )*,可以合理预期 *x <sub class="calibre20">i</sub>**x <sub class="calibre20">j</sub>**x <sub class="calibre20">i</sub>*`x`<sub class="calibre20">`p`</sub> 之前合并在同一群集中(即,对应于 *x <sub class="calibre20">i</sub>*`x`<sub class="calibre20">`j`</sub> 的合并 低于 *x <sub class="calibre20">i</sub>*`x`*<sub class="calibre20">p</sub>* )。 因此, *CPC→1* 表示链接生成了一个最佳层次结构,该层次结构反映了基础几何结构。 另一方面, *CPC* *→-1* 表示完全不同意,并且潜在的聚类结果与几何形状不一致。 毋庸置疑,给定一个问题,我们的目标是找到一个最大化 *CPC* 的指标和链接。
考虑到第 3 章,*高级聚类*中描述的示例,我们可以使用 SciPy 函数`cophenet`计算与不同链接(假设欧几里得距离)相对应的同位矩阵和 CPC 。 此函数需要将链接矩阵作为第一个参数,将接近度矩阵作为第二个参数,并返回同义矩阵和 CPC(`dm` 变量是先前计算出的压缩接近度矩阵):
考虑到第 3 章,“高级聚类”中描述的示例,我们可以使用 SciPy 函数`cophenet`计算与不同链接(假设欧几里得距离)相对应的同位矩阵和 CPC 。 此函数需要将链接矩阵作为第一个参数,将接近度矩阵作为第二个参数,并返回同义矩阵和 CPC(`dm` 变量是先前计算出的压缩接近度矩阵):
```py
from scipy.cluster.hierarchy import linkage, cophenet
......
......@@ -292,7 +292,7 @@ Exponential kernel
一旦选择了核函数,就可以使用 k 最近邻方法建立概率密度函数的完全近似值。 实际上,给定数据集`X`(为简单起见, *X∈ <sup class="calibre27">m</sup>* ,所以这些值是实数),例如,创建起来很容易 球形树(如第 2 章,*聚类基础知识*中所述)以有效的方式对数据进行分区。 当数据结构准备就绪时,可以在带宽定义的半径范围内获得查询点`x`<sub class="calibre20">`j`</sub> 的所有邻居。 假设这样的集合是 *X <sub class="calibre20">j</sub> = {x <sub class="calibre20">1</sub> ,...,x <sub class="calibre20">t</sub> }* 和点数 是 *N <sub class="calibre20">j</sub>* 。 概率密度的估算如下:
一旦选择了核函数,就可以使用 k 最近邻方法建立概率密度函数的完全近似值。 实际上,给定数据集`X`(为简单起见, *X∈ <sup class="calibre27">m</sup>* ,所以这些值是实数),例如,创建起来很容易 球形树(如第 2 章,“聚类基础知识”中所述)以有效的方式对数据进行分区。 当数据结构准备就绪时,可以在带宽定义的半径范围内获得查询点`x`<sub class="calibre20">`j`</sub> 的所有邻居。 假设这样的集合是 *X <sub class="calibre20">j</sub> = {x <sub class="calibre20">1</sub> ,...,x <sub class="calibre20">t</sub> }* 和点数 是 *N <sub class="calibre20">j</sub>* 。 概率密度的估算如下:
![](img/93a535f7-f555-4e22-b5da-bed6fa8503ba.png)
......@@ -304,7 +304,7 @@ Density estimation of x<sub class="calibre26">j</sub>. The Kernel functions are
在这一点上,自然会问为什么不为每个查询使用整个数据集而不是 k-NN 方法? 答案很简单,它基于这样的假设:可以使用局部行为轻松地插值以 *x <sub class="calibre20">j</sub>* 计算的密度函数的值(即,对于多变量 分布,以 *x <sub class="calibre20">j</sub>* 为中心的球和*远点*对估计没有影响。 因此,我们可以将计算限制为`X`的较小子集,避免包含接近零的贡献。
在讨论如何确定最佳带宽之前,让我们展示一下先前定义的数据集的密度估计(使用 scikit-learn)。 由于我们没有任何特定的先验知识,因此我们将使用具有不同带宽(0.1、0.5 和 1.5)的高斯内核。 所有其他参数均保留为其默认值。 但是,`KernelDensity`类允许设置度量(默认为`metric='euclidean'`),数据结构(默认为`algorithm='auto'`,它根据维度在球树和 kd 树之间执行自动选择),以及 绝对公差和相对公差(分别为 0 和 10 <sup xmlns:epub="http://www.idpf.org/2007/ops" class="calibre27">-8</sup> )。 在许多情况下,无需更改默认值。 但是,对于具有特定功能的超大型数据集,例如,更改`leaf_size`参数以提高性能可能会有所帮助(如 第 2 章 中讨论的 , *聚类基础知识*)。 此外,默认度量标准不能满足所有任务的要求(例如:标准文档显示了一个基于 Haversine 距离的示例,在使用纬度和经度时可以使用该示例)。 在其他情况下,最好使用超立方体而不是球(曼哈顿距离的情况就是这样)。
在讨论如何确定最佳带宽之前,让我们展示一下先前定义的数据集的密度估计(使用 scikit-learn)。 由于我们没有任何特定的先验知识,因此我们将使用具有不同带宽(0.1、0.5 和 1.5)的高斯内核。 所有其他参数均保留为其默认值。 但是,`KernelDensity`类允许设置度量(默认为`metric='euclidean'`),数据结构(默认为`algorithm='auto'`,它根据维度在球树和 kd 树之间执行自动选择),以及 绝对公差和相对公差(分别为 0 和 10 <sup xmlns:epub="http://www.idpf.org/2007/ops" class="calibre27">-8</sup> )。 在许多情况下,无需更改默认值。 但是,对于具有特定功能的超大型数据集,例如,更改`leaf_size`参数以提高性能可能会有所帮助(如 第 2 章 中讨论的 , “聚类基础知识”)。 此外,默认度量标准不能满足所有任务的要求(例如:标准文档显示了一个基于 Haversine 距离的示例,在使用纬度和经度时可以使用该示例)。 在其他情况下,最好使用超立方体而不是球(曼哈顿距离的情况就是这样)。
让我们首先实例化类并拟合模型:
......@@ -676,7 +676,7 @@ Linear one-class SVM scenario: the training set is separated from the origin wit
投影函数*φ(•)*的存在保证存在于非常容易获得的条件(称为美世条件)下(即,在实子空间中,内核必须为正半 -定)。 这种选择的原因与解决问题的过程密切相关(更详细的解释可以在*机器学习算法第二版**Bonaccorso G**Packt Publishing* ,2018 年)。 但是,不熟悉 SVM 的读者不必担心,因为我们不会讨论太多的数学细节。 要记住的最重要的一点是,不支持任何内核的通用投影会导致计算复杂性急剧增加(尤其是对于大型数据集)。
*K(•,•)*的最常见选择之一是径向基函数(已经在第 3 章,*高级聚类*中进行了分析):
*K(•,•)*的最常见选择之一是径向基函数(已经在第 3 章,“高级聚类”中进行了分析):
![](img/24030c03-033f-4e35-b840-0349843b16b6.png)
......
......@@ -271,7 +271,7 @@ print(np.sum(pca.explained_variance_ratio_))
有时,数据集不是线性可分离的,并且标准 PCA 无法提取正确的主成分。 当我们面对非凸簇的问题时,该过程与第 3 章,*高级聚类*中讨论的过程没有什么不同。 在那种情况下,由于几何原因,某些算法无法执行成功的分离。 在这种情况下,目标是根据主成分的结构区分不同的类(在纯净,无监督的情况下,我们考虑特定的分组)。 因此,我们要使用转换后的数据集`Z`,并检测可区分阈值的存在。 例如,让我们考虑以下屏幕截图:
有时,数据集不是线性可分离的,并且标准 PCA 无法提取正确的主成分。 当我们面对非凸簇的问题时,该过程与第 3 章,“高级聚类”中讨论的过程没有什么不同。 在那种情况下,由于几何原因,某些算法无法执行成功的分离。 在这种情况下,目标是根据主成分的结构区分不同的类(在纯净,无监督的情况下,我们考虑特定的分组)。 因此,我们要使用转换后的数据集`Z`,并检测可区分阈值的存在。 例如,让我们考虑以下屏幕截图:
![](img/1152710f-83cd-449a-9389-5540bb9ad014.png)
......
......@@ -48,7 +48,7 @@
在第 7 章,*降维和成分分析*中,我们讨论了一些通用的方法,这些方法可用于降低数据集的维数,因为其具有特殊的统计属性(例如协方差) 矩阵)。 但是,当复杂度增加时,即使**内核主成分分析**`k`**内核 PCA**)也可能找不到合适的低维表示形式。 换句话说,信息的丢失可以克服一个阈值,该阈值保证了有效重建样本的可能性。 **自动编码器**是利用神经网络的极端非线性特性来查找给定数据集的低维表示的模型。 特别地,假设`X`是从数据生成过程中提取的一组样本, *p <sub class="calibre20">数据</sub>(x)*。 为简单起见,我们将考虑 *x <sub class="calibre20">i</sub> ∈ <sup class="calibre27">n</sup>* ,但对支撑结构没有任何限制(例如,对于 RGB 图像,[ *x <sub class="calibre20">i</sub> ∈ <sup class="calibre27">n×m×3</sup>* )。 自动编码器在形式上分为两个部分:有一个编码器,它将高维输入转换为较短的代码;一个解码器,执行逆运算(如下图所示):
在第 7 章,“降维和成分分析”中,我们讨论了一些通用的方法,这些方法可用于降低数据集的维数,因为其具有特殊的统计属性(例如协方差) 矩阵)。 但是,当复杂度增加时,即使**内核主成分分析**`k`**内核 PCA**)也可能找不到合适的低维表示形式。 换句话说,信息的丢失可以克服一个阈值,该阈值保证了有效重建样本的可能性。 **自动编码器**是利用神经网络的极端非线性特性来查找给定数据集的低维表示的模型。 特别地,假设`X`是从数据生成过程中提取的一组样本, *p <sub class="calibre20">数据</sub>(x)*。 为简单起见,我们将考虑 *x <sub class="calibre20">i</sub> ∈ <sup class="calibre27">n</sup>* ,但对支撑结构没有任何限制(例如,对于 RGB 图像,[ *x <sub class="calibre20">i</sub> ∈ <sup class="calibre27">n×m×3</sup>* )。 自动编码器在形式上分为两个部分:有一个编码器,它将高维输入转换为较短的代码;一个解码器,执行逆运算(如下图所示):
![](img/d2603e73-6156-40fe-b0f1-a2a37672819f.png)
......
......@@ -34,29 +34,29 @@ TensorFlow 是 Google 的开放源代码框架,用于构建机器学习 AI 应
第 1 章, *移动 TensorFlow 入门*,讨论如何在 Mac 和 Ubuntu 上设置 TensorFlow 以及在 Ubuntu 上设置 NVIDIA GPU,以及如何设置 Xcode 和 Android 工作室。 我们还将讨论 TensorFlow Mobile 和 TensorFlow Lite 之间的区别以及何时使用它们。 最后,我们将向您展示如何运行示例 TensorFlow iOS 和 Android 应用程序。
第 1 章, “移动 TensorFlow 入门”,讨论如何在 Mac 和 Ubuntu 上设置 TensorFlow 以及在 Ubuntu 上设置 NVIDIA GPU,以及如何设置 Xcode 和 Android 工作室。 我们还将讨论 TensorFlow Mobile 和 TensorFlow Lite 之间的区别以及何时使用它们。 最后,我们将向您展示如何运行示例 TensorFlow iOS 和 Android 应用程序。
第 2 章, *通过转移学习对图像进行分类* ,介绍了什么是转移学习以及为什么要使用转移学习,如何使用它 重新训练 Inception v3 和 MobileNet 模型,以更准确,更快地识别犬种,以及如何在示例 iOS 和 Android 应用程序中使用经过重新训练的模型。 然后,我们将向您展示如何在 Tensor-C 和 Swift 中将 TensorFlow 添加到自己的 iOS 应用中,以及如何将自己的 Android 应用添加到狗品种识别中。
第 2 章, “通过迁移学习对图像进行分类” ,介绍了什么是转移学习以及为什么要使用转移学习,如何使用它 重新训练 Inception v3 和 MobileNet 模型,以更准确,更快地识别犬种,以及如何在示例 iOS 和 Android 应用程序中使用经过重新训练的模型。 然后,我们将向您展示如何在 Tensor-C 和 Swift 中将 TensorFlow 添加到自己的 iOS 应用中,以及如何将自己的 Android 应用添加到狗品种识别中。
第 3 章,, *检测对象及其位置*,快速概述了对象检测,然后向您展示如何设置 TensorFlow 对象检测 API 并使用 它可以重新训练 SSD-MobileNet 和 Faster RCNN 模型。 我们还将通过手动构建 TensorFlow iOS 库以支持非默认 TensorFlow 操作的方式,向您展示如何在 iOS 应用中使用示例 TensorFlow Android 应用 中使用的模型。 最后,我们将向您展示如何训练 YOLO2(另一个流行的对象检测模型),该模型也在示例 TensorFlow Android 应用程序中使用,以及如何在 iOS 应用程序中使用它。
第 3 章,, “检测对象及其位置”,快速概述了对象检测,然后向您展示如何设置 TensorFlow 对象检测 API 并使用 它可以重新训练 SSD-MobileNet 和 Faster RCNN 模型。 我们还将通过手动构建 TensorFlow iOS 库以支持非默认 TensorFlow 操作的方式,向您展示如何在 iOS 应用中使用示例 TensorFlow Android 应用 中使用的模型。 最后,我们将向您展示如何训练 YOLO2(另一个流行的对象检测模型),该模型也在示例 TensorFlow Android 应用程序中使用,以及如何在 iOS 应用程序中使用它。
第 4 章, *变换具有惊人艺术风格的图片* 首先概述了神经样式转换在过去几年中的快速发展。 然后,它向您展示了如何训练快速的神经样式转换模型,以及如何在 iOS 和 Android 应用中使用它们。 之后,我们将介绍如何在您自己的 iOS 和 Android 应用程序中使用 TensorFlow Magenta 多样式模型轻松创建令人惊叹的艺术风格。
第 4 章, “变换具有惊人艺术风格的图片” 首先概述了神经样式转换在过去几年中的快速发展。 然后,它向您展示了如何训练快速的神经样式转换模型,以及如何在 iOS 和 Android 应用中使用它们。 之后,我们将介绍如何在您自己的 iOS 和 Android 应用程序中使用 TensorFlow Magenta 多样式模型轻松创建令人惊叹的艺术风格。
第 5 章,*了解简单语音命令*概述了语音识别,并向您展示了如何训练简单语音命令识别模型。 然后,我们将向您展示如何使用 Objective-C 和 Swift 在 Android 和 iOS 中使用该模型。 我们还将介绍有关如何解决移动设备上可能出现的模型加载和运行错误的更多提示。
第 5 章,“了解简单语音命令”概述了语音识别,并向您展示了如何训练简单语音命令识别模型。 然后,我们将向您展示如何使用 Objective-C 和 Swift 在 Android 和 iOS 中使用该模型。 我们还将介绍有关如何解决移动设备上可能出现的模型加载和运行错误的更多提示。
第 6 章,*用自然语言描述图像* ,介绍了图像字幕的工作原理,然后介绍了如何训练和冻结图像字幕模型 TensorFlow。 我们将进一步讨论如何转换和优化复杂的模型,以使其可以在移动设备上运行。 最后,我们将使用该模型提供完整的 iOS 和 Android 应用程序,以生成图像的自然语言描述。
第 6 章,“用自然语言描述图像”,介绍了图像字幕的工作原理,然后介绍了如何训练和冻结图像字幕模型 TensorFlow。 我们将进一步讨论如何转换和优化复杂的模型,以使其可以在移动设备上运行。 最后,我们将使用该模型提供完整的 iOS 和 Android 应用程序,以生成图像的自然语言描述。
第 7 章,*使用 CNN 和 LSTM 识别图形* ,解释了图形分类的工作原理,并讨论了如何训练,预测和准备模型。 然后,我们将向您展示如何构建另一个自定义 TensorFlow iOS 库,以在有趣的 iOS 涂鸦应用程序中使用该模型。 最后,我们将向您展示如何构建自定义的 TensorFlow Android 库来修复新的模型加载错误,然后在您自己的 Android 应用中使用该模型。
第 7 章,“使用 CNN 和 LSTM 识别图形”,解释了图形分类的工作原理,并讨论了如何训练,预测和准备模型。 然后,我们将向您展示如何构建另一个自定义 TensorFlow iOS 库,以在有趣的 iOS 涂鸦应用程序中使用该模型。 最后,我们将向您展示如何构建自定义的 TensorFlow Android 库来修复新的模型加载错误,然后在您自己的 Android 应用中使用该模型。
第 8 章,*使用 RNN 预测股票价格* 带领您完成 RNN 以及如何使用它预测股票价格。 然后,我们将向您介绍如何使用 TensorFlow API 构建 RNN 模型以预测股价,以及如何使用易于使用的 Keras API 构建 RNN LSTM 模型以实现相同的目标。 我们将测试并查看此类模型是否可以击败随机购买或出售策略。 最后,我们将向您展示如何在 iOS 和 Android 应用程序中运行 TensorFlow 和 Keras 模型。
第 8 章,“使用 RNN 预测股票价格”带领您完成 RNN 以及如何使用它预测股票价格。 然后,我们将向您介绍如何使用 TensorFlow API 构建 RNN 模型以预测股价,以及如何使用易于使用的 Keras API 构建 RNN LSTM 模型以实现相同的目标。 我们将测试并查看此类模型是否可以击败随机购买或出售策略。 最后,我们将向您展示如何在 iOS 和 Android 应用程序中运行 TensorFlow 和 Keras 模型。
第 9 章,*使用 GAN* 生成和增强图像,概述了 GAN 是什么以及为什么它具有如此大的潜力。 然后,它将探讨如何构建和训练可用于生成类似人的手写数字的基本 GAN 模型以及可以将低分辨率图像增强为高分辨率图像的更高级模型。 最后,我们将介绍如何在 iOS 和 Android 应用程序中使用两种 GAN 模型。
第 9 章,“使用 GAN 生成和增强图像”,概述了 GAN 是什么以及为什么它具有如此大的潜力。 然后,它将探讨如何构建和训练可用于生成类似人的手写数字的基本 GAN 模型以及可以将低分辨率图像增强为高分辨率图像的更高级模型。 最后,我们将介绍如何在 iOS 和 Android 应用程序中使用两种 GAN 模型。
第 10 章,*构建类似 AlphaZero 的手机游戏应用程序* ,从最新和最酷的 AlphaZero 的工作原理以及如何训练和测试 AlphaZero 的模型开始 在 TensorFlow 作为后端的 Keras 中玩一个简单但有趣的游戏,名为 Connect 4。 然后,我们将向您展示完整的 iOS 和 Android 应用程序,以使用该模型并在您的移动设备上玩 Connect 4 游戏。
第 10 章,“构建类似 AlphaZero 的手机游戏应用程序”,从最新和最酷的 AlphaZero 的工作原理以及如何训练和测试 AlphaZero 的模型开始 在 TensorFlow 作为后端的 Keras 中玩一个简单但有趣的游戏,名为 Connect 4。 然后,我们将向您展示完整的 iOS 和 Android 应用程序,以使用该模型并在您的移动设备上玩 Connect 4 游戏。
第 11 章,*在移动设备上使用 TensorFlow Lite 和 Core ML* 演示 TensorFlow Lite,然后向您展示如何使用预先构建的 TensorFlow 模型(经过重新训练) TensorFlow Lite 的 TensorFlow 模型以及 iOS 中的自定义 TensorFlow Lite 模型。 我们还将向您展示如何在 Android 中使用 TensorFlow Lite。 之后,我们将概述 Apple 的 Core ML,并向您展示如何在使用 Scikit-Learn 的标准机器学习中使用 Core ML。 最后,我们将介绍如何在 TensorFlow 和 Keras 中使用 Core ML。
第 11 章,“在移动设备上使用 TensorFlow Lite 和 Core ML”演示 TensorFlow Lite,然后向您展示如何使用预先构建的 TensorFlow 模型(经过重新训练) TensorFlow Lite 的 TensorFlow 模型以及 iOS 中的自定义 TensorFlow Lite 模型。 我们还将向您展示如何在 Android 中使用 TensorFlow Lite。 之后,我们将概述 Apple 的 Core ML,并向您展示如何在使用 Scikit-Learn 的标准机器学习中使用 Core ML。 最后,我们将介绍如何在 TensorFlow 和 Keras 中使用 Core ML。
第 12 章,*在 Raspberry Pi 上开发 TensorFlow 应用程序* ,首先介绍如何设置 Raspberry Pi 并使其移动以及如何设置 Raspberry Pi 上的 TensorFlow。 然后,我们将介绍如何使用 TensorFlow 图像识别和音频识别模型,以及文本到语音和机器人移动 API,来构建可以移动,看,听和说的 Raspberry Pi 机器人。 最后,我们将详细讨论如何使用 OpenAI Gym 和 TensorFlow 在模拟环境中从头开始构建和训练强大的基于神经网络的强化学习策略模型,以使机器人学会保持平衡。
第 12 章,“在 Raspberry Pi 上开发 TensorFlow 应用程序”,首先介绍如何设置 Raspberry Pi 并使其移动以及如何设置 Raspberry Pi 上的 TensorFlow。 然后,我们将介绍如何使用 TensorFlow 图像识别和音频识别模型,以及文本到语音和机器人移动 API,来构建可以移动,看,听和说的 Raspberry Pi 机器人。 最后,我们将详细讨论如何使用 OpenAI Gym 和 TensorFlow 在模拟环境中从头开始构建和训练强大的基于神经网络的强化学习策略模型,以使机器人学会保持平衡。
......@@ -68,7 +68,7 @@ TensorFlow 是 Google 的开放源代码框架,用于构建机器学习 AI 应
我们建议您先按顺序阅读前四章,然后运行[这里](http://github.com/jeffxtang/mobiletfbook)。 这将帮助您确保已为 TensorFlow 移动应用程序开发设置了全部开发环境,并且知道如何将 TensorFlow 集成到自己的 iOS 和/或 Android 应用程序中。 如果您是 iOS 开发人员,还将学习如何在 TensorFlow 中使用 Objective-C 或 Swift,以及何时以及如何使用 TensorFlow pod 或手动 TensorFlow iOS 库。
然后,如果您需要构建自定义的 TensorFlow Android 库,请转到第 7 章,*使用 CNN 和 LSTM 识别图形*,以及如果您想学习如何在 您的移动应用程序,请查看第 8 章, *使用 RNN 预测股价* , 和[章 10](../Text/10.html)*构建类似 AlphaZero 的手机游戏应用程序*
然后,如果您需要构建自定义的 TensorFlow Android 库,请转到第 7 章,“使用 CNN 和 LSTM 识别图形”,以及如果您想学习如何在 您的移动应用程序,请查看第 8 章, *使用 RNN 预测股价* , 和第 10 章, “构建类似 AlphaZero 的手机游戏应用程序”
如果您对 TensorFlow Lite 或 Core ML 更感兴趣,请阅读第 11 章,*在移动设备*上使用 TensorFlow Lite 和 Core ML,以及您对 Raspberry Pi 上的 TensorFlow 最感兴趣 或 TensorFlow 中的强化学习,请跳至第 12 章,*在 Raspberry Pi* 上开发 TensorFlow 应用程序。
......
......@@ -115,7 +115,7 @@ Could not create TensorFlow Graph: Invalid argument: No OpKernel was registered
[[Node: transformer/expand/conv1/mul_1 = Mul[T=DT_INT32](transformer/expand/conv1/mul_1/x, transformer/expand/conv1/strided_slice_1)]]
```
在第 3 章,*检测对象及其位置*中,我们讨论了原因以及如何使用手动构建的 TensorFlow 库修复此错误。 由于我们将在同一 iOS 应用程序中使用这两种模型,因此我们将使用功能更强大的手动 TensorFlow 库创建一个新的 iOS 应用程序。
在第 3 章,“检测对象及其位置”中,我们讨论了原因以及如何使用手动构建的 TensorFlow 库修复此错误。 由于我们将在同一 iOS 应用程序中使用这两种模型,因此我们将使用功能更强大的手动 TensorFlow 库创建一个新的 iOS 应用程序。
......
......@@ -28,7 +28,7 @@
1990 年代出现了第一个实用的独立于说话者的大词汇量和连续语音识别系统。 在 2000 年代初期,领先的初创公司 Nuance 和 SpeechWorks 提供的语音识别引擎为许多第一代基于 Web 的语音服务提供了支持,例如 TellMe,Phone 的 AOL 和 BeVocal。 当时构建的语音识别系统主要基于传统的**隐马尔可夫模型****HMM**),并且需要手动编写语法和安静环境以帮助识别引擎更准确地工作。
现代语音识别引擎几乎可以理解嘈杂环境下人们的任何说话,并且基于端到端深度学习,尤其是另一种更适合自然语言处理的深度神经网络,称为**递归神经网络** ](**RNN**)。 与传统的基于 HMM 的语音识别不同,传统的基于 HMM 的语音识别需要人的专业知识来构建和微调手工设计的功能以及声学和语言模型,而基于 RNN 的端到端语音识别系统则将音频输入直接转换为文本,而无需 将音频输入转换为语音表示以进行进一步处理。
现代语音识别引擎几乎可以理解嘈杂环境下人们的任何说话,并且基于端到端深度学习,尤其是另一种更适合自然语言处理的深度神经网络,称为**循环神经网络** ](**RNN**)。 与传统的基于 HMM 的语音识别不同,传统的基于 HMM 的语音识别需要人的专业知识来构建和微调手工设计的功能以及声学和语言模型,而基于 RNN 的端到端语音识别系统则将音频输入直接转换为文本,而无需 将音频输入转换为语音表示以进行进一步处理。
RNN allows us to handle sequences of input and/or output, because the network, by design, has memory of previous items in an input sequence or can generate a sequence of output. This makes RNN more appropriate for speech recognition, (where the input is a sequence of words uttered by users), image captioning, (where the output is a natural language sentence consisting of a series of words), text generation, and time series prediction. If you're unfamiliar with RNN, you should definitely check out *Andrey Karpathy's* blog, *The Unreasonable Effectiveness of Recurrent Neural Networks* ([http://karpathy.github.io/2015/05/21/rnn-effectiveness](http://karpathy.github.io/2015/05/21/rnn-effectiveness)). We'll also cover some detailed RNN models later in the book.
......@@ -412,7 +412,7 @@ runOnUiThread(new Runnable() {
如果您已经阅读了前三章中的 iOS 应用程序,那么您可能更喜欢使用手动构建的 TensorFlow iOS 库而不是 TensorFlow 实验窗格,就像使用手动库方法一样,您可以更好地控制可以使用哪些 TensorFlow 操作 添加更好的模型使您的模型满意,这也是我们决定专注于 TensorFlow Mobile 而不是第 1 章, *Mobile TensorFlow* 的 TensorFlow Lite 的原因之一。
因此,尽管您可以在阅读本书时尝试使用 TensorFlow 吊舱,以查看吊舱是否已更新以支持模型中使用的所有操作,但从现在开始,我们将始终使用手动构建的 TensorFlow 库( 请参见 iOS 应用中第 3 章,*检测对象及其位置**在 iOS 中使用对象检测模型的*部分的步骤 1 和 2)。
因此,尽管您可以在阅读本书时尝试使用 TensorFlow 吊舱,以查看吊舱是否已更新以支持模型中使用的所有操作,但从现在开始,我们将始终使用手动构建的 TensorFlow 库( 请参见 iOS 应用中第 3 章,“检测对象及其位置”*在 iOS 中使用对象检测模型的*部分的步骤 1 和 2)。
......
......@@ -6,7 +6,7 @@
如果图像分类和物体检测是明智的任务,那么用自然语言描述图像绝对是一项更具挑战性的任务,需要更多的智能-请片刻考虑一下每个人如何从新生儿成长(谁学会了识别 物体并检测它们的位置)到三岁的孩子(他们学会讲述图片故事)。 用自然语言描述图像的任务的正式术语是图像标题。 与具有长期研究和发展历史的语音识别不同,图像字幕(具有完整的自然语言,而不仅仅是关键词输出)由于其复杂性和 2012 年的深度学习突破而仅经历了短暂而令人兴奋的研究历史。
在本章中,我们将首先回顾基于深度学习的图像字幕模型如何赢得 2015 年 Microsoft COCO(大规模对象检测,分割和字幕数据集),我们在 中简要介绍了该模型 *第 3 章**检测对象及其位置* ],有效。 然后,我们将总结在 TensorFlow 中训练模型的步骤,并详细介绍如何准备和优化要在移动设备上部署的复杂模型。 之后,我们将向您展示有关如何构建 iOS 和 Android 应用程序以使用该模型生成描述图像的自然语言语句的分步教程。 由于该模型同时涉及计算机视觉和自然语言处理,因此您将首次看到两种主要的深度神经网络架构 CNN 和 RNN 如何协同工作,以及如何编写 iOS 和 Android 代码以访问经过训练的网络并进行 多个推论。 总而言之,我们将在本章介绍以下主题:
在本章中,我们将首先回顾基于深度学习的图像字幕模型如何赢得 2015 年 Microsoft COCO(大规模对象检测,分割和字幕数据集),我们在 中简要介绍了该模型 第 3 章 , “检测对象及其位置” ],有效。 然后,我们将总结在 TensorFlow 中训练模型的步骤,并详细介绍如何准备和优化要在移动设备上部署的复杂模型。 之后,我们将向您展示有关如何构建 iOS 和 Android 应用程序以使用该模型生成描述图像的自然语言语句的分步教程。 由于该模型同时涉及计算机视觉和自然语言处理,因此您将首次看到两种主要的深度神经网络架构 CNN 和 RNN 如何协同工作,以及如何编写 iOS 和 Android 代码以访问经过训练的网络并进行 多个推论。 总而言之,我们将在本章介绍以下主题:
* 图片字幕-工作原理
* 训练和冻结图像字幕模型
......@@ -26,7 +26,7 @@
获奖的 Show and Tell 模型是使用端到端方法进行训练的,类似于我们在上一章中简要介绍的最新的基于深度学习的语音识别模型。 它使用 MSCOCO 图像字幕 2014 数据集,可从[这里](http://cocodataset.org/#download)下载,该数据集包含超过 82,000 个训练图像,并以描述它们的自然语言句子为目标。 训练模型以使为每个输入图像输出目标自然语言句子的可能性最大化。 与使用多个子系统的其他更复杂的训练方法不同,端到端方法优雅,简单,并且可以实现最新的结果。
为了处理和表示输入图像,Show and Tell 模型使用预训练的 Inception v3 模型,该模型与我们在 *第 2 章**通过转移学习*对图像进行分类。 Inception v3 CNN 网络的最后一个隐藏层用作输入图像的表示。 由于 CNN 模型的性质,较早的层捕获更多的基本图像信息,而较后的层捕获更高级的图像概念。 因此,通过使用输入图像的最后一个隐藏层来表示图像,我们可以更好地准备具有高级概念的自然语言输出。 毕竟,我们通常会开始用诸如“人”或“火车”之类的词来描述图片,而不是“带有尖锐边缘的东西”。
为了处理和表示输入图像,Show and Tell 模型使用预训练的 Inception v3 模型,该模型与我们在 第 2 章*通过转移学习*对图像进行分类。 Inception v3 CNN 网络的最后一个隐藏层用作输入图像的表示。 由于 CNN 模型的性质,较早的层捕获更多的基本图像信息,而较后的层捕获更高级的图像概念。 因此,通过使用输入图像的最后一个隐藏层来表示图像,我们可以更好地准备具有高级概念的自然语言输出。 毕竟,我们通常会开始用诸如“人”或“火车”之类的词来描述图片,而不是“带有尖锐边缘的东西”。
为了表示目标自然语言输出中的每个单词,使用了单词嵌入方法。 词嵌入只是词的向量表示。 [TensorFlow 网站上有一个不错的教程](https://www.tensorflow.org/tutorials/word2vec),介绍如何构建模型来获取单词的矢量表示。
......@@ -56,7 +56,7 @@ The gradient concept is used in the back propagation process to update network w
如果您已按照 *第 3 章**检测对象及其位置*中的*设置 TensorFlow 对象检测 API* 部分进行操作,那么您已经 已安装`im2txt`文件夹; 否则,只需将`cd`移至您的 TensorFlow 源根目录,然后运行:
如果您已按照 第 3 章 和“检测对象及其位置”中的*设置 TensorFlow 对象检测 API* 部分进行操作,那么您已经 已安装`im2txt`文件夹; 否则,只需将`cd`移至您的 TensorFlow 源根目录,然后运行:
```py
git clone https://github.com/tensorflow/models
......@@ -72,7 +72,7 @@ The gradient concept is used in the back propagation process to update network w
MSCOCO_DIR="${HOME}/im2txt/data/mscoco"
```
请注意,尽管 2014 年要下载和保存的原始数据集约为 20 GB,但该数据集将转换为 TFRecord 格式(,我们还在 *第 3 章* *检测对象及其位置*来转换对象检测数据集,这是运行以下训练脚本所需的,并添加了大约 100 GB 数据。 因此,使用 TensorFlow im2txt 项目总共需要约 140 GB 的训练自己的图像字幕模型。
请注意,尽管 2014 年要下载和保存的原始数据集约为 20 GB,但该数据集将转换为 TFRecord 格式(,我们还在 第 3 章 “检测对象及其位置”来转换对象检测数据集,这是运行以下训练脚本所需的,并添加了大约 100 GB 数据。 因此,使用 TensorFlow im2txt 项目总共需要约 140 GB 的训练自己的图像字幕模型。
2. 转到您的 im2txt 源代码所在的位置,然后下载并处理 MSCOCO 数据集:
......@@ -172,7 +172,7 @@ Captions for image COCO_val2014_000000224477.jpg:
在第 4 章,*转换具有惊人艺术风格的图片,*和第 5 章,*了解简单语音命令*中,我们使用了两个略有不同的版本 一个名为`freeze.py`的脚本将受过训练的网络权重与网络图定义合并到一个自足的模型文件中,这是我们可以在移动设备上使用的好处。 TensorFlow 还带有`freeze`脚本的更通用版本,称为`freeze_graph.py`,位于`tensorflow/python/tools`文件夹中,可用于构建模型文件。 要使其正常运行,您需要为其提供至少四个参数(要查看所有可用参数,请查看 `tensorflow/python/tools/freeze_graph.py`):
在第 4 章,*转换具有惊人艺术风格的图片,*和第 5 章,“了解简单语音命令”中,我们使用了两个略有不同的版本 一个名为`freeze.py`的脚本将受过训练的网络权重与网络图定义合并到一个自足的模型文件中,这是我们可以在移动设备上使用的好处。 TensorFlow 还带有`freeze`脚本的更通用版本,称为`freeze_graph.py`,位于`tensorflow/python/tools`文件夹中,可用于构建模型文件。 要使其正常运行,您需要为其提供至少四个参数(要查看所有可用参数,请查看 `tensorflow/python/tools/freeze_graph.py`):
* `--input_graph``--input_meta_graph`:模型的图形定义文件。 例如,在上一节的第 4 步的命令`ls -lt $MODEL_DIR/train`的输出中,`model.ckpt-109587.meta`是一个元图文件,其中包含模型的图定义和其他与检查点相关的元数据,而`graph.pbtxt`只是模型的图 定义。
* `--input_checkpoint` :特定的检查点文件,例如 `model.ckpt-109587` 。 注意,您没有指定大型检查点文件 `model.ckpt-109587.data-00000-of-00001` 的完整文件名。
......
......@@ -34,7 +34,7 @@
![](img/ef475044-6568-4e50-bc98-8ff0a0d6efbf.png)Figure 7.1: The drawing classification mode
与接受 2D 图像输入的 2D 卷积 API `tf.layers.conv2d` 不同,此处将 1D 卷积 API `tf.layers.conv1d`用于时间卷积(例如绘图)。 默认情况下,在图形分类模型中,使用三个 1D 卷积层,每个层具有 48、64 和 96 个滤镜,其长度分别为 5、5 和 3。 卷积层之后,将创建 3 个 LSTM 层,每层具有 128 个正向 BasicLSTMCell 节点和 128 个反向 BasicLSTMCell 节点,然后将其用于创建动态双向递归神经网络,该网络的输出将发送到最终的完全连接层以计算 logits(非标准化的日志概率)。
与接受 2D 图像输入的 2D 卷积 API `tf.layers.conv2d` 不同,此处将 1D 卷积 API `tf.layers.conv1d`用于时间卷积(例如绘图)。 默认情况下,在图形分类模型中,使用三个 1D 卷积层,每个层具有 48、64 和 96 个滤镜,其长度分别为 5、5 和 3。 卷积层之后,将创建 3 个 LSTM 层,每层具有 128 个正向 BasicLSTMCell 节点和 128 个反向 BasicLSTMCell 节点,然后将其用于创建动态双向循环神经网络,该网络的输出将发送到最终的完全连接层以计算 logits(非标准化的日志概率)。
If you don't have a good understanding of all these details, don't worry; to develop powerful mobile apps using a model built by others, you don't have to understand all the details, but in the next chapter we'll also discuss in greater detail how you can build a RNN model from scratch for stock prediction, and with that, you'll have a better understanding of all the RNN stuff.
......@@ -271,7 +271,7 @@ bazel-bin/tensorflow/contrib/util/convert_graphdef_memmapped_format \
要解决以前的 RefSwitch 错误,无论您是否像在第 2 章,*通过传递学习*[第 6 章[](../Text/06.html)*用自然语言描述图像*或手动构建的 TensorFlow 库,就像在其他章节中一样,我们必须使用一些新技巧。 发生错误的原因是`RefSwitch`操作需要 INT64 数据类型,但它不是 TensorFlow 库中内置的已注册数据类型之一,因为默认情况下,要使该库尽可能小,仅适用于 每个操作都包括在内。 我们可能会从 Python 的模型构建端修复此问题,但是在这里,我们仅向您展示如何从 iOS 端修复此问题,当您无权访问源代码来构建模型时,这很有用。
要解决以前的 RefSwitch 错误,无论您是否像在第 2 章,*通过传递学习*[第 6 章[](../Text/06.html)“用自然语言描述图像”或手动构建的 TensorFlow 库,就像在其他章节中一样,我们必须使用一些新技巧。 发生错误的原因是`RefSwitch`操作需要 INT64 数据类型,但它不是 TensorFlow 库中内置的已注册数据类型之一,因为默认情况下,要使该库尽可能小,仅适用于 每个操作都包括在内。 我们可能会从 Python 的模型构建端修复此问题,但是在这里,我们仅向您展示如何从 iOS 端修复此问题,当您无权访问源代码来构建模型时,这很有用。
......@@ -617,7 +617,7 @@ void normalizeScreenCoordinates(NSMutableArray *allPoints, float *normalized) {
现在该看看我们如何在 Android 中加载和使用该模型。 在之前的章节中,我们通过使用 Android 应用程序的`build.gradle`文件并添加了一行 `compile 'org.tensorflow:tensorflow-android:+'`仅添加了 TensorFlow 支持。 与 iOS 相比,我们必须构建一个自定义的 TensorFlow 库来修复不同的模型加载或运行错误(例如,在 第 3 章, *中,检测对象及其位置[*[第四章](../Text/04.html)*变换具有惊人艺术风格的图片*[第五章](../Text/05.html)*了解简单的语音命令*),Android 的默认 TensorFlow 库对注册的操作和数据类型有更好的支持,这可能是因为 Android 是 Google 的一等公民,而 iOS 是第二名,甚至是第二名。
现在该看看我们如何在 Android 中加载和使用该模型。 在之前的章节中,我们通过使用 Android 应用程序的`build.gradle`文件并添加了一行 `compile 'org.tensorflow:tensorflow-android:+'`仅添加了 TensorFlow 支持。 与 iOS 相比,我们必须构建一个自定义的 TensorFlow 库来修复不同的模型加载或运行错误(例如,在 第 3 章, *中,检测对象及其位置[*[第四章](../Text/04.html)“变换具有惊人艺术风格的图片”[第五章](../Text/05.html)*了解简单的语音命令*),Android 的默认 TensorFlow 库对注册的操作和数据类型有更好的支持,这可能是因为 Android 是 Google 的一等公民,而 iOS 是第二名,甚至是第二名。
事实是,当我们处理各种惊人的模型时,我们不得不面对不可避免的问题只是时间问题:我们必须手动为 Android 构建 TensorFlow 库,以修复默认 TensorFlow 库中的一些错误 根本无法应对。 `No OpKernel was registered to support Op 'RefSwitch' with these attrs.`错误就是这样的错误之一。 对于乐观的开发人员来说,这仅意味着另一种向您的技能组合中添加新技巧的机会。
......@@ -647,7 +647,7 @@ android_ndk_repository(
api_level=14)
```
2. 如果您还使用过本书中的 iOS 应用程序,并且已将`tensorflow/core/platform/default/mutex.h``#include "nsync_cv.h"``#include "nsync_mu.h"`更改为`#include "nsync/public/nsync_cv.h"``#include "nsync/public/nsync_mu.h"`,请参见第 3 章, *检测对象及其位置* 时,您需要将其更改回以成功构建 TensorFlow Android 库(此后,当您使用手动构建的 TensorFlow 库在 Xcode 和 iOS 应用上工作时,需要先添加`nsync/public` 这两个标头。
2. 如果您还使用过本书中的 iOS 应用程序,并且已将`tensorflow/core/platform/default/mutex.h``#include "nsync_cv.h"``#include "nsync_mu.h"`更改为`#include "nsync/public/nsync_cv.h"``#include "nsync/public/nsync_mu.h"`,请参见第 3 章, “检测对象及其位置” 时,您需要将其更改回以成功构建 TensorFlow Android 库(此后,当您使用手动构建的 TensorFlow 库在 Xcode 和 iOS 应用上工作时,需要先添加`nsync/public` 这两个标头。
Changing `tensorflow/core/platform/default/mutex.h` back and forth certainly is not an ideal solution. It's supposed to be just as a workaround. As it only needs to be changed when you start using a manually built TensorFlow iOS library or when you build a custom TensorFlow library, we can live with it for now.
......
......@@ -34,7 +34,7 @@
这就是为什么我们说 RNN 有内存。 RNN 对于处理股票价格数据似乎很有意义,因为直觉是,今天(以及明天和后天等等)的股票价格可能会受其前 N 天的价格影响。
LSTM 只是解决 RNN 已知消失梯度问题的一种 RNN,我们在第 6 章,*用自然语言描述图像*中引入了 LSTM。 基本上,在训练 RNN 模型的过程中,,如果到 RNN 的输入序列的时间步太长,则使用反向传播更新较早时间步的网络权重可能会得到 0 的梯度值, 导致没有学习发生。 例如,当我们使用 50 天的价格作为输入,并且如果使用 50 天甚至 40 天的时间步长变得太长,则常规 RNN 将是不可训练的。 LSTM 通过添加一个长期状态来解决此问题,该状态决定可以丢弃哪些信息以及需要在许多时间步骤中存储和携带哪些信息。
LSTM 只是解决 RNN 已知消失梯度问题的一种 RNN,我们在第 6 章,“用自然语言描述图像”中引入了 LSTM。 基本上,在训练 RNN 模型的过程中,,如果到 RNN 的输入序列的时间步太长,则使用反向传播更新较早时间步的网络权重可能会得到 0 的梯度值, 导致没有学习发生。 例如,当我们使用 50 天的价格作为输入,并且如果使用 50 天甚至 40 天的时间步长变得太长,则常规 RNN 将是不可训练的。 LSTM 通过添加一个长期状态来解决此问题,该状态决定可以丢弃哪些信息以及需要在许多时间步骤中存储和携带哪些信息。
The other type of RNN that solves the vanishing gradient problem nicely is called **Gated Recurrent Unit** (**GRU**), which simplifies standard LSTM models a bit and is becoming more popular. Both TensorFlow and Keras APIs support basic RNN and LSTM/GRU models. In the next two sections, you'll see concrete TensorFlow and Keras APIs for using RNN and standard LSTM, and you can simply replace "LSTM" with "GRU" in the code to use and compare the results of using the GRU model with RNN and standard LSTM models.
......@@ -538,7 +538,7 @@ python tensorflow/python/tools/freeze_graph.py --input_meta_graph=/tmp/keras_amz
我们不会通过重复项目设置步骤来烦您-只需按照我们之前的操作即可创建一个名为 StockPrice 的新 Objective-C 项目,该项目将使用手动构建的 TensorFlow 库(请参阅[第 7 章[iOS 3]的 iOS 部分 ],*使用 CNN 和 LSTM 识别图形*(如果需要详细信息)。 然后将两个`amzn_tf_frozen.pb`和`amzn_keras_frozen.pb` 模型文件 添加到项目中,您应该在 Xcode 中拥有 StockPrice 项目,如图 8.3 所示:](../Text/07.html)
我们不会通过重复项目设置步骤来烦您-只需按照我们之前的操作即可创建一个名为 StockPrice 的新 Objective-C 项目,该项目将使用手动构建的 TensorFlow 库(请参阅[第 7 章[iOS 3]的 iOS 部分 ],“使用 CNN 和 LSTM 识别图形”(如果需要详细信息)。 然后将两个`amzn_tf_frozen.pb`和`amzn_keras_frozen.pb` 模型文件 添加到项目中,您应该在 Xcode 中拥有 StockPrice 项目,如图 8.3 所示:](../Text/07.html)
![](img/454020d6-1f32-480d-b159-b474b6878540.png)Figure 8.3 iOS app using the TensorFlow- and Keras-trained models in Xcode
......
......@@ -346,7 +346,7 @@ python tensorflow/python/tools/freeze_graph.py \
--input_binary=true
```
为简单起见,由于它是小型模型,因此我们不会像第 6 章,*用自然语言描述图像*和[ 第 9 章,*用 GAN* 生成和增强图像。 现在,我们准备在移动设备上使用该模型并编写代码以在 iOS 和 Android 设备上播放 Connect 4。
为简单起见,由于它是小型模型,因此我们不会像第 6 章,“用自然语言描述图像”和[ 第 9 章,*用 GAN* 生成和增强图像。 现在,我们准备在移动设备上使用该模型并编写代码以在 iOS 和 Android 设备上播放 Connect 4。
......@@ -1322,7 +1322,7 @@ void softmax(float vals[], int count) {
在本章中,我们介绍了 AlphaZero 的惊人世界,这是 DeepMind 截至 2017 年 12 月的最新和最大成就。我们向您展示了如何使用功能强大的 Keras API 和 TensorFlow 后端为 Connect 4 训练类似 AlphaZero 的模型,以及 如何测试并可能改善这种模型。 然后,我们冻结了该模型,并详细介绍了如何构建 iOS 和 Android 应用程序以使用该模型,以及如何使用基于模型的 AI 玩 Connect 4。 尚不能完全击败人类象棋或 GO 冠军的确切 AlphaZero 模型,但我们希望本章为您提供扎实的基础,并激发您继续进行工作,以复制 AlphaZero 最初所做的工作并将其进一步扩展到其他问题领域。 这将需要很多努力,但完全值得。
如果最新的 AI 进展(例如 AlphaZero)使您兴奋不已,那么您还可能会发现由 TensorFlow 驱动的最新移动平台解决方案或工具包令人兴奋。 TensorFlow Lite,如我们在[第 1 章中提到的, *移动 TensorFlow 入门* ,是 TensorFlow Mobile 的替代解决方案,我们 在前面的所有章节中都有介绍。 根据 Google 的说法,TensorFlow Lite 将成为 TensorFlow 在移动设备上的未来,尽管在此时和可预见的将来,TensorFlow Mobile 仍应用于生产场合。](../Text/01.html)
如果最新的 AI 进展(例如 AlphaZero)使您兴奋不已,那么您还可能会发现由 TensorFlow 驱动的最新移动平台解决方案或工具包令人兴奋。 如我们在第 1 章“移动 TensorFlow 入门”中提到的,TensorFlow Lite 是 TensorFlow Mobile 的替代解决方案,我们 在前面的所有章节中都有介绍。 根据 Google 的说法,TensorFlow Lite 将成为 TensorFlow 在移动设备上的未来,尽管在此时和可预见的将来,TensorFlow Mobile 仍应用于生产场合。
虽然 TensorFlow Lite 在 iOS 和 Android 上均可使用,但在 Android 设备上运行时,它也可以利用 Android Neural Networks API 进行硬件加速。 另一方面,iOS 开发人员可以利用 Core ML, Apple 针对 iOS 11 或更高版本的最新机器学习框架,该框架支持运行许多强大的预训练深度学习模型,以及使用 经典的机器学习算法和 Keras,以优化的方式在设备上以最小的应用程序二进制文件大小运行。 在下一章中,我们将介绍如何在 iOS 和 Android 应用程序中使用 TensorFlow Lite 和 Core ML。
......
......@@ -25,7 +25,7 @@
[TensorFlow Lite](https://www.tensorflow.org/mobile/tflite) 是一种轻量级解决方案,可在移动和嵌入式设备上运行深度学习模型。 如果可以将 TensorFlow 或 Keras 内置的模型成功转换为 TensorFlow Lite 格式,请基于 [FlatBuffers](https://google.github.io/flatbuffers),与 ProtoBuffers ProtoBuffers 类似,但速度更快,并且大小要小得多。 *检测对象及其位置* 和,然后可以期望模型以低延迟和较小的二进制大小运行。 在您的移动应用程序中使用 TensorFlow Lite 的基本工作流程如下:
[TensorFlow Lite](https://www.tensorflow.org/mobile/tflite) 是一种轻量级解决方案,可在移动和嵌入式设备上运行深度学习模型。 如果可以将 TensorFlow 或 Keras 内置的模型成功转换为 TensorFlow Lite 格式,请基于 [FlatBuffers](https://google.github.io/flatbuffers),与 ProtoBuffers ProtoBuffers 类似,但速度更快,并且大小要小得多。 “检测对象及其位置” 和,然后可以期望模型以低延迟和较小的二进制大小运行。 在您的移动应用程序中使用 TensorFlow Lite 的基本工作流程如下:
1. 使用 TensorFlow 或 Keras 以 TensorFlow 作为后端来构建和训练(或重新训练)TensorFlow 模型,例如我们在前几章中训练的模型。
......@@ -227,7 +227,7 @@ bazel-bin/tensorflow/contrib/lite/toco/toco \
在前面的章节中,我们已经训练了许多定制的 TensorFlow 模型,并将其冻结以供移动使用。 不幸的是,如果您尝试使用上一节中内置的`bazel-bin/tensorflow/contrib/lite/toco/toco` TensorFlow Lite 转换工具 将模型从 TensorFlow 格式转换为 TensorFlow Lite 格式,则它们都会失败,除了 第 2 章, *通过转移学习* 对图像进行分类的再训练模型; 大多数错误属于“转换不受支持的操作”类型。 例如,以下命令尝试将第 3 章, *检测对象及其位置* 中的 TensorFlow 对象检测模型转换为 TensorFlow Lite 格式:
在前面的章节中,我们已经训练了许多定制的 TensorFlow 模型,并将其冻结以供移动使用。 不幸的是,如果您尝试使用上一节中内置的`bazel-bin/tensorflow/contrib/lite/toco/toco` TensorFlow Lite 转换工具 将模型从 TensorFlow 格式转换为 TensorFlow Lite 格式,则它们都会失败,除了 第 2 章, *通过转移学习* 对图像进行分类的再训练模型; 大多数错误属于“转换不受支持的操作”类型。 例如,以下命令尝试将第 3 章, “检测对象及其位置” 中的 TensorFlow 对象检测模型转换为 TensorFlow Lite 格式:
```py
bazel-bin/tensorflow/contrib/lite/toco/toco \
......@@ -397,7 +397,7 @@ private MappedByteBuffer loadModelFile(Activity activity) throws IOException {
}
```
回想一下,在步骤 4 中,我们必须在 build.gradle 文件中添加`noCompress "tflite"`,否则`openFd`方法将导致错误。 该方法返回模型的映射版本,我们在第 6 章,*中以自然语言描述图像时使用`convert_graphdef_memmapped_format`工具将 TensorFlow Mobile 模型转换为映射格式。 和第 9 章,*使用 GAN* 生成和增强图像。*
回想一下,在步骤 4 中,我们必须在 build.gradle 文件中添加`noCompress "tflite"`,否则`openFd`方法将导致错误。 该方法返回模型的映射版本,我们在第 6 章,*中以自然语言描述图像时使用`convert_graphdef_memmapped_format`工具将 TensorFlow Mobile 模型转换为映射格式。 和第 9 章,“使用 GAN 生成和增强图像”。
这就是在新的 Android 应用程序中加载并运行预构建的 TensorFlow Lite 模型所需的一切。 如果您有兴趣使用经过重新训练和转换的 TensorFlow Lite 模型(如我们在 iOS 应用程序,Android 应用程序中所做的那样),或者自定义 TensorFlow Lite 模型(如果您成功获得了转换后的模型),则可以在 HelloTFLite 应用程序。 我们将暂时保留最先进的 TensorFlow Lite,并继续为 iOS 开发人员介绍另一个非常酷的 WWDC 重量级主题。
......
......@@ -6,7 +6,7 @@
根据 Wikipedia 的说法,“ Raspberry Pi 是 Raspberry Pi 基金会在英国开发的一系列小型单板计算机,旨在促进学校和发展中国家的基础计算机科学教学。” [Raspberry Pi 的官方网站](https://www.raspberrypi.org)将其描述为“一种小型且价格合理的计算机,可以用来学习编程。” 如果您以前从未听说过或使用过 Raspberry Pi,请访问其网站,然后您很快就会爱上这个很棒的小东西。 几乎没有什么功能-实际上,TensorFlow 的开发人员从 2016 年中期开始在早期版本的 Raspberry Pi 上提供了 TensorFlow,因此我们可以在微型计算机上运行复杂的 TensorFlow 模型,您只需花费 35 美元即可购买到。 这可能超出了“基础计算机科学的教学”或“学习编程”的范围,但另一方面,如果我们考虑过去几年中移动设备的所有飞速发展,那么看到这一点我们就不会感到惊讶 如何在越来越小的设备中实现越来越多的功能。
在本章中,我们将进入 Raspberry Pi 的有趣世界,Raspberry Pi 是 TensorFlow 正式支持的最小设备。 我们将首先介绍如何获取和设置新的 Raspberry Pi 3 B 板,包括本章中使用的所有必要配件,以使其能够看,听和说。 然后,我们将介绍如何使用 [GoPiGo 机器人基础套件](https://www.dexterindustries.com/shop/gopigo3-robot-base-kit),将 Raspberry Pi 板变成一个可以移动的机器人。 之后,我们将提供最简单的工作步骤,以便在 Raspberry Pi 上设置 TensorFlow 1.6 并构建其示例 Raspberry Pi 应用程序。 我们还将讨论如何集成图像分类,这是我们在第 2 章,*通过转移学习*对图像进行分类时使用的模型,并通过文字转语音功能使机器人告诉我们它可以识别的内容 以及如何集成音频识别,这是我们在第 5 章,*了解简单语音命令*中使用的模型以及 GoPiGo API,可让您使用语音命令来控制机器人的运动 。
在本章中,我们将进入 Raspberry Pi 的有趣世界,Raspberry Pi 是 TensorFlow 正式支持的最小设备。 我们将首先介绍如何获取和设置新的 Raspberry Pi 3 B 板,包括本章中使用的所有必要配件,以使其能够看,听和说。 然后,我们将介绍如何使用 [GoPiGo 机器人基础套件](https://www.dexterindustries.com/shop/gopigo3-robot-base-kit),将 Raspberry Pi 板变成一个可以移动的机器人。 之后,我们将提供最简单的工作步骤,以便在 Raspberry Pi 上设置 TensorFlow 1.6 并构建其示例 Raspberry Pi 应用程序。 我们还将讨论如何集成图像分类,这是我们在第 2 章,*通过转移学习*对图像进行分类时使用的模型,并通过文字转语音功能使机器人告诉我们它可以识别的内容 以及如何集成音频识别,这是我们在第 5 章,“了解简单语音命令”中使用的模型以及 GoPiGo API,可让您使用语音命令来控制机器人的运动 。
最后,我们将向您展示如何使用 TensorFlow 和 OpenAI Gym,这是一个用于开发和比较强化学习算法的 Python 工具包,如何在模拟环境中实现强大的强化学习算法,以使我们的机器人能够在真实的身体中移动和平衡 环境。
......@@ -365,7 +365,7 @@ cmd.append("\"");
system(cmd.c_str());
```
现在,我们已经完成了 *如何使用 Cloud Vision 和 Speech API 演示*来构建智能 RasPi Bot 的图像分类和语音合成任务,而不使用任何 Cloud API。 使用我们在第 5 章,*了解简单语音命令*中使用的相同模型,在 Raspberry Pi 上进行音频识别。
现在,我们已经完成了 *如何使用 Cloud Vision 和 Speech API 演示*来构建智能 RasPi Bot 的图像分类和语音合成任务,而不使用任何 Cloud API。 使用我们在第 5 章,“了解简单语音命令”中使用的相同模型,在 Raspberry Pi 上进行音频识别。
......@@ -375,7 +375,7 @@ system(cmd.c_str());
要使用 TensorFlow 教程中的[预训练音频识别模型](https://www.tensorflow.org/tutorials/audio_recognition)或我们之前描述的重新训练模型,我们将重用来自[这个页面](https://gist.github.com/aallan)的 Python 脚本`listen.py`,并在识别四个基本音频命令后添加 GoPiGo API 调用以控制机器人的运动:“左”,“右”,“去” ,”和“停止”。 预训练模型支持的其他六个命令-“是”,“否”,“向上”,“向下”,“打开”和“关闭”,在我们的示例中不太适用,如果需要 ,您可以使用第 5 章 , *了解简单语音命令*中所示的重新训练模型,以支持针对特定任务的其他语音命令。
要使用 TensorFlow 教程中的[预训练音频识别模型](https://www.tensorflow.org/tutorials/audio_recognition)或我们之前描述的重新训练模型,我们将重用来自[这个页面](https://gist.github.com/aallan)的 Python 脚本`listen.py`,并在识别四个基本音频命令后添加 GoPiGo API 调用以控制机器人的运动:“左”,“右”,“去” ,”和“停止”。 预训练模型支持的其他六个命令-“是”,“否”,“向上”,“向下”,“打开”和“关闭”,在我们的示例中不太适用,如果需要 ,您可以使用第 5 章 , “了解简单语音命令”中所示的重新训练模型,以支持针对特定任务的其他语音命令。
要运行脚本,请先从[这里](http://download.tensorflow.org/models/speech_commands_v0.01.zip)下载预训练的音频识别模型,然后将其解压缩到`/tmp`,或者对我们在第 5 章“了解简单语音命令”中使用的模型使用`scp`到 Pi 板的`/tmp`目录,然后运行:
......@@ -413,7 +413,7 @@ run(softmax_tensor, {
})
```
在这里,将`softmax_tensor`定义为 TensorFlow 图的`get_tensor_by_name(self.output_name_)`,将`output_name_``input_samples_name_``input_rate_name_`分别定义为`labels_softmax``decoded_sample_data:0``decoded_sample_data:1`,与 我们在第 5 章,*了解简单语音命令*中的 iOS 和 Android 应用程序中使用过。
在这里,将`softmax_tensor`定义为 TensorFlow 图的`get_tensor_by_name(self.output_name_)`,将`output_name_``input_samples_name_``input_rate_name_`分别定义为`labels_softmax``decoded_sample_data:0``decoded_sample_data:1`,与 我们在第 5 章,“了解简单语音命令”中的 iOS 和 Android 应用程序中使用过。
在之前的章节中,我们主要使用 Python 训练和测试 TensorFlow 模型,然后再使用本机 TensorFlow C ++库的 Java 接口代码在使用 C ++或 Android 的 iOS 中运行模型。 在 Raspberry Pi 上,您可以选择直接使用 TensorFlow Python API 或 C ++ API 在 Pi 上运行 TensorFlow 模型,尽管通常仍会在功能更强大的模型上进行训练 电脑。 有关完整的 TensorFlow Python API 文档,请参见[这里](https://www.tensorflow.org/api_docs/python)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册