提交 edbfe74f 编写于 作者: W wizardforcel

2020-12-15 22:46:36

上级 f000b261
......@@ -12,13 +12,13 @@
我们将从谈论 AI 的各个领域开始。 然后,我们将继续讨论更复杂的算法,例如极其随机的森林,隐马尔可夫模型,遗传算法,人工神经网络,卷积神经网络等等。
本书适用于希望使用 AI 算法创建实际应用程序的 Python 程序员。 这本书对 Python 初学者很友好,但是熟悉 Python 编程肯定会有所帮助,因此您可以试用这些代码。 对于希望实现人工智能技术的经验丰富的 Python 程序员而言,它也很有用。
本书适用于希望使用 AI 算法创建实际应用的 Python 程序员。 这本书对 Python 初学者很友好,但是熟悉 Python 编程肯定会有所帮助,因此您可以试用这些代码。 对于希望实现人工智能技术的经验丰富的 Python 程序员而言,它也很有用。
您将学习如何对需要使用的算法类型做出明智的决策,以及如何实现这些算法以获得最佳结果。 如果您想构建可以理解图像,文本,语音或其他某种形式的数据的通用应用程序,那么这本有关人工智能的书肯定会助您一臂之力!
您将学习如何对需要使用的算法类型做出明智的决策,以及如何实现这些算法以获得最佳结果。 如果您想构建可以理解图像,文本,语音或其他某种形式的数据的通用应用,那么这本有关人工智能的书肯定会助您一臂之力!
# 这本书适合谁
本书适用于希望构建现实人工智能应用程序的 Python 开发人员。 这本书对 Python 初学者很友好,但是熟悉 Python 对于玩弄代码很有帮助。 对于希望在现有技术堆栈中使用人工智能技术的经验丰富的 Python 程序员而言,它也将很有用。
本书适用于希望构建现实人工智能应用的 Python 开发人员。 这本书对 Python 初学者很友好,但是熟悉 Python 对于玩弄代码很有帮助。 对于希望在现有技术堆栈中使用人工智能技术的经验丰富的 Python 程序员而言,它也将很有用。
# 这本书涵盖的内容
......@@ -102,11 +102,11 @@
第 20 章,“卷积神经网络与深度学习”
我们将在本章中讨论深度学习的基础知识。 将向读者介绍卷积神经网络中的各种概念,以及如何将它们用于图像识别。 我们将讨论卷积神经网络中的各个层。 然后,我们将使用这些技术来构建实际应用程序
我们将在本章中讨论深度学习的基础知识。 将向读者介绍卷积神经网络中的各种概念,以及如何将它们用于图像识别。 我们将讨论卷积神经网络中的各个层。 然后,我们将使用这些技术来构建实际应用。
第 21 章,“循环神经网络和其他深度学习模型”
本章将继续涵盖其他类型的深度学习算法。 首先将介绍循环神经网络,然后将介绍较新的算法,例如注意力,自我注意和变压器模型。 本章将介绍使用这些网络的用例以及使用这些模型架构的优势及其局限性。 最后,讨论的技术将用于构建实际应用程序
本章将继续涵盖其他类型的深度学习算法。 首先将介绍循环神经网络,然后将介绍较新的算法,例如注意力,自我注意和变压器模型。 本章将介绍使用这些网络的用例以及使用这些模型架构的优势及其局限性。 最后,讨论的技术将用于构建实际应用。
第 22 章,“通过强化学习创建智能体”
......@@ -118,7 +118,7 @@
# 这本书需要什么
本书侧重于 Python 中的 AI,而不是 Python 本身。 我们已经使用 Python3 来构建各种应用程序。 我们专注于如何以最佳方式利用各种 Python 库来构建实际应用程序。 本着这种精神,我们试图使所有代码尽可能友好和可读。 我们认为,这将使我们的读者能够轻松理解代码并在不同的场景中轻松使用它。
本书侧重于 Python 中的 AI,而不是 Python 本身。 我们已经使用 Python3 来构建各种应用。 我们专注于如何以最佳方式利用各种 Python 库来构建实际应用。 本着这种精神,我们试图使所有代码尽可能友好和可读。 我们认为,这将使我们的读者能够轻松理解代码并在不同的场景中轻松使用它。
## 使用的约定
......
# 1 人工智能简介
在本章中,我们将讨论**人工智能****AI**)的概念及其在现实世界中的应用。 我们在日常生活中花费了大量时间与智能系统进行交互。 这可以采取以下形式:在互联网上搜索某些内容,进行生物特征识别的面部识别或将口语单词转换为文本。 人工智能是这一切的核心,它正在成为我们现代生活方式的重要组成部分。 所有这些系统都是复杂的实际应用程序,而 AI 通过数学和算法解决了这些问题。 在整本书中,我们将学习可用于构建此类应用程序的基本原理。 我们的总体目标是使您能够应对日常生活中可能遇到的具有挑战性的新 AI 问题。
在本章中,我们将讨论**人工智能****AI**)的概念及其在现实世界中的应用。 我们在日常生活中花费了大量时间与智能系统进行交互。 这可以采取以下形式:在互联网上搜索某些内容,进行生物特征识别的面部识别或将口语单词转换为文本。 人工智能是这一切的核心,它正在成为我们现代生活方式的重要组成部分。 所有这些系统都是复杂的实际应用,而 AI 通过数学和算法解决了这些问题。 在整本书中,我们将学习可用于构建此类应用的基本原理。 我们的总体目标是使您能够应对日常生活中可能遇到的具有挑战性的新 AI 问题。
到本章末,您将了解:
......@@ -169,7 +169,7 @@
在计算机科学内部,有一个名为**认知模型**的研究领域,该领域致力于模拟人类的思维过程。 它试图了解人类如何解决问题。 它需要进入解决问题过程的思维过程,并将其转变为软件模型。 然后可以使用此模型来模拟人类行为。
认知建模用于各种 AI 应用程序,例如深度学习,专家系统,自然语言处理,机器人等。
认知建模用于各种 AI 应用,例如深度学习,专家系统,自然语言处理,机器人等。
# 建立理性智能体
......@@ -210,7 +210,7 @@
操作员要注意条件以及影响条件的一切。 它由行动,前提条件和采取行动引起的变化组成。 在这种情况下,操作就是向杂货店捐款。 当然,这首先要取决于您有钱,这是前提。 通过给他们钱,您正在改变您的金钱状况,这将导致您得到牛奶。
如果您可以像我们刚才那样解决问题,GPS 将会起作用。 限制在于它使用搜索过程来执行其工作,这对于任何有意义的现实应用程序而言都过于复杂且耗时。
如果您可以像我们刚才那样解决问题,GPS 将会起作用。 限制在于它使用搜索过程来执行其工作,这对于任何有意义的现实应用而言都过于复杂且耗时。
在本节中,我们了解了什么是理性主体。 现在,让我们学习如何使这些理性主体更加智能和有用。
......@@ -228,7 +228,7 @@
在前面的示例中,智能体依赖于学习模型来运行推理引擎。 传感器感知到输入后,会将其发送到特征提取模块。 一旦提取了相关特征,训练有素的推理引擎将基于学习模型执行预测。 该学习模型是使用机器学习构建的。 然后,推理引擎做出决定并将其发送给执行器,执行器随后在现实世界中采取所需的操作。
今天存在许多机器学习的应用程序。 它用于图像识别,机器人技术,语音识别,预测股市行为等。 为了理解机器学习并构建完整的解决方案,您将必须熟悉来自不同领域的许多技术,例如模式识别,人工神经网络,数据挖掘, 统计等。 上。
今天存在许多机器学习的应用。 它用于图像识别,机器人技术,语音识别,预测股市行为等。 为了理解机器学习并构建完整的解决方案,您将必须熟悉来自不同领域的许多技术,例如模式识别,人工神经网络,数据挖掘, 统计等。 上。
## 模型类型
......@@ -396,6 +396,6 @@ scikit-learn 包中还有可用的图像数据集。 每个图像的形状均为
* 如何使用机器学习开发智能体
* 不同类型的机器学习模型
我们还介绍了如何在各种操作系统上安装 Python3,以及如何安装构建 AI 应用程序所需的必要软件包。 我们讨论了如何使用这些包来加载 scikit-learn 中可用的数据。
我们还介绍了如何在各种操作系统上安装 Python3,以及如何安装构建 AI 应用所需的必要软件包。 我们讨论了如何使用这些包来加载 scikit-learn 中可用的数据。
在下一章中,我们将学习监督学习以及如何建立分类和回归模型。
\ No newline at end of file
......@@ -44,7 +44,7 @@
* 预订酒店
* 预订餐厅
所有这些平台还支持第三方开发人员来开发自己的应用程序或被 Amazon 称为的“技能”。 因此,可能性是无限的。
所有这些平台还支持第三方开发人员来开发自己的应用或被 Amazon 称为的“技能”。 因此,可能性是无限的。
现有 Alexa 技能的一些示例:
......@@ -331,7 +331,7 @@ iRobot 于 1990 年由 Rodney Brooks,Colin Angle 和 Helen Greiner 在麻省
使用 3D 相机和手套,它可以记录人类厨师做饭的情况,然后将详细的步骤和说明上载到存储库中。 然后使用手势识别模型将厨师的动作转换为机器人动作。 这些模型是与斯坦福大学和卡内基梅隆大学合作创建的。 之后,Moley 可以重复相同的步骤,并从头开始烹饪完全相同的餐点。
在当前的原型中,用户可以使用触摸屏或智能手机应用程序对其进行操作,并预先准备好配料并将其放置在预设位置。 该公司的长期目标是允许用户从 2000 多种食谱中轻松选择一个选项,Moley 会在几分钟内准备好餐点。
在当前的原型中,用户可以使用触摸屏或智能手机应用对其进行操作,并预先准备好配料并将其放置在预设位置。 该公司的长期目标是允许用户从 2000 多种食谱中轻松选择一个选项,Moley 会在几分钟内准备好餐点。
# 游戏
......@@ -377,7 +377,7 @@ Watson 的软件架构使用:
**国际象棋**
我们许多人都记得 1996 年 Deep Blue 击败国际象棋大师 Gary Kasparov 时的新闻。Deep Blue 是 IBM 创建的国际象棋应用程序
我们许多人都记得 1996 年 Deep Blue 击败国际象棋大师 Gary Kasparov 时的新闻。Deep Blue 是 IBM 创建的国际象棋应用。
在第一轮比赛中,深蓝赢得了对阵加里·卡斯帕罗夫的第一场比赛。 但是,他们原定要打六场比赛。 卡斯帕罗夫(Kasparov)在接下来的五场比赛中赢得了三场胜利,并赢得了其中的两场,从而以 4–2 的比分击败了深蓝。
......@@ -415,7 +415,7 @@ AlphaGo 及其继任者使用蒙特卡洛树搜索算法,基于先前通过机
Deepfake 是术语“深度学习”和`fake`的混合。 这是一种合并视频图像的 AI 技术。 常见的应用是将某人的脸重叠到另一张上。 它的一个邪恶版本被用来与著名人物合并色情场景或创建复仇色情片。 Deepfake 还可以用于创建虚假新闻或恶作剧。 可以想象,如果滥用该技术,将会对社会产生严重影响。
中国一家名为 Momo 的公司开发了类似软件的最新版本,后者开发了一个名为 *Zao* 的应用程序。 它使您可以将某人的脸重叠在诸如 Titanic 之类的短片上,效果令人印象深刻。 此应用程序和其他类似应用程序毫无争议。 隐私团体抱怨说,按照用户协议条款提交给网站的照片将成为 Momo 的财产,然后可用于其他应用程序
中国一家名为 Momo 的公司开发了类似软件的最新版本,后者开发了一个名为 *Zao* 的应用。 它使您可以将某人的脸重叠在诸如 Titanic 之类的短片上,效果令人印象深刻。 此应用和其他类似应用毫无争议。 隐私团体抱怨说,按照用户协议条款提交给网站的照片将成为 Momo 的财产,然后可用于其他应用
有趣的是,技术在该领域将如何继续发展。
......
......@@ -319,8 +319,8 @@
* **CPU 利用率**:识别峰值以及是否可以解释峰值。
* **内存使用情况**:正在消耗多少内存。
* **磁盘使用率**:我们的应用程序消耗了多少磁盘空间。
* **网络 I/O 流量**:如果我们的应用程序跨越实例,则衡量网络流量非常重要。
* **磁盘使用率**:我们的应用消耗了多少磁盘空间。
* **网络 I/O 流量**:如果我们的应用跨越实例,则衡量网络流量非常重要。
* **延迟**:发生数据传输所花费的时间。
* **吞吐量**:成功传输的数据量。
......
......@@ -174,7 +174,7 @@ plt.show()
## 使用均值漂移算法估计群集数
**均值漂移**是用于无监督学习的功能强大的算法。 这是一种经常用于聚类的非参数算法。 它是非参数的,因为它不对基础分布进行任何假设。 这与参量技术形成对比,参量技术假定基础数据遵循标准概率分布。 MeanShift 在对象跟踪和实时数据分析等领域中找到了许多应用程序
**均值漂移**是用于无监督学习的功能强大的算法。 这是一种经常用于聚类的非参数算法。 它是非参数的,因为它不对基础分布进行任何假设。 这与参量技术形成对比,参量技术假定基础数据遵循标准概率分布。 MeanShift 在对象跟踪和实时数据分析等领域中找到了许多应用。
在均值漂移算法中,整个特征空间被视为概率密度函数。 我们从训练数据集开始,并假设它是从概率密度函数中采样的。
......
......@@ -1106,7 +1106,7 @@ if __name__ == "__main__":
图 14:五个流派(佩德罗·多明戈斯)
从一开始,GP 就取得了各种各样的进步。 涵盖 GP 数千种应用程序的文献包含许多成功应用 GP 的用例。 详尽地涵盖该列表将超出本书的范围,但是我们在此处列出了一些更重要的列表。
从一开始,GP 就取得了各种各样的进步。 涵盖 GP 数千种应用的文献包含许多成功应用 GP 的用例。 详尽地涵盖该列表将超出本书的范围,但是我们在此处列出了一些更重要的列表。
在这里,我们开始讨论 GP 已成功应用的一般问题的讨论,然后回顾 GP 每个主要应用领域的代​​表性子集。 根据多年来不同研究人员的经验,GP 做得好的领域包括:
......@@ -1132,7 +1132,7 @@ GP 在近似解决方案可以接受或最佳解决方案的情况下效果很
已发现 GP 在技术努力往往集中在经济重要性较高的领域中效果很好。 在这些领域中,以前的研究人员可能花费了大量时间和精力,并且“最新技术”趋于先进。 在这种情况下,很难改善当前的解决方案。 但是,在这些相同的领域中,小的改进可能非常有价值。 在这种情况下,GP 有时会做出很小但有价值的贡献。 例如石油探索,材料管理和财务应用。
现在,让我们看一下 GA 和 GP 的一些特定于行业的应用程序
现在,让我们看一下 GA 和 GP 的一些特定于行业的应用:
**电影**
......@@ -1175,7 +1175,7 @@ GP 算法广泛用于金融交易,时间序列预测和经济建模领域;
在本节中,我们将从头开始,并访问一些示例。 在这一领域特别杰出的研究人员是陈胜雄。 Chen 写了 60 多篇关于在金融和经济学中使用 GP 的论文。 他最近的一些论文研究了股票市场中的代理人建模(Chen 和 Liao,2005),博弈论(Chen,Duffy 和 Yeh,2002),标准普尔 500 指数交易规则的演变(Yu 和 Chen,2004)。 并预测了恒生指数(Chen,Wang 和 Zhang,1999 年)。
**其他应用程序**
**其他应用**
**优化**:GA 和 GP 通常用于优化问题,在给定目标函数的情况下,必须在一组约束条件下将值最大化或最小化。
......@@ -1191,7 +1191,7 @@ GP 算法广泛用于金融交易,时间序列预测和经济建模领域;
**图像处理**:GA 也用于各种数字图像处理(DIP)任务,例如密集像素匹配。
**调度应用程序**:GA 可用于解决许多调度问题,尤其是时间表问题。 简而言之,当我们拥有一组资源,一组活动以及活动与资源之间的依赖关系时,就会发生时间表问题。 一个例子是在我们有教室,教授和学生的大学中的课程表,并且在练习结束时,希望很大比例的学生能够参加他们想参加的所有课程。
**调度应用**:GA 可用于解决许多调度问题,尤其是时间表问题。 简而言之,当我们拥有一组资源,一组活动以及活动与资源之间的依赖关系时,就会发生时间表问题。 一个例子是在我们有教室,教授和学生的大学中的课程表,并且在练习结束时,希望很大比例的学生能够参加他们想参加的所有课程。
**参数化设计**:GA 已用于通过更改参数和发展更好的解决方案来设计车辆,机械和飞机。
......@@ -1201,7 +1201,7 @@ GP 算法广泛用于金融交易,时间序列预测和经济建模领域;
**旅行商问题(TSP)**:遗传算法已用于解决 TSP 及其所有相关应用,例如车辆路线和机器人轨迹问题,这是一种使用新颖交叉法和包装策略的广为人知的组合我呢提。
希望 GP 和 GA 的广泛而多样的应用为您所熟悉。 也许您将能够提出自己独特的应用程序,并利用获得的知识来推动该领域的发展。
希望 GP 和 GA 的广泛而多样的应用为您所熟悉。 也许您将能够提出自己独特的应用,并利用获得的知识来推动该领域的发展。
# 总结
......
此差异已折叠。
......@@ -442,7 +442,7 @@ class GameController(TwoPlayersGame):
return -100 if self.loss_condition() else 0
```
定义`main`函数并从定义算法开始。 然后,这两种算法将相互竞争。 Negamax 将用于第一个计算机播放器,`SSS*`算法将用于第二个计算机播放器`SSS*`是一种搜索算法,它通过以最佳优先方式遍历树来进行状态空间搜索。 两种方法都将事先考虑的匝数作为输入参数。 在这种情况下,让我们同时使用`5`
定义`main`函数并从定义算法开始。 然后,这两种算法将相互竞争。 Negamax 将用于第一个计算机玩家,`SSS*`算法将用于第二个计算机玩家`SSS*`是一种搜索算法,它通过以最佳优先方式遍历树来进行状态空间搜索。 两种方法都将事先考虑的匝数作为输入参数。 在这种情况下,让我们同时使用`5`
```py
if __name__ == '__main__':
......
......@@ -23,9 +23,9 @@
自由处理-形式自然语言最具挑战性的之一是数量众多。 上下文在句子的理解中起着非常重要的作用。 人类天生善于理解语言。 尚不清楚人类如何轻松而直观地理解语言。 我们利用我们过去的知识和经验来理解对话,即使在几乎没有明确上下文的情况下,我们也可以迅速了解其他人在谈论什么。
为了解决这个问题,NLP 研究人员开始使用机器学习方法来开发各种应用程序。 为了构建这样的应用程序,需要获取大量的文本,然后在该数据上训练算法以执行各种任务,例如对文本进行分类,分析情感和对主题进行建模。 对算法进行训练,以检测输入文本数据中的模式并从中获取见解。
为了解决这个问题,NLP 研究人员开始使用机器学习方法来开发各种应用。 为了构建这样的应用,需要获取大量的文本,然后在该数据上训练算法以执行各种任务,例如对文本进行分类,分析情感和对主题进行建模。 对算法进行训练,以检测输入文本数据中的模式并从中获取见解。
在本章中,我们将讨论用于分析文本和构建 NLP 应用程序的各种基础概念。 这将使我们了解如何从给定的文本数据中提取有意义的信息。 我们将使用称为**自然语言工具包****NLTK**)的 Python 软件包来构建这些应用程序。 您可以通过运行以下命令来安装它:
在本章中,我们将讨论用于分析文本和构建 NLP 应用的各种基础概念。 这将使我们了解如何从给定的文本数据中提取有意义的信息。 我们将使用称为**自然语言工具包****NLTK**)的 Python 软件包来构建这些应用。 您可以通过运行以下命令来安装它:
```py
$ pip3 install nltk
......@@ -46,7 +46,7 @@ $ python3
>>> nltk.download()
```
在本章中,我们还将使用名为`gensim`的软件包。 `gensim`是健壮的语义建模库,对许多应用程序都非常有用。 可以通过运行以下命令来安装它:
在本章中,我们还将使用名为`gensim`的软件包。 `gensim`是健壮的语义建模库,对许多应用都非常有用。 可以通过运行以下命令来安装它:
```py
$ pip3 install gensim
......
......@@ -25,7 +25,7 @@
即使将该技术用于更具建设性的用例,也很难预测该技术在未来几年中将如何发展。 各种各样的研究在某种程度上预测,由于 AI 推动的生产率提高,整个行业将不再需要过去的工人。 货运和运输业以及呼叫中心业是两个“低落的果实”。
过去几年中,语音接口终于突破并渗透到我们的生活中。 Alexa,Siri 和 Google Home 之类的应用程序已开始嵌入我们的生活和文化中。 此外,微信,Facebook Messenger,WhatsApp 和 Slack 等消息传递平台为企业与人互动创造了机会,并有可能通过这些互动获利。 这些消息传递平台变得如此流行和普及,以至于 2019 年,四大服务比四大社交网络平台拥有更多的活跃用户(41 亿对 34 亿)。
过去几年中,语音接口终于突破并渗透到我们的生活中。 Alexa,Siri 和 Google Home 之类的应用已开始嵌入我们的生活和文化中。 此外,微信,Facebook Messenger,WhatsApp 和 Slack 等消息传递平台为企业与人互动创造了机会,并有可能通过这些互动获利。 这些消息传递平台变得如此流行和普及,以至于 2019 年,四大服务比四大社交网络平台拥有更多的活跃用户(41 亿对 34 亿)。
呼叫中心在过去几年中已经发生了巨大变化。 随着使用聊天机器人,云计算和语音生物识别技术的不断发展,公司可以改善客户服务并以更少的人员处理更多的电话。
......@@ -33,7 +33,7 @@
这种趋势只会继续加速。 当前,没有人将大多数聊天机器人对话与人类对话混淆。 但是随着它们在未来几年变得更好,它会变得更加自然和流畅。 当我们拨打呼叫中心时,有时至少是,打电话给我们的原因之一是抱怨或发泄,不仅能解决问题。 随着聊天机器人变得越来越好,他们将能够展示出我们所理解的同情和理解。 此外,他们将拥有对您以前所有通话的完全访问权限,并且能够通过记住先前对话的片段来发展历史并建立融洽的关系。
例如,聊天机器人很快就可以记住您提到孩子的名字,下次打电话时问您 Bobby 做得如何。 此外,就像现在一样,当您通过网络,电话应用程序等不同渠道与银行进行通信,或者与分行中的某人交谈时,聊天机器人将能够访问并使用通过其他渠道输入的信息,可以为您提供更好,更快的服务。 再说一次,我们还没有到那儿,但是可能会有一天,我们宁愿打电话给客户服务,而不是使用其他渠道(如在线访问),因为这样会更快更有效。 举例来说,我确实发现自己越来越多地使用 Alexa,并且对她的功能和怪癖也越来越熟悉和熟悉。 我仍在努力使她动摇,但尚未实现。
例如,聊天机器人很快就可以记住您提到孩子的名字,下次打电话时问您 Bobby 做得如何。 此外,就像现在一样,当您通过网络,电话应用等不同渠道与银行进行通信,或者与分行中的某人交谈时,聊天机器人将能够访问并使用通过其他渠道输入的信息,可以为您提供更好,更快的服务。 再说一次,我们还没有到那儿,但是可能会有一天,我们宁愿打电话给客户服务,而不是使用其他渠道(如在线访问),因为这样会更快更有效。 举例来说,我确实发现自己越来越多地使用 Alexa,并且对她的功能和怪癖也越来越熟悉和熟悉。 我仍在努力使她动摇,但尚未实现。
不仅与 Alexa 一起,而且与其他智能家居助手一起,我们许多人使用它们来:
......@@ -55,11 +55,11 @@ Google Duplex 是一个很好的聊天机器人听起来很自然的有力例子
毫无疑问,聊天机器人将是多产的—在我们的家中,在我们的汽车中,在可穿戴设备中,在呼叫中心以及在电话中。 根据一项估计,聊天机器人的全球市场预计将从 2019 年的 42 亿美元增长到 2024 年的 157 亿美元,年复合增长率为 30.2%。 与其他技术一样,使用该技术成长的年轻人永远不会知道没有聊天机器人为我们服务并改善我们的生活会是什么样子。
本节讨论了聊天机器人在未来几年内的外观。 在下一节中,我们将回到现实,并就如何利用现有的聊天机器人技术使用当今可用的工具创建出色的应用程序提供一些建议。
本节讨论了聊天机器人在未来几年内的外观。 在下一节中,我们将回到现实,并就如何利用现有的聊天机器人技术使用当今可用的工具创建出色的应用提供一些建议。
# 今天的聊天机器人
在的上一节中,我们讨论了随着人工智能技术的发展,未来几年可能实现的目标。 与任何技术一样,我们不应该等到一切都变得完美为止。 在本节以及本章的其余部分,我们将重点介绍当今可行的方法以及使您自己的应用程序尽可能有用和用户友好的最佳实践。
在的上一节中,我们讨论了随着人工智能技术的发展,未来几年可能实现的目标。 与任何技术一样,我们不应该等到一切都变得完美为止。 在本节以及本章的其余部分,我们将重点介绍当今可行的方法以及使您自己的应用尽可能有用和用户友好的最佳实践。
为了利用当今可用的现有技术,并且鉴于仍然需要使用域数据和特定意图来对当前的聊天机器人进行专门编程,因此,我们应该谨慎设计一个好的设计和好的计划来对我们的聊天机器人进行编程。 从为聊天机器人明确定义的目标开始,避免尝试提出广泛的解决方案。 当前,与定义为“万事通”的聊天机器人相比,在定义明确且狭窄的域空间中发挥作用的聊天机器人具有更好的表现和有用的机会。 设计用于在在线商务体验期间提供支持的聊天机器人不能用于诊断汽车问题,而必须在该域中重新编程。 将聊天机器人明确地放在特定的目标和空间上,这样很可能会为用户创造更好的体验。
......@@ -163,7 +163,7 @@ Google Duplex 是一个很好的聊天机器人听起来很自然的有力例子
**Webhooks**
Webhook 是,HTTP 推送 API 或 Web 回调。 它也称为反向 API,因为一旦事件发生,它就会将数据从应用程序发送到应用程序使用者。 它消除了消费者不断轮询应用程序的需求。
Webhook 是,HTTP 推送 API 或 Web 回调。 它也称为反向 API,因为一旦事件发生,它就会将数据从应用发送到应用使用者。 它消除了消费者不断轮询应用的需求。
既然我们已经介绍了与聊天机器人更好地协作所需的基本概念,让我们考虑如何创建一个有用的,“结构良好”的聊天机器人。
......@@ -320,7 +320,7 @@ print("Fulfillment text:",
在 DialogFlow 中,当调用某些启用了 Webhook 的意图时,将使用 Webhook 从后端获取数据。 来自该意图的信息将传递到 webhook 服务,然后返回响应。
为此,可以使用 **ngrok** 。 ngrok 软件是可用于调用 Webhook 的 Web 隧道工具。 它允许使用本地服务器测试 API 和 Webhooks。 本教程本节中将使用的另一个工具是 **Flask** 。 Flask 是一个轻量级的 Web 框架,可用于创建可调用外部应用程序的 Webhook 服务。 在我们的示例中,将被调用的外部应用程序是 DialogFlow 代理。 要使用 Flask,我们首先需要安装它:
为此,可以使用 **ngrok** 。 ngrok 软件是可用于调用 Webhook 的 Web 隧道工具。 它允许使用本地服务器测试 API 和 Webhooks。 本教程本节中将使用的另一个工具是 **Flask** 。 Flask 是一个轻量级的 Web 框架,可用于创建可调用外部应用的 Webhook 服务。 在我们的示例中,将被调用的外部应用是 DialogFlow 代理。 要使用 Flask,我们首先需要安装它:
```py
$ pip3 install Flask
......@@ -330,7 +330,7 @@ $ pip3 install Flask
**使用 Flask 创建 Webhook**
首先,我们可以创建一个基本的 Flask 应用程序
首先,我们可以创建一个基本的 Flask 应用:
```py
# import flask dependencies
......@@ -350,13 +350,13 @@ if __name__ == '__main__':
app.run()
```
使用以下命令测试应用程序
使用以下命令测试应用:
```py
$ python app.py or FLASK_APP=hello.py flask run
```
如果您看到前面的输出,这将确认该应用程序的初始版本正在运行。 到目前为止,我们仅使用本地服务器,因此其他外部客户端无法通过互联网访问该服务器。 要将其集成为 DialogFlow 的 Webhook,我们需要将其部署在可以通过互联网访问的服务器上。 那就是 ngrok 工具出现的地方。[可以在这里下载该工具](https://ngrok.io)
如果您看到前面的输出,这将确认该应用的初始版本正在运行。 到目前为止,我们仅使用本地服务器,因此其他外部客户端无法通过互联网访问该服务器。 要将其集成为 DialogFlow 的 Webhook,我们需要将其部署在可以通过互联网访问的服务器上。 那就是 ngrok 工具出现的地方。[可以在这里下载该工具](https://ngrok.io)
要运行 ngrok,请使用以下命令:
......
......@@ -33,7 +33,7 @@
* 影响股票价格的因素很多,这使它成为一个非常复杂的系统。
* 股票中一些最剧烈的变动发生在市场交易时间之外,这使得实时处理这些信息变得困难。
**应用程序日志**:根据定义,应用程序日志具有两个组成部分。 指示操作何时发生以及正在记录信息或错误的时间戳。
**应用日志**:根据定义,应用日志具有两个组成部分。 指示操作何时发生以及正在记录信息或错误的时间戳。
**IoT 活动**:IoT 设备中的活动以时间顺序方式发生,因此可以用作时间的数据。
......
......@@ -53,7 +53,7 @@ OpenCV 可以与 TensorFlow,PyTorch 和 Caffe 结合使用。
# 帧差分
帧差分是可用于识别视频中运动部分的最简单技术之一。 直观地,在大多数应用程序中,这是有趣的部分所在。 如果我们有一个跑步者的视频,我们可能想分析跑步者的跑步情况,而不是背景图像。 当我们看电影时,我们主要关注最前沿的人物在说话和做事时。 我们不会倾向于关注背景中无聊的相框。
帧差分是可用于识别视频中运动部分的最简单技术之一。 直观地,在大多数应用中,这是有趣的部分所在。 如果我们有一个跑步者的视频,我们可能想分析跑步者的跑步情况,而不是背景图像。 当我们看电影时,我们主要关注最前沿的人物在说话和做事时。 我们不会倾向于关注背景中无聊的相框。
有时候,您会发现一个一次性的极客,会在隐藏在这种背景下的电影中发现问题,正如我们在《权力的游戏》的最新情节中几次看到,有人在背景中发现一杯星巴克,但这是例外而不是规则。
......@@ -186,7 +186,7 @@ if __name__=='__main__':
图 1:轮廓图像
前面的屏幕截图中的白线表示轮廓。 我们取得了什么成就? 为什么这很重要? 根据应用程序的不同,我们可能不需要原始图像提供的所有信息。 原始图像具有更多细节,更多对比度和更多颜色。 让我们以自动驾驶汽车为例。 我们可能不在乎我们前面的车是红色还是绿色。 我们更担心要知道汽车是否正在驶向我们并即将撞向我们。 通过过滤所有额外的不相关信息,它允许系统中的其他算法更有效地处理图像中的相关信息,因此可以更快地对任何潜在的危险做出反应。
前面的屏幕截图中的白线表示轮廓。 我们取得了什么成就? 为什么这很重要? 根据应用的不同,我们可能不需要原始图像提供的所有信息。 原始图像具有更多细节,更多对比度和更多颜色。 让我们以自动驾驶汽车为例。 我们可能不在乎我们前面的车是红色还是绿色。 我们更担心要知道汽车是否正在驶向我们并即将撞向我们。 通过过滤所有额外的不相关信息,它允许系统中的其他算法更有效地处理图像中的相关信息,因此可以更快地对任何潜在的危险做出反应。
这种过滤可能有用的另一个实例是,加载视频的空间有限或成本高昂,我们需要压缩图像并提高空间利用率。 我们将由读者提出其他可能有用的方案,但希望我们能给您足够的灵感,激发您的想象力和创造力。
......@@ -194,7 +194,7 @@ if __name__=='__main__':
# 使用颜色空间跟踪对象
可以使用各种色彩空间来表示图像。 RGB 颜色空间可能是最流行的颜色空间,但不适用于对象跟踪之类的应用程序。 因此,我们将改用 HSV 颜色空间。 这是一种直观的色彩空间模型,更接近于人类对色彩的感知方式。 [您可以在此处了解更多信息](https://en.wikipedia.org/wiki/HSL_and_HSV)
可以使用各种色彩空间来表示图像。 RGB 颜色空间可能是最流行的颜色空间,但不适用于对象跟踪之类的应用。 因此,我们将改用 HSV 颜色空间。 这是一种直观的色彩空间模型,更接近于人类对色彩的感知方式。 [您可以在此处了解更多信息](https://en.wikipedia.org/wiki/HSL_and_HSV)
我们可以将捕获的帧从 RGB 转换为 HSV 颜色空间,然后使用颜色阈值跟踪任何给定的对象。 我们应该注意,我们需要知道对象的颜色分布,以便为阈值选择合适的范围。
......@@ -320,12 +320,12 @@ if __name__=='__main__':
图 3:输出框架
如您在中看到的输出帧,我们现在只在图像中看到一种颜色,它对应于任何皮肤。 其他一切都是黑色的。 与上一节中看到的类似,我们对图像进行了过滤,以仅包含我们感兴趣的信息。在这种情况下,过滤是不同的,但结果是事实是我们现在仅具有进一步处理图像所需的信息。 我想到了一些应用程序
如您在中看到的输出帧,我们现在只在图像中看到一种颜色,它对应于任何皮肤。 其他一切都是黑色的。 与上一节中看到的类似,我们对图像进行了过滤,以仅包含我们感兴趣的信息。在这种情况下,过滤是不同的,但结果是事实是我们现在仅具有进一步处理图像所需的信息。 我想到了一些应用:
* 检测异常皮肤状况或变色。
* 仅在看到人的肤色时才会打开的安全系统。 这可用于人类可能藏在容器中的港口。
您还能想到其他一些应用程序吗? 在下一节中,我们将学习另一种称为背景减法的图像转换技术。
您还能想到其他一些应用吗? 在下一节中,我们将学习另一种称为背景减法的图像转换技术。
# 使用背景减法的对象跟踪
......@@ -1297,7 +1297,7 @@ cv2.destroyAllWindows()
窃听上一节中的想法,我们可以使用在本节中学到的技术为电影(或胡须或胡须等)中的屏幕角色添加眼镜。
我想到的另一个应用程序是跟踪卡车驾驶员的眼睛,并确定他们眨眼或闭上眼睛的速度,以查看他们是否感到疲倦,并要求他们(可能是强迫他们)翻身。
我想到的另一个应用是跟踪卡车驾驶员的眼睛,并确定他们眨眼或闭上眼睛的速度,以查看他们是否感到疲倦,并要求他们(可能是强迫他们)翻身。
本章旨在演示如何在各种应用中使用图像识别。 我们期待您的来信,并结合您自己的想法,学习如何应用本章中学到的技术。
......
......@@ -660,7 +660,7 @@ if __name__=='__main__':
神经网络可以将用于光学字符识别。 它可能是其最常见的用例之一。 将手写体转换为计算机字符一直是许多计算机科学家试图解决的基本问题,但仍然难以捉摸。 我们已经取得了长足的进步,但是,由于显而易见的原因,100% 的准确性仍然遥不可及。 为什么?
考虑这种情况。 您曾经写下任何东西吗?五分钟后,您无法阅读自己的笔迹? 计算机也总是会出现此问题。 写下数字`6`的方法有无数种,其中有些看起来比`6`更像`0``5`。 我可能是错的,但是我认为我们将找到一种治愈癌症的方法,然后才能找到一种可靠的方法来使计算机识别医生的笔迹。 我们已经可以达到很高的准确性,并且*笔迹越漂亮*,阅读起来就越容易。 我们继续尝试解决此问题的原因是,这是一个有价值的目标,具有许多应用程序。 举一个简短的例子,医生的时间受到高度重视。 随着系统能够更好地识别他们的笔记,他们将获得更多的精力来专注于实际治疗和帮助患者的精力,而不再关注文书工作。
考虑这种情况。 您曾经写下任何东西吗?五分钟后,您无法阅读自己的笔迹? 计算机也总是会出现此问题。 写下数字`6`的方法有无数种,其中有些看起来比`6`更像`0``5`。 我可能是错的,但是我认为我们将找到一种治愈癌症的方法,然后才能找到一种可靠的方法来使计算机识别医生的笔迹。 我们已经可以达到很高的准确性,并且*笔迹越漂亮*,阅读起来就越容易。 我们继续尝试解决此问题的原因是,这是一个有价值的目标,具有许多应用。 举一个简短的例子,医生的时间受到高度重视。 随着系统能够更好地识别他们的笔记,他们将获得更多的精力来专注于实际治疗和帮助患者的精力,而不再关注文书工作。
**光学字符识别****OCR**)是识别图像中手写字符的过程。 在构建模型之前,让我们使熟悉数据集。 [我们将使用以下位置提供的数据集](http://ai.stanford.edu/~btaskar/ocr)
......
......@@ -2,7 +2,7 @@
在本章中,我们将学习深度学习和**卷积神经网络****CNN**)。 在过去的几年中,CNN 取得了很大的发展势头,尤其是在图像识别领域。 我们将讨论 CNN 的架构以及内部使用的层的类型。 我们将看到如何使用一个名为 TensorFlow 的软件包。 我们将构建一个基于感知器的线性回归器。 我们将学习如何使用单层神经网络构建图像分类器。
然后,我们将使用 CNN 构建图像分类器。 图像分类器有许多应用。 这是一个奇特的名字,但这只是计算机辨别对象是什么的能力。 例如,您可以构建一个分类器来确定某物是热狗还是非热狗。 这是一个轻松的示例,但是图像分类器也可以使用生死攸关的应用程序。 为嵌入了图像分类软件的无人机拍照,它可以区分平民和敌方战斗人员。 在这种情况下不能犯任何错误。
然后,我们将使用 CNN 构建图像分类器。 图像分类器有许多应用。 这是一个奇特的名字,但这只是计算机辨别对象是什么的能力。 例如,您可以构建一个分类器来确定某物是热狗还是非热狗。 这是一个轻松的示例,但是图像分类器也可以使用生死攸关的应用。 为嵌入了图像分类软件的无人机拍照,它可以区分平民和敌方战斗人员。 在这种情况下不能犯任何错误。
本章涵盖以下主题:
......@@ -21,15 +21,15 @@
我们将让您的想象力疯狂起来,但是使用其中一些生成的“人类”在电影中出演肯定可以制作一部电影。 还有其他研究试图解决这一问题。 给定一个图像,我们可以确定它是 GAN 生成的图像还是真实的人? [您可以在此处浏览该网站](https://thispersondoesnotexist.com/)
要使用它,只需继续刷新页面,它将每次生成一个新图像。 GAN 最初是作为无监督学习的生成模型而创建的。 GAN 还被证明可用于半监督学习,监督学习和强化学习。 AI 的巨头之一 Yann LeCun 称 GAN 是 ML 中最近十年中最有趣的想法[1]。 让我们考虑 GAN 的其他一些用例和应用程序
要使用它,只需继续刷新页面,它将每次生成一个新图像。 GAN 最初是作为无监督学习的生成模型而创建的。 GAN 还被证明可用于半监督学习,监督学习和强化学习。 AI 的巨头之一 Yann LeCun 称 GAN 是 ML 中最近十年中最有趣的想法[1]。 让我们考虑 GAN 的其他一些用例和应用。
**使用 GAN 生成更多示例数据**:数据是 ML 中的组成部分。 在某些情况下,不可能获得足够的数据来馈送到模型。 使用 GAN 生成更多输入数据是生成附加质量数据以馈入模型的好方法。
**安全性**:ML 为许多行业提供了提升。 无论市场部门如何,网络安全始终是企业高管的“首要任务”。 某些安全供应商使用 GAN 来处理网络攻击。 简而言之,GAN 会创建伪造的入侵,然后使用这些入侵来训练模型以识别这些威胁,从而使我们能够阻止这些攻击的真实版本。
**数据操作**:GAN 可用于“伪样式传输”,即,在不完全修改示例的情况下修改示例的某些尺寸。
**数据操作**:GAN 可用于“伪样式迁移”,即,在不完全修改示例的情况下修改示例的某些尺寸。
GAN 可用于语音应用程序。 给定语音,可以训练 GAN 来重现著名的声音。
GAN 可用于语音应用。 给定语音,可以训练 GAN 来重现著名的声音。
在一些著名的例子中,使用 GAN 修改了 Trump,Obama 或 Mona Lisa 的视频,并且开发人员使这些数字说出了他们从未说过的短语。 他们可能是很现实的。 或者可以将视频或图像更改为看起来像不同的人。 这是在麻省理工学院创建的唐纳德·特朗普总统形象之上插入尼古拉斯·凯奇的脸的例子:
......
......@@ -160,7 +160,7 @@ RNN 之所以称为递归,是因为这些算法对序列的每个元素执行
首先,像这样的模型可以用作评分机制。 语言模型可用于选择最可能的下一个单词。 从直觉上讲,最可能出现的下一个单词在语法上可能是正确的。
语言建模具有重要应用程序。 因为它可以预测给定前面单词的单词的概率,所以可以将其用于**自然文本生成****NTG**)。 给定一个现有的单词序列,从概率最高的单词列表中建议一个单词,然后重复该过程,直到生成完整的句子为止。
语言建模具有重要应用。 因为它可以预测给定前面单词的单词的概率,所以可以将其用于**自然文本生成****NTG**)。 给定一个现有的单词序列,从概率最高的单词列表中建议一个单词,然后重复该过程,直到生成完整的句子为止。
注意,在前面的等式中,每个单词的概率以所有先前的单词为条件。 在更实际的情况下,由于计算或内存限制,模型可能很难代表长期依赖关系。 因此,大多数模型通常仅限于仅查看少量的先前单词。
......@@ -471,7 +471,7 @@ RMSE 是方差的平方根。 可以将其解释为无法解释的方差的标
此外,RNN 的计算量很大,因此生成准确的预测可能会花费大量时间。 如果我们无法使用合适的硬件,那几乎是肯定的。
尽管如此,RNN 已经取得了许多突破,并且数据科学界继续不断地为其寻找新的应用程序。 不仅如此,它们的性能和准确性也在不断提高。 到目前为止,我们将提高您已经设计的神经网络的性能和功能,并提出您自己的示例,说明如何将网络应用于其他领域。 快乐的编码。
尽管如此,RNN 已经取得了许多突破,并且数据科学界继续不断地为其寻找新的应用。 不仅如此,它们的性能和准确性也在不断提高。 到目前为止,我们将提高您已经设计的神经网络的性能和功能,并提出您自己的示例,说明如何将网络应用于其他领域。 快乐的编码。
# 总结
......
......@@ -35,7 +35,7 @@ RL 是指学习操作方法并将情况映射到某些动作以最大化回报
# 强化学习的实际示例
让我们看看 RL 在现实世界中出现的位置。 这将帮助我们了解它的工作原理以及使用此可以构建哪些可能的应用程序,除非:
让我们看看 RL 在现实世界中出现的位置。 这将帮助我们了解它的工作原理以及使用此可以构建哪些可能的应用,除非:
**游戏**:让我们考虑一下棋类游戏,例如围棋或象棋。 为了确定最佳动作,玩家需要考虑各种因素。 可能性的数量如此之大,以至于无法进行暴力搜索。 如果我们要使用传统技术制造一台可以玩这种游戏的机器,则需要指定许多规则来涵盖所有这些可能性。 RL 完全绕过了这个问题。 我们不需要手动指定任何逻辑规则。 学习代理仅通过示例学习并与自己玩游戏。
......
......@@ -131,7 +131,7 @@ Google 的工作方式与图书馆卡目录类似,不同之处在于 Google
# 大数据的三个 V
不久以前习惯了在 90 天左右后清除应用程序生成的任何日志。 最近,公司意识到他们正在丢弃信息的金块。 此外,存储已经变得足够便宜,以至于保留这些日志都不费吹灰之力。 而且,云,互联网和技术的普遍发展现在可以创建更多的数据。 从智能手机到 IoT 小工具,工业传感器和监控摄像头,用于存储和传输数据的设备数量在世界范围内呈指数级增长,导致数据量激增。
不久以前习惯了在 90 天左右后清除应用生成的任何日志。 最近,公司意识到他们正在丢弃信息的金块。 此外,存储已经变得足够便宜,以至于保留这些日志都不费吹灰之力。 而且,云,互联网和技术的普遍发展现在可以创建更多的数据。 从智能手机到 IoT 小工具,工业传感器和监控摄像头,用于存储和传输数据的设备数量在世界范围内呈指数级增长,导致数据量激增。
![](img/B15441_23_04.png)
......@@ -239,7 +239,7 @@ MapReduce 实现由一个映射组件和一个归约组件组成,映射组件
Apache Hive 是构建在 Apache Hadoop 之上的数据仓库软件组件,支持数据查询和分析。 Apache Hive 支持类似 SQL 的界面,以获取 Hadoop 支持的各种数据库和文件系统中存储的数据。 如果没有 Hive,则需要实现复杂的 Java 代码以提供必要的 MapReduce 逻辑。 Apache Hive 提供了一种抽象,以支持对底层 Java 的类似 SQL 的查询(HiveQL),而无需实现复杂的低级 Java 代码。
由于大多数数据仓库应用程序都支持基于 SQL 的查询语言,因此 Hive 促进并支持将基于 SQL 的应用程序移植到 Hadoop 中。 Hive 最初是由 Facebook 开发的,但现在已集成到 Hadoop 生态系统中,并被众多财富 500 强公司使用。
由于大多数数据仓库应用都支持基于 SQL 的查询语言,因此 Hive 促进并支持将基于 SQL 的应用移植到 Hadoop 中。 Hive 最初是由 Facebook 开发的,但现在已集成到 Hadoop 生态系统中,并被众多财富 500 强公司使用。
## Apache Spark
......@@ -370,7 +370,7 @@ Avinash Lakshman(亚马逊 DynamoDB 的作者之一)和 Prashant Malik 最
## MongoDB
MongoDB 是面向文档的水平可伸缩数据库。 它使用 JSON 数据格式存储数据。 它通常用于存储网站数据,并且在内容管理和缓存应用程序中也很流行。 它支持复制和高可用性配置,以最大程度地减少数据丢失。
MongoDB 是面向文档的水平可伸缩数据库。 它使用 JSON 数据格式存储数据。 它通常用于存储网站数据,并且在内容管理和缓存应用中也很流行。 它支持复制和高可用性配置,以最大程度地减少数据丢失。
根据查询的类型,它可能是一个高性能的系统。 它是用 C++ 编写的。 它完全支持索引,具有丰富的查询语言,可以进行配置以提供跨数据中心的高可用性。
......@@ -394,6 +394,6 @@ Neo4j 用 Java 实现,并通过交易 HTTP 端点或二进制“螺栓”协
最后,我们了解了大数据实现中常用的另一种技术,即 NoSQL 数据库。 NoSQL 数据库引擎支持财富 500 强公司中许多最大的工作量,并在当今最常见的网站中服务数百万个页面。
对于当今机器学习中存在的所有令人惊奇和令人兴奋的应用程序,我们坚信,我们只是在探索一切可能的事物。 我们衷心希望您能更好地掌握机器学习中涉及的概念,但更重要的是,我们希望您的好奇心得到激发,这本书激发您毕生对这种美丽话题的兴趣。
对于当今机器学习中存在的所有令人惊奇和令人兴奋的应用,我们坚信,我们只是在探索一切可能的事物。 我们衷心希望您能更好地掌握机器学习中涉及的概念,但更重要的是,我们希望您的好奇心得到激发,这本书激发您毕生对这种美丽话题的兴趣。
我们很高兴看到您使用本章,本书中所包含的知识做什么。 希望您发现这本书引人入胜,有趣并且有用。 我们希望您阅读和阅读时一样开心。 我们希望您在所有努力中继续取得成功。
\ No newline at end of file
......@@ -1190,7 +1190,7 @@ for epoch in range(epochs):
y_batch = y[index * batch_size:(index + 1) * batch_size]
```
7. 接下来,使用预训练的生成器网络生成伪造图像:
7. 接下来,使用预训练的生成器网络生成伪造图像:
```py
generated_images = generator.predict_on_batch([z_batch, y_batch])
......@@ -1382,9 +1382,9 @@ TensorBoard 的`GRAPHS`部分包含两个网络的图形。 如果网络性能
年龄综合和年龄发展具有许多工业和消费者应用:
* **跨年龄人脸识别**:可以将其合并到安全应用程序中,例如移动设备解锁或桌面解锁。 当前的面部识别系统的问题在于它们需要随时间更新。 使用 Age-cGAN 网络,跨年龄人脸识别系统的寿命将更长。
* **跨年龄人脸识别**:可以将其合并到安全应用中,例如移动设备解锁或桌面解锁。 当前的面部识别系统的问题在于它们需要随时间更新。 使用 Age-cGAN 网络,跨年龄人脸识别系统的寿命将更长。
* **寻找失落的孩子**:这是 Age-cGAN 的有趣应用。 随着儿童年龄的增长,他们的面部特征会发生变化,并且很难识别它们。 Age-cGAN 可以模拟指定年龄的人的脸。
* **娱乐**:例如,在移动应用程序中,用于显示和共享指定年龄的朋友的照片。
* **娱乐**:例如,在移动应用中,用于显示和共享指定年龄的朋友的照片。
* **电影中的视觉效果**:手动模拟一个人的年龄是一个繁琐而漫长的过程。 Age-cGAN 可以加快此过程并降低创建和模拟人脸的成本。
......
......@@ -689,7 +689,7 @@ def build_discriminator():
我们将使用预训练的 VGG19 网络。 VGG19 网络的目的是提取生成的图像和真实图像的特征图。 在本节中,我们将在 Keras 中使用预训练的权重构建和编译 VGG19 网络:
我们将使用预训练的 VGG19 网络。 VGG19 网络的目的是提取生成的图像和真实图像的特征图。 在本节中,我们将在 Keras 中使用预训练的权重构建和编译 VGG19 网络:
1. 首先指定输入形状:
......@@ -1208,6 +1208,6 @@ TensorBoard 的 GRAPHS 部分包含两个网络的图形。 如果网络性能
在本章中,我们首先介绍 SRGAN。 然后,我们研究了生成器和判别器网络的架构。 后来,我们执行了该项目所需的设置。 然后,我们收集并探索了数据集。 之后,我们在训练 SRGAN 之前先在 Keras 中实现了该项目,评估了训练后的 SRGAN 网络,并使用超参数优化技术对训练后的模型进行了优化。 最后,我们简要介绍了 SRGAN 的一些不同应用。
在下一章中,我们将介绍 StackGAN 及其不同的应用程序
在下一章中,我们将介绍 StackGAN 及其不同的应用。
......@@ -58,7 +58,7 @@
未来几年,我们将看到 GAN 的更多商业应用。 GAN 的许多商业应用已经开发,并给人留下了积极的印象。 例如,移动应用程序 Prisma 是 GAN 最早获得广泛成功的应用程序之一。 我们可能会在不久的将来看到 GAN 的民主化,一旦我们这样做了,我们将开始看到 GAN 改善了我们的日常生活。
未来几年,我们将看到 GAN 的更多商业应用。 GAN 的许多商业应用已经开发,并给人留下了积极的印象。 例如,移动应用 Prisma 是 GAN 最早获得广泛成功的应用之一。 我们可能会在不久的将来看到 GAN 的民主化,一旦我们这样做了,我们将开始看到 GAN 改善了我们的日常生活。
......
......@@ -509,9 +509,9 @@ syn = poisson.rvs(mu, size=2000)
在继续进行更多技术讨论之前,我认为解释 Python 作为本书编程语言的选择会有所帮助。 在过去的十年中,数据科学和机器学习领域的研究呈指数增长,拥有数千篇有价值的论文和数十种完善的工具。 特别是由于 Python 的高效性,美观性和紧凑性,许多研究人员和程序员都选择使用 Python 创建一个完整的科学生态系统,该生态系统已免费发布。
如今,诸如 scikit-learn,SciPy,NumPy,Matplotlib,pandas 之类的软件包代表了数百种可用于生产环境的系统的骨干,并且其使用量还在不断增长。 此外,复杂的深度学习应用程序(例如 Theano,TensorFlow 和 PyTorch)允许每个 Python 用户创建和训练复杂模型而没有任何速度限制。 实际上,必须注意 Python 不再是脚本语言。 它支持许多特定任务(例如,Web 框架和图形),并且可以与用 C 或 C++ 编写的本机代码进行接口。
如今,诸如 scikit-learn,SciPy,NumPy,Matplotlib,pandas 之类的软件包代表了数百种可用于生产环境的系统的骨干,并且其使用量还在不断增长。 此外,复杂的深度学习应用(例如 Theano,TensorFlow 和 PyTorch)允许每个 Python 用户创建和训练复杂模型而没有任何速度限制。 实际上,必须注意 Python 不再是脚本语言。 它支持许多特定任务(例如,Web 框架和图形),并且可以与用 C 或 C++ 编写的本机代码进行接口。
由于这些原因,Python 几乎是所有数据科学项目中的最佳选择,并且由于其功能,所有具有不同背景的程序员都可以轻松地学会在短时间内有效地使用它。 也可以使用其他免费解决方案(例如 R,Java 或 Scala),但是,在 R 的情况下,可以完全涵盖统计和数学函数,但缺少构建完整应用程序所必需的支持框架。 相反,Java 和 Scala 具有完整的可用于生产环境的库生态系统,但是特别是 Java 不像 Python 那样紧凑且易于使用。 而且,对本机代码的支持要复杂得多,并且大多数库都完全依赖 JVM(从而导致性能损失)。
由于这些原因,Python 几乎是所有数据科学项目中的最佳选择,并且由于其功能,所有具有不同背景的程序员都可以轻松地学会在短时间内有效地使用它。 也可以使用其他免费解决方案(例如 R,Java 或 Scala),但是,在 R 的情况下,可以完全涵盖统计和数学函数,但缺少构建完整应用所必需的支持框架。 相反,Java 和 Scala 具有完整的可用于生产环境的库生态系统,但是特别是 Java 不像 Python 那样紧凑且易于使用。 而且,对本机代码的支持要复杂得多,并且大多数库都完全依赖 JVM(从而导致性能损失)。
由于 Scala 的功能特性和 Apache Spark 等框架的存在(可用于执行大数据的机器学习任务),Scala 在大数据全景图中获得了重要的地位。 但是,考虑到所有优点和缺点,Python 仍然是最佳选择,这就是为什么它被选为本书的原因。
......
......@@ -962,10 +962,10 @@ Original entropy: 7.726 bits - Quantized entropy: 5.752 bits
1. 如果两个样本的 Minkowski 距离(`p = 5`)等于 10,那么您能说出它们的曼哈顿距离吗?
2. 对 K 均值的收敛速度产生负面影响的主要因素是数据集的维数。 它是否正确?
3. 可以积极影响 K 均值性能的最重要因素之一是聚类的凸度。 它是否正确?
4. 聚类应用程序的同质性得分等于 0.99。 这是什么意思?
4. 聚类应用的同质性得分等于 0.99。 这是什么意思?
5. 调整后的兰德得分等于 -0.5 是什么意思?
6. 考虑到前面的问题,不同数量的聚类能否产生更好的分数?
7. 基于 KNN 的应用程序平均每分钟需要 100 个 5-NN 基本查询。 每分钟执行 2 个 50-NN 查询(每个查询需要 4 秒,叶子大小为 25),并在紧接其后执行 2 秒的阻塞任务。 假设没有其他延迟,则每分钟叶子大小= 50 可以执行多少个基本查询?
7. 基于 KNN 的应用平均每分钟需要 100 个 5-NN 基本查询。 每分钟执行 2 个 50-NN 查询(每个查询需要 4 秒,叶子大小为 25),并在紧接其后执行 2 秒的阻塞任务。 假设没有其他延迟,则每分钟叶子大小= 50 可以执行多少个基本查询?
8. 球形树结构不适合管理高维数据,因为它遭受了维数的诅咒。 它是否正确?
9. 获得了一个数据集,该数据集从 3 个二维高斯分布中采样了 1,000 个样本:`N([-1.0, 0.0], diag[0.8, 0.2])``N([0.0, 5.0], diag[0.1, 0.1])``N([-0.8, 0.0], diag[0.6, 0.3])`。 集群中最可能的数量是?
......
......@@ -60,7 +60,7 @@
在这两种情况下,结果都是层次结构的形式,其中每个级别都是通过在上一个级别上执行合并或拆分操作来获得的。 复杂度是这两种方法之间的主要区别,因为分裂聚类的复杂度更高。 实际上,合并/拆分决定是通过考虑所有可能的组合并通过选择最合适的组合(根据特定标准)来做出的。 例如,在比较第一步时,很明显(在团聚的情况下)找到最合适的几个样本要比考虑所有可能的组合(在`X`中, 分裂情形),这需要指数级的复杂性。
由于最终结果几乎相同,而除法算法的计算复杂度要高得多,因此,一般而言,没有特别的理由偏爱这种方法。 因此,在本书中,我们将仅讨论聚集聚类(假设所有概念都可立即应用于除法算法)。 我鼓励您始终考虑整个层次结构,即使需要大多数实现(例如 scikit-learn)来指定所需的集群数量。 实际上,在实际的应用程序中,最好是在达到目标后停止该过程,而不是计算整个树。 但是,此步骤是分析阶段的重要组成部分(尤其是在没有很好定义簇数的情况下),我们将演示如何可视化树并针对每个特定问题做出最合理的决策。
由于最终结果几乎相同,而除法算法的计算复杂度要高得多,因此,一般而言,没有特别的理由偏爱这种方法。 因此,在本书中,我们将仅讨论聚集聚类(假设所有概念都可立即应用于除法算法)。 我鼓励您始终考虑整个层次结构,即使需要大多数实现(例如 scikit-learn)来指定所需的集群数量。 实际上,在实际的应用中,最好是在达到目标后停止该过程,而不是计算整个树。 但是,此步骤是分析阶段的重要组成部分(尤其是在没有很好定义簇数的情况下),我们将演示如何可视化树并针对每个特定问题做出最合理的决策。
......@@ -90,7 +90,7 @@
![](img/3e160312-31e8-4484-bd90-4697761fa04f.png)
`P`是对称的,所有对角元素均为空。 因此,某些应用程序(例如 SciPy 的`pdist`函数)会产生一个压缩矩阵`P[c]`,这是一个仅包含矩阵上三角部分的向量`P[c]`的第`ij`元素对应于`d(x[i], x[j])`
`P`是对称的,所有对角元素均为空。 因此,某些应用(例如 SciPy 的`pdist`函数)会产生一个压缩矩阵`P[c]`,这是一个仅包含矩阵上三角部分的向量`P[c]`的第`ij`元素对应于`d(x[i], x[j])`
下一步是定义合并策略,在这种情况下,该策略称为**链接**。 链接方法的目标是找出必须在层次结构的每个级别合并为单个群集的群集。 因此,它必须与代表群集的通用样本集一起使用。 在这种情况下,假设我们正在分析几个群集`(c[a], c[b])`,并且我们需要找到哪个索引`a``b`对应于将要合并的对。
......@@ -144,7 +144,7 @@
平均链接的示例。 选择`C[1]``C[2]`进行合并。 突出显示的点是平均值。
平均链接在生物信息学应用程序(定义层次聚类的主要环境)中特别有用。 对其属性的数学解释是不平凡的,我鼓励您查看原始论文(《一种评估系统关系的统计方法》),以获取更多详细信息。
平均链接在生物信息学应用(定义层次聚类的主要环境)中特别有用。 对其属性的数学解释是不平凡的,我鼓励您查看原始论文(《一种评估系统关系的统计方法》),以获取更多详细信息。
......@@ -234,7 +234,7 @@ plt.show()
易于理解,聚集从选择最相似的簇/样本开始,然后通过添加*最近邻*,直到到达树的根为止。 在我们的情况下,在相异度等于 2.0 的情况下,已检测到三个定义明确的簇。 左一个也保留在下一个剪切中,而右两个(显然更靠近)被选择合并以生成单个簇。 该过程本身很简单,不需要特别的解释。 但是,有两个重要的考虑因素。
第一个是树状图结构本身固有的。 与其他方法相反,层次聚类允许观察整个聚类树,当需要通过增加不相似度来显示流程如何演变时,此功能非常有用。 例如,产品推荐器应用程序无法提供有关代表用户的所需群集数量的任何信息,但是执行管理层可能会对理解合并过程的结构和演变方式感兴趣。
第一个是树状图结构本身固有的。 与其他方法相反,层次聚类允许观察整个聚类树,当需要通过增加不相似度来显示流程如何演变时,此功能非常有用。 例如,产品推荐器应用无法提供有关代表用户的所需群集数量的任何信息,但是执行管理层可能会对理解合并过程的结构和演变方式感兴趣。
实际上,观察群集是如何合并的可以深入了解底层的几何,还可以发现哪些群集可能被视为较大群集的一部分。 在我们的示例中,在级别 0.5 处,我们有一个小的簇{ 1 , 3 }。 问题是“可以通过增加不相似性将哪些样本添加到该群集中?” 可以立即用{ 2 }回答。 当然,在这种情况下,这是一个微不足道的问题,可以通过查看数据图来解决,但是对于高维数据集,如果没有树状图的支持,它可能会变得更加困难。
......
......@@ -224,7 +224,7 @@ print(W[:, im])
在这种情况下,每个样本在每个高斯下始终具有非零概率,其影响取决于其均值和协方差矩阵。 例如,对应于`x`-位置的点 2.5 既可以属于中央高斯,也可以属于右手的点(而左手的影响最小)。 如本章开头所述,通过选择影响最大的组件(`argmax`),可以将任何软聚类算法转换为硬聚类算法。
您将立即理解,在这种特定情况下,对于对角协方差矩阵,`argmax` 提供了一条附加信息(该信息已被 K 均值完全丢弃),可用于进一步的处理步骤(即, 推荐器应用程序可以提取所有群集的主要特征,然后根据相对概率对它们进行加权。
您将立即理解,在这种特定情况下,对于对角协方差矩阵,`argmax` 提供了一条附加信息(该信息已被 K 均值完全丢弃),可用于进一步的处理步骤(即, 推荐器应用可以提取所有群集的主要特征,然后根据相对概率对它们进行加权。
......
......@@ -294,7 +294,7 @@ Epoch 600) Average loss per sample: 0.4635812330245972 (Code mean: 0.42368677258
自编码器的一个非常有用的应用程序并不严格取决于它们查找低维表示形式的能力,而是依赖于从输入到输出的转换过程。 特别地,我们假设一个零中心数据集`X`和一个嘈杂的版本,其样本具有以下结构:
自编码器的一个非常有用的应用并不严格取决于它们查找低维表示形式的能力,而是依赖于从输入到输出的转换过程。 特别地,我们假设一个零中心数据集`X`和一个嘈杂的版本,其样本具有以下结构:
![](img/6b4e6663-04c2-47c6-af95-153f0cefa172.png)
......@@ -1049,7 +1049,7 @@ DBN 是基于 RBM 的堆叠模型。 下图显示了通用结构:
![](img/ee120b1c-ad77-481c-9f39-0d90a1f6c72c.png)
当然,必须向后重复此过程,直到到达实际的输入层为止。 DBN 非常强大(例如,在天体物理学领域有一些科学应用程序),即使它们的结构不像其他更新的模型那样灵活。 但是,复杂度通常较高,因此,我总是建议从较小的模型开始,仅在最终精度不足以满足特定目的的情况下才增加层和/或神经元的数量。
当然,必须向后重复此过程,直到到达实际的输入层为止。 DBN 非常强大(例如,在天体物理学领域有一些科学应用),即使它们的结构不像其他更新的模型那样灵活。 但是,复杂度通常较高,因此,我总是建议从较小的模型开始,仅在最终精度不足以满足特定目的的情况下才增加层和/或神经元的数量。
......
......@@ -662,7 +662,7 @@ with graph.as_default():
minimize(loss=loss_g, var_list=variables_g)
```
通常,第一步是声明占位符,该占位符与 DCGAN 相同。 但是,由于已经针对 64×64 图像优化了模型(特别是卷积或转置卷积的序列),因此我们将使用`tf.image.resize_images()`方法来调整原始样本的大小。 此操作将导致有限的质量损失; 因此,在生产应用程序中,我强烈建议您使用针对原始输入尺寸优化的模型。 在生成器和注释器都声明之后(如我们在上一个示例中讨论的那样,由于需要分别优化损失函数,因此我们需要两个实例共享相同的变量),我们可以设置损失。 在这种情况下,它们的计算非常简单且快速,但是我们为此付出了代价,并为此网络可以应用更小的校正。 实际上,在这种情况下,我们并没有直接最小化批评者损失函数; 相反,我们首先使用算子`optimizer_c`计算并应用梯度,然后使用算子`training_step_c`裁剪所有评论者变量。 因为我们只想调用此运算符,所以已在使用指令`tf.control_dependencies([optimizer_c])`定义的上下文中声明了它。 这样,当请求一个会话来计算`traning_step_c`时,TensorFlow 将注意首先运行`optimizer_c`,但是只有在结果准备好后,才会执行 main 命令(简单地裁剪变量)。 正如我们在理论中所解释的那样,此步骤对于保证评论者仍然具有 L-Lipschitz 函数是必要的,因此,允许使用从 Kantorovich-Rubinstein 定理得到的简化 Wasserstein 距离表达式。
通常,第一步是声明占位符,该占位符与 DCGAN 相同。 但是,由于已经针对 64×64 图像优化了模型(特别是卷积或转置卷积的序列),因此我们将使用`tf.image.resize_images()`方法来调整原始样本的大小。 此操作将导致有限的质量损失; 因此,在生产应用中,我强烈建议您使用针对原始输入尺寸优化的模型。 在生成器和注释器都声明之后(如我们在上一个示例中讨论的那样,由于需要分别优化损失函数,因此我们需要两个实例共享相同的变量),我们可以设置损失。 在这种情况下,它们的计算非常简单且快速,但是我们为此付出了代价,并为此网络可以应用更小的校正。 实际上,在这种情况下,我们并没有直接最小化批评者损失函数; 相反,我们首先使用算子`optimizer_c`计算并应用梯度,然后使用算子`training_step_c`裁剪所有评论者变量。 因为我们只想调用此运算符,所以已在使用指令`tf.control_dependencies([optimizer_c])`定义的上下文中声明了它。 这样,当请求一个会话来计算`traning_step_c`时,TensorFlow 将注意首先运行`optimizer_c`,但是只有在结果准备好后,才会执行 main 命令(简单地裁剪变量)。 正如我们在理论中所解释的那样,此步骤对于保证评论者仍然具有 L-Lipschitz 函数是必要的,因此,允许使用从 Kantorovich-Rubinstein 定理得到的简化 Wasserstein 距离表达式。
当图形完全定义后,可以创建一个会话并初始化所有变量,如下所示:
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
......@@ -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 代码以访问经过训练的网络并进行多个推理。 总而言之,我们将在本章介绍以下主题:
* 图片字幕-工作原理
* 训练和冻结图像字幕模型
......@@ -18,7 +18,7 @@
# 图片字幕-工作原理
# 图像字幕 -- 工作原理
......@@ -84,7 +84,7 @@ bazel-bin/im2txt/download_and_preprocess_mscoco "${MSCOCO_DIR}"
`download_and_preprocess_mscoco`脚本完成后,您将在`$MSCOCO_DIR`文件夹中看到所有 TFRecord 格式的训练,验证和测试数据文件。
`$MSCOCO_DIR`文件夹中还生成了一个名为`word_counts.txt` 的文件。 它总共有 11,518 个单词,每行包含一个单词,一个空格以及该单词出现在数据集中的次数。 文件中仅保存计数等于或大于 4 的单词。 还保存特殊词,例如句子的开头和结尾(分别表示为`<S>``</S>` )。 稍后,您将看到我们如何在 iOS 和 Android 应用程序中专门使用和解析文件来生成字幕。
`$MSCOCO_DIR`文件夹中还生成了一个名为`word_counts.txt` 的文件。 它总共有 11,518 个单词,每行包含一个单词,一个空格以及该单词出现在数据集中的次数。 文件中仅保存计数等于或大于 4 的单词。 还保存特殊词,例如句子的开头和结尾(分别表示为`<S>``</S>` )。 稍后,您将看到我们如何在 iOS 和 Android 应用中专门使用和解析文件来生成字幕。
3. 通过运行以下命令来获取 Inception v3 检查点文件:
......@@ -180,7 +180,7 @@ Captions for image COCO_val2014_000000224477.jpg:
* `--output_graph`:冻结模型文件的路径–这是在移动设备上使用的路径。
* `--output_node_names`:输出节点名称列表,以逗号分隔,告诉`freeze_graph`工具冻结模型中应包括模型的哪一部分和权重,因此生成特定输出不需要的节点名称和权重将保留。
因此,对于该模型,我们如何找出必备的输出节点名称以及输入节点名称,这些对推理也至关重要,正如我们在上一章的 iOS 和 Android 应用程序中所见到的那样? 因为我们已经使用`run_inference`脚本来生成测试图像的标题,所以我们可以看到它是如何进行推理的。
因此,对于该模型,我们如何找出必备的输出节点名称以及输入节点名称,这些对推理也至关重要,正如我们在上一章的 iOS 和 Android 应用中所见到的那样? 因为我们已经使用`run_inference`脚本来生成测试图像的标题,所以我们可以看到它是如何进行推理的。
转到您的 im2txt 源代码文件夹`models/research/im2txt/im2txt`:您可能想在一个不错的编辑器(例如 Atom 或 Sublime Text)中打开它,[或者在 Python IDE(例如 PyCharm)中打开它](https://github.com/tensorflow/models/tree/master/research/im2txt/im2txt)。 在`run_inference.py`中,对`inference_utils/inference_wrapper_base.py`中的`build_graph_from_config`进行了调用,在`inference_wrapper.py`中调用了`build_model`,在`show_and_tell_model.py`中进一步调用了`build`方法。 最后,`build`方法将调用`build_input`方法,该方法具有以下代码:
......@@ -383,7 +383,7 @@ x[:6]
u'ExpandDims_1']
```
如果我们在 iOS 或 Android 应用程序中使用新的模型文件`image2text_frozen_stripped.pb`,则`No OpKernel was registered to support Op 'DecodeJpeg' with these attrs.` 肯定会消失。 但是发生另一个错误, `Not a valid TensorFlow Graph serialization: Input 0 of node ExpandDims_6 was passed float from input_feed:0 incompatible with expected int64`。 如果您通过名为 TensorFlow for Poets 2 的[不错的 Google TensorFlow 代码实验室](https://codelabs.developers.google.com/codelabs/tensorflow-for-poets-2),可能会想起来,还有另一个名为`optimize_for_inference`的工具,其功能类似于`strip_unused`,并且可以很好地用于代码实验室中的图像分类任务。 您可以像这样运行它:
如果我们在 iOS 或 Android 应用中使用新的模型文件`image2text_frozen_stripped.pb`,则`No OpKernel was registered to support Op 'DecodeJpeg' with these attrs.` 肯定会消失。 但是发生另一个错误, `Not a valid TensorFlow Graph serialization: Input 0 of node ExpandDims_6 was passed float from input_feed:0 incompatible with expected int64`。 如果您通过名为 TensorFlow for Poets 2 的[不错的 Google TensorFlow 代码实验室](https://codelabs.developers.google.com/codelabs/tensorflow-for-poets-2),可能会想起来,还有另一个名为`optimize_for_inference`的工具,其功能类似于`strip_unused`,并且可以很好地用于代码实验室中的图像分类任务。 您可以像这样运行它:
```py
bazel build tensorflow/python/tools:optimize_for_inference
......@@ -416,7 +416,7 @@ bazel-bin/tensorflow/tools/graph_transforms/transform_graph \
我们将不讨论所有`--transforms`选项的详细信息,这些选项在[这里](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/tools/graph_transforms)有完整记录。 基本上,`--transforms`设置可以正确消除模型中未使用的节点,例如`DecodeJpeg`,并且还可以进行其他一些优化。
现在,如果您在 iOS 和 Android 应用程序中加载`image2text_frozen_transformed.pb`文件,则不兼容的错误将消失。 当然,我们还没有编写任何真实的 iOS 和 Android 代码,但是我们知道该模型很好,可以随时使用。 很好,但是可以更好。
现在,如果您在 iOS 和 Android 应用中加载`image2text_frozen_transformed.pb`文件,则不兼容的错误将消失。 当然,我们还没有编写任何真实的 iOS 和 Android 代码,但是我们知道该模型很好,可以随时使用。 很好,但是可以更好。
......@@ -442,7 +442,7 @@ bazel-bin/tensorflow/contrib/util/convert_graphdef_memmapped_format \
下一节将向您展示如何在 iOS 应用中使用`image2text_frozen_transformed_memmapped.pb`模型文件。 它也可以在使用本机代码的 Android 中使用,但是由于时间限制,我们将无法在本章中介绍它。
我们花了很多功夫才能最终为移动应用准备好复杂的图像字幕模型。 是时候欣赏使用模型的简单性了。 实际上,使用模型不仅仅是 iOS 中的单个 `session->Run` 调用,还是 Android 中的 `mInferenceInterface.run` 调用,就像我们在前面所有章节中所做的那样; 从输入图像到自然语言输出的推论(如您在上一节中研究`run_inference.py`的工作原理时所见)涉及到对模型的`run`方法的多次调用。 LSTM 模型就是这样工作的:“继续向我发送新的输入(基于我以前的状态和输出),我将向您发送下一个状态和输出。” 简单来说,我们的意思是向您展示如何使用尽可能少的简洁代码来构建 iOS 和 Android 应用,这些应用使用该模型以自然语言描述图像。 这样,如果需要,您可以轻松地在自己的应用程序中集成模型及其推理代码。
我们花了很多功夫才能最终为移动应用准备好复杂的图像字幕模型。 是时候欣赏使用模型的简单性了。 实际上,使用模型不仅仅是 iOS 中的单个 `session->Run` 调用,还是 Android 中的 `mInferenceInterface.run` 调用,就像我们在前面所有章节中所做的那样; 从输入图像到自然语言输出的推论(如您在上一节中研究`run_inference.py`的工作原理时所见)涉及到对模型的`run`方法的多次调用。 LSTM 模型就是这样工作的:“继续向我发送新的输入(基于我以前的状态和输出),我将向您发送下一个状态和输出。” 简单来说,我们的意思是向您展示如何使用尽可能少的简洁代码来构建 iOS 和 Android 应用,这些应用使用该模型以自然语言描述图像。 这样,如果需要,您可以轻松地在自己的应用中集成模型及其推理代码。
......@@ -461,9 +461,9 @@ target 'Image2Text'
pod 'TensorFlow-experimental'
```
然后在终端上运行`pod install`并打开`Image2Text.xcworkspace`文件。 将`ios_image_load.h``ios_image_load.mm``tensorflow_utils.h``tensorflow_utils.mm`文件从位于`tensorflow/examples/ios/camera`的 TensorFlow iOS 示例相机应用程序拖放到 Xcode 的`Image2Text`项目中。 之前我们已经重用了`ios_image_load.*`文件,此处`tensorflow_utils.*`文件主要用于加载映射的模型文件。 `tensorflow_utils.mm`中有两种方法`LoadModel``LoadMemoryMappedModel` :一种以我们以前的方式加载非映射模型,另一种加载了映射模型 。 如果有兴趣,请看一下`LoadMemoryMappedModel`的实现方式,并且[这个页面](https://www.tensorflow.org/mobile/optimizing#reducing_model_loading_time_andor_memory_footprint)上的文档也可能会有用。
然后在终端上运行`pod install`并打开`Image2Text.xcworkspace`文件。 将`ios_image_load.h``ios_image_load.mm``tensorflow_utils.h``tensorflow_utils.mm`文件从位于`tensorflow/examples/ios/camera`的 TensorFlow iOS 示例相机应用拖放到 Xcode 的`Image2Text`项目中。 之前我们已经重用了`ios_image_load.*`文件,此处`tensorflow_utils.*`文件主要用于加载映射的模型文件。 `tensorflow_utils.mm`中有两种方法`LoadModel``LoadMemoryMappedModel` :一种以我们以前的方式加载非映射模型,另一种加载了映射模型 。 如果有兴趣,请看一下`LoadMemoryMappedModel`的实现方式,并且[这个页面](https://www.tensorflow.org/mobile/optimizing#reducing_model_loading_time_andor_memory_footprint)上的文档也可能会有用。
2. 添加在上一节末尾生成的两个模型文件,在“训练和测试字幕生成”小节第 2 步中生成的`word_counts.txt`文件,以及一些测试图像–我们保存并使用 [TensorFlow im2txt 模型页面](https://github.com/tensorflow/models/tree/master/research/im2txt)顶部的四个图像,以便我们比较我们的模型的字幕结果,以及那些由使用更多步骤训练的模型所生成的结果。 还将`ViewController.m`重命名为`.mm`,从现在开始,我们将只处理`ViewController.mm`文件即可完成应用程序。 现在,您的 Xcode `Image2Text`项目应类似于图 6.5:
2. 添加在上一节末尾生成的两个模型文件,在“训练和测试字幕生成”小节第 2 步中生成的`word_counts.txt`文件,以及一些测试图像–我们保存并使用 [TensorFlow im2txt 模型页面](https://github.com/tensorflow/models/tree/master/research/im2txt)顶部的四个图像,以便我们比较我们的模型的字幕结果,以及那些由使用更多步骤训练的模型所生成的结果。 还将`ViewController.m`重命名为`.mm`,从现在开始,我们将只处理`ViewController.mm`文件即可完成应用。 现在,您的 Xcode `Image2Text`项目应类似于图 6.5:
![](img/62be062e-39dc-4f0c-8a59-7e0e675bafaa.png)
......@@ -524,7 +524,7 @@ UILabel *_lbl;
NSString* generateCaption(bool memmapped);
```
此简单的与 UI 相关的代码类似于第 2 章,“通过迁移学习对图像进行分类”的 iOS 应用程序的代码。 基本上,您可以在应用启动后点击任意位置,然后选择两个模型之一,图像描述结果将显示在顶部。 当用户在`alert`操作中选择了映射模型时,将运行以下代码:
此简单的与 UI 相关的代码类似于第 2 章,“通过迁移学习对图像进行分类”的 iOS 应用的代码。 基本上,您可以在应用启动后点击任意位置,然后选择两个模型之一,图像描述结果将显示在顶部。 当用户在`alert`操作中选择了映射模型时,将运行以下代码:
```py
dispatch_async(dispatch_get_global_queue(0, 0), ^{
......@@ -683,7 +683,7 @@ for (int i=0; i<captions.size(); i++) {
return sentence;
```
这就是在 iOS 应用程序中运行模型所需的一切。 现在,在 iOS 模拟器或设备中运行该应用程序,点击并选择一个模型,如图 6.6 所示:
这就是在 iOS 应用中运行模型所需的一切。 现在,在 iOS 模拟器或设备中运行该应用,点击并选择一个模型,如图 6.6 所示:
![](img/dd9bd09b-1b39-47ff-8a8f-f7f180faff3c.png)
......@@ -946,7 +946,7 @@ mHandler.sendMessage(msg);
一些结果与 iOS 结果以及 TensorFlow im2txt 网站上的结果略有不同。 但是它们看起来都不错。 另外,在相对较旧的 Android 设备(例如 Nexus 5)上运行该模型的非映射版本也可以。 但是最好在 Android 中加载映射模型,以查看性能的显着提高,我们可能会在本书后面的章节中介绍。
因此,这将使用功能强大的图像字幕模型完成分步的 Android 应用构建过程。 无论您使用的是 iOS 还是 Android 应用程序,您都应该能够轻松地将我们训练有素的模型和推理代码集成到自己的应用程序中,或者返回到训练过程以微调模型,然后准备并优化更好的模型。 在您的移动应用中使用的模型。
因此,这将使用功能强大的图像字幕模型完成分步的 Android 应用构建过程。 无论您使用的是 iOS 还是 Android 应用,您都应该能够轻松地将我们训练有素的模型和推理代码集成到自己的应用中,或者返回到训练过程以微调模型,然后准备并优化更好的模型。 在您的移动应用中使用的模型。
......@@ -958,8 +958,8 @@ mHandler.sendMessage(msg);
在本章中,我们首先讨论了由现代端到端深度学习支持的图像字幕如何工作,然后总结了如何使用 TensorFlow im2txt 模型项目训练这种模型。 我们详细讨论了如何找到正确的输入节点名称和输出节点名称,以及如何冻结模型,然后使用最新的图形转换工具和映射转换工具修复在将模型加载到手机上时出现的一些讨厌的错误。 之后,我们展示了有关如何使用模型构建 iOS 和 Android 应用以及如何使用模型的 LSTM RNN 组件进行新的序列推断的详细教程。
令人惊讶的是,经过训练了成千上万个图像字幕示例,并在现代 CNN 和 LSTM 模型的支持下,我们可以构建和使用一个模型,该模型可以在移动设备上生成合理的自然语言描述。 不难想象可以在此基础上构建什么样的有用应用程序。 我们喜欢福尔摩斯吗? 当然不。 我们已经在路上了吗? 我们希望如此。 AI 的世界既令人着迷又充满挑战,但是只要我们不断取得稳步进步并改善自己的学习过程,同时又避免了梯度问题的消失和爆炸,我们就有很大机会建立一个类似于 Holmes 的模型,并可以随时随地在一天中在移动应用中使用它。
令人惊讶的是,经过训练了成千上万个图像字幕示例,并在现代 CNN 和 LSTM 模型的支持下,我们可以构建和使用一个模型,该模型可以在移动设备上生成合理的自然语言描述。 不难想象可以在此基础上构建什么样的有用应用。 我们喜欢福尔摩斯吗? 当然不。 我们已经在路上了吗? 我们希望如此。 AI 的世界既令人着迷又充满挑战,但是只要我们不断取得稳步进步并改善自己的学习过程,同时又避免了梯度问题的消失和爆炸,我们就有很大机会建立一个类似于 Holmes 的模型,并可以随时随地在一天中在移动应用中使用它。
漫长的篇章讨论了基于 CNN 和 LSTM 的网络模型的实际使用,我们值得一试。 在下一章中,您将看到如何使用另一个基于 CNN 和 LSTM 的模型来开发有趣的 iOS 和 Android 应用程序,这些应用程序使您可以绘制对象然后识别它们是什么。 要快速获得游戏在线版本的乐趣,请访问[这里](https://quickdraw.withgoogle.com)
漫长的篇章讨论了基于 CNN 和 LSTM 的网络模型的实际使用,我们值得一试。 在下一章中,您将看到如何使用另一个基于 CNN 和 LSTM 的模型来开发有趣的 iOS 和 Android 应用,这些应用使您可以绘制对象然后识别它们是什么。 要快速获得游戏在线版本的乐趣,请访问[这里](https://quickdraw.withgoogle.com)
此差异已折叠。
......@@ -6,7 +6,7 @@
如果在上一章中在移动设备上玩过涂鸦和构建(并运行模型以识别涂鸦),当您在股市上赚钱时会感到很开心,而如果您不认真的话会变得很认真。 一方面,股价是时间序列数据,一系列离散时间数据,而处理时间序列数据的最佳深度学习方法是 RNN,这是我们在前两章中使用的方法。 AurélienGéron 在他的畅销书《Scikit-Learn 和 TensorFlow 机器学习实战》中,建议使用 RNN“分析时间序列数据,例如股票价格,并告诉您何时买卖”。 另一方面,其他人则认为股票的过去表现无法预测其未来收益,因此,随机选择的投资组合的表现与专家精心挑选的股票一样好。 实际上,Keras(在 TensorFlow 和其他几个库之上运行的非常受欢迎的高级深度学习库)的作者 FrançoisChollet 在他的畅销书《Python 深度学习》中表示,使用 RNN。 仅用公开数据来击败市场是“一项非常困难的努力,您可能会浪费时间和资源,而无所作为。”
因此,冒着“可能”浪费我们时间和资源的风险,但是可以肯定的是,我们至少将了解更多有关 RNN 的知识,以及为什么有可能比随机 50% 的策略更好地预测股价,我们将首先概述如何使用 RNN 进行股票价格预测,然后讨论如何使用 TensorFlow API 构建 RNN 模型来预测股票价格,以及如何使用易于使用的 Keras API 来为价格预测构建 RNN LSTM 模型。 我们将测试这些模型是否可以击败随机的买入或卖出策略。 如果我们对我们的模型感到满意,以提高我们在市场上的领先优势,或者只是出于专有技术的目的,我们将了解如何冻结并准备 TensorFlow 和 Keras 模型以在 iOS 和 Android 应用程序上运行。 如果该模型可以提高我们的机会,那么我们支持该模型的移动应用程序可以在任何时候,无论何时何地做出买或卖决定。 感觉有点不确定和兴奋? 欢迎来到市场。
因此,冒着“可能”浪费我们时间和资源的风险,但是可以肯定的是,我们至少将了解更多有关 RNN 的知识,以及为什么有可能比随机 50% 的策略更好地预测股价,我们将首先概述如何使用 RNN 进行股票价格预测,然后讨论如何使用 TensorFlow API 构建 RNN 模型来预测股票价格,以及如何使用易于使用的 Keras API 来为价格预测构建 RNN LSTM 模型。 我们将测试这些模型是否可以击败随机的买入或卖出策略。 如果我们对我们的模型感到满意,以提高我们在市场上的领先优势,或者只是出于专有技术的目的,我们将了解如何冻结并准备 TensorFlow 和 Keras 模型以在 iOS 和 Android 应用上运行。 如果该模型可以提高我们的机会,那么我们支持该模型的移动应用可以在任何时候,无论何时何地做出买或卖决定。 感觉有点不确定和兴奋? 欢迎来到市场。
总之,本章将涵盖以下主题:
......@@ -20,7 +20,7 @@
# RNN 和股价预测什么以及如何
# RNN 和股价预测什么以及如何
......@@ -58,7 +58,7 @@ LSTM 只是解决 RNN 已知梯度消失问题的一种 RNN,我们在第 6 章
# 使用 TensorFlow RNN API 进行股价预测
# 将 TensorFlow RNN API 用于股价预测
......@@ -283,7 +283,7 @@ python tensorflow/python/tools/freeze_graph.py --input_meta_graph=/tmp/amzn_mode
# 使用 Keras RNN LSTM API 进行股价预测
# 将 Keras RNN LSTM API 用于股价预测
......@@ -293,7 +293,7 @@ Keras 是一个非常易于使用的高级深度学习 Python 库,它运行在
sudo pip install virtualenv
```
如果您的机器和 iOS 和 Android 应用程序上都有 TensorFlow 1.4 源,请运行以下命令;否则,请运行以下命令。 使用 TensorFlow 1.4 自定义库:
如果您的机器和 iOS 和 Android 应用上都有 TensorFlow 1.4 源,请运行以下命令;否则,请运行以下命令。 使用 TensorFlow 1.4 自定义库:
```py
cd
......@@ -685,7 +685,7 @@ const int SEQ_LEN = 20;
}
```
如果您现在运行该应用程序并点击`Predict`按钮,您将看到型号选择消息(图 8.4):
如果您现在运行该应用并点击`Predict`按钮,您将看到型号选择消息(图 8.4):
![](img/067fa448-a497-4f13-944f-e976240694c9.png)
......@@ -707,7 +707,7 @@ Could not create TensorFlow Graph: Invalid argument: No OpKernel was registered
[[Node: bidirectional_1/while_1/Less = Less[T=DT_INT32, _output_shapes=[[]]](bidirectional_1/while_1/Merge, bidirectional_1/while_1/Less/Enter)]]
```
我们在上一章中已经看到`RefSwitch`操作出现类似的错误,并且知道针对此类错误的解决方法是在启用 `-D__ANDROID_TYPES_FULL__`的情况下构建 TensorFlow 库。 如果没有看到这些错误,则意味着您在上一章的 iOS 应用程序中已建立了这样的库; 否则,请按照“为 iOS 构建自定义 TensorFlow 库”的开头的说明。 上一章的内容构建新的 TensorFlow 库,然后再次运行该应用程序
我们在上一章中已经看到`RefSwitch`操作出现类似的错误,并且知道针对此类错误的解决方法是在启用 `-D__ANDROID_TYPES_FULL__`的情况下构建 TensorFlow 库。 如果没有看到这些错误,则意味着您在上一章的 iOS 应用中已建立了这样的库; 否则,请按照“为 iOS 构建自定义 TensorFlow 库”的开头的说明。 上一章的内容构建新的 TensorFlow 库,然后再次运行该应用
现在选择 TensorFlow 模型,您将看到如图 8.5 所示的结果:
......@@ -854,7 +854,7 @@ public void run() {
}
```
现在运行该应用程序,然后点击`TF PREDICTION`按钮,您将在图 8.7 中看到结果:
现在运行该应用,然后点击`TF PREDICTION`按钮,您将在图 8.7 中看到结果:
![](img/8ce6016b-658a-46c4-a051-04c772d503fc.png)
......
......@@ -6,7 +6,7 @@
自 2012 年深度学习起步以来,有人认为 Ian Goodfellow 在 2014 年提出的[**生成对抗网络**](https://arxiv.org/abs/1406.2661)**GAN**)比这更有趣或更有前途。 实际上, Facebook AI 研究主管和之一,深度学习研究人员之一的 Yann LeCun 将 GAN 和对抗训练称为,“这是近十年来机器学习中最有趣的想法。” 因此,我们如何在这里不介绍它,以了解 GAN 为什么如此令人兴奋,以及如何构建 GAN 模型并在 iOS 和 Android 上运行它们?
在本章中,我们将首先概述 GAN 是什么,它如何工作以及为什么它具有如此巨大的潜力。 然后,我们将研究两个 GAN 模型:一个基本的 GAN 模型可用于生成类似人的手写数字,另一个更高级的 GAN 模型可将低分辨率的图像增强为高分辨率的图像。 我们将向您展示如何在 Python 和 TensorFlow 中构建和训练此类模型,以及如何为移动部署准备模型。 然后,我们将提供带有完整源代码的 iOS 和 Android 应用程序,它们使用这些模型来生成手写数字并增强图像。 在本章的最后,您应该准备好进一步探索各种基于 GAN 的模型,或者开始构建自己的模型,并了解如何在移动应用程序中运行它们。
在本章中,我们将首先概述 GAN 是什么,它如何工作以及为什么它具有如此巨大的潜力。 然后,我们将研究两个 GAN 模型:一个基本的 GAN 模型可用于生成类似人的手写数字,另一个更高级的 GAN 模型可将低分辨率的图像增强为高分辨率的图像。 我们将向您展示如何在 Python 和 TensorFlow 中构建和训练此类模型,以及如何为移动部署准备模型。 然后,我们将提供带有完整源代码的 iOS 和 Android 应用,它们使用这些模型来生成手写数字并增强图像。 在本章的最后,您应该准备好进一步探索各种基于 GAN 的模型,或者开始构建自己的模型,并了解如何在移动应用中运行它们。
总之,本章将涵盖以下主题:
......@@ -19,7 +19,7 @@
# GAN –什么以及为什么
# GAN – 什么以及为什么
......@@ -34,7 +34,7 @@ GAN 是学习生成类似于真实数据或训练集中数据的神经网络。
如果您有兴趣了解有关纳什均衡的更多信息,请访问 Google “可汗学院纳什均衡”,并观看 Sal Khan 撰写的两个有趣的视频。 《经济学家》解释经济学的“纳什均衡”维基百科页面和文章[“纳什均衡是什么,为什么重要?”](https://www.economist.com/blogs/economist-explains/2016/09/economist-explains-economics)也是不错的读物。 了解 GAN 的基本直觉和想法将有助于您进一步了解 GAN 具有巨大潜力的原因。
生成器能够生成看起来像真实数据的数据的潜力意味着可以使用 GAN 开发各种出色的应用程序,例如:
生成器能够生成看起来像真实数据的数据的潜力意味着可以使用 GAN 开发各种出色的应用,例如:
* 从劣质图像生成高质量图像
* 图像修复(修复丢失或损坏的图像)
......@@ -67,7 +67,7 @@ GAN 是学习生成类似于真实数据或训练集中数据的神经网络。
手写数字的训练模型基于[仓库](https://github.com/jeffxtang/generative-adversarial-networks),这是[这个页面](https://github.com/jonbruner/generative-adversarial-networks)的分支,并添加了显示生成的数字并使用输入占位符保存 TensorFlow 训练模型的脚本,因此我们的 iOS 和 Android 应用程序可以使用该模型。 是的您应该查看[原始仓库的博客](https://www.oreilly.com/learning/generative-adversarial-networks-for-beginners)。在继续之前,需要对具有代码的 GAN 模型有基本的了解。
手写数字的训练模型基于[仓库](https://github.com/jeffxtang/generative-adversarial-networks),这是[这个页面](https://github.com/jonbruner/generative-adversarial-networks)的分支,并添加了显示生成的数字并使用输入占位符保存 TensorFlow 训练模型的脚本,因此我们的 iOS 和 Android 应用可以使用该模型。 是的您应该查看[原始仓库的博客](https://www.oreilly.com/learning/generative-adversarial-networks-for-beginners)。在继续之前,需要对具有代码的 GAN 模型有基本的了解。
在研究定义生成器和判别器网络并进行 GAN 训练的核心代码片段之前,让我们先运行脚本以在克隆存储库并转到仓库目录之后训练和测试模型:
......@@ -131,7 +131,7 @@ python tensorflow/python/tools/freeze_graph.py \
--input_binary=true
```
这将创建可用于移动应用程序的冻结模型`gan_mnist.pb`。 但是在此之前,让我们看一下可以增强低分辨率图像的更高级的 GAN 模型。
这将创建可用于移动应用的冻结模型`gan_mnist.pb`。 但是在此之前,让我们看一下可以增强低分辨率图像的更高级的 GAN 模型。
......@@ -296,7 +296,7 @@ bazel-bin/tensorflow/tools/graph_transforms/transform_graph \
--transforms='quantize_weights'
```
现在,让我们看看如何在移动应用程序中使用两个 GAN 模型。
现在,让我们看看如何在移动应用中使用两个 GAN 模型。
......@@ -541,7 +541,7 @@ No OpKernel was registered to support Op 'FIFOQueueV2' with these attrs. Registe
}
```
现在,在 iOS 模拟器或设备中运行该应用程序,点击 GAN 按钮,然后选择生成数字,您将看到 GAN 生成的手写数字的结果,如图 9.3 所示:
现在,在 iOS 模拟器或设备中运行该应用,点击 GAN 按钮,然后选择生成数字,您将看到 GAN 生成的手写数字的结果,如图 9.3 所示:
![](img/0e0f47b1-2efa-4ec0-9eaa-4b21356cad23.png)
......@@ -565,7 +565,7 @@ No OpKernel was registered to support Op 'FIFOQueueV2' with these attrs. Registe
事实证明,我们不需要使用自定义的 TensorFlow Android 库,就像我们在第 7 章,“通过 CNN 和 LSTM 识别图纸”中所做的那样,即可在 Android 中运行 GAN 模型。 只需创建一个具有所有默认设置的名为 GAN 的新 Android Studio 应用程序,将`compile 'org.tensorflow:tensorflow-android:+'`添加到应用程序`build.gradle`文件,创建一个新的素材文件夹,然后复制两个 GAN 模型文件和一个测试模糊图像。
事实证明,我们不需要使用自定义的 TensorFlow Android 库,就像我们在第 7 章,“通过 CNN 和 LSTM 识别绘画”中所做的那样,即可在 Android 中运行 GAN 模型。 只需创建一个具有所有默认设置的名为 GAN 的新 Android Studio 应用,将`compile 'org.tensorflow:tensorflow-android:+'`添加到应用`build.gradle`文件,创建一个新的素材文件夹,然后复制两个 GAN 模型文件和一个测试模糊图像。
现在,您在 Android Studio 中的项目应如图 9.5 所示:
......@@ -718,7 +718,7 @@ void runMNISTModel() {
}
```
如果现在运行该应用程序,并使用`void runPix2PixBlurryModel() {}`的空白实现来避免生成错误,则在单击`GENERATE DIGITS`后会看到初始屏幕和结果,如图 9.6 所示:
如果现在运行该应用,并使用`void runPix2PixBlurryModel() {}`的空白实现来避免生成错误,则在单击`GENERATE DIGITS`后会看到初始屏幕和结果,如图 9.6 所示:
![](img/1b2a1b02-e084-40bf-a33d-ce5561a34850.png)
......@@ -789,13 +789,13 @@ void runPix2PixBlurryModel() {
}
```
再次运行该应用程序,然后立即点击增强图像按钮,您将在几秒钟内看到图 9.7 中的增强图像:
再次运行该应用,然后立即点击增强图像按钮,您将在几秒钟内看到图 9.7 中的增强图像:
![](img/7e7c6110-09d5-4908-bfaa-e9b5b67596d3.png)
图 9.7:Android 上的模糊和增强图像
这使用两个 GAN 模型完成了我们的 Android 应用程序
这使用两个 GAN 模型完成了我们的 Android 应用。
......@@ -805,7 +805,7 @@ void runPix2PixBlurryModel() {
在本章中,我们快速浏览了 GAN 的美好世界。 我们介绍了 GAN 的含义以及它们为何如此有趣的原因-生成器和判别器相互竞争并尝试击败的方式听起来对大多数人来说很有吸引力。 然后,我们详细介绍了如何训练基本 GAN 模型和更高级的图像分辨率增强模型以及如何为移动设备准备它们的详细步骤。 最后,我们向您展示了如何使用这些模型构建 iOS 和 Android 应用程序。 如果您对整个过程和结果感到兴奋,那么您肯定会想进一步探索 GAN,这是一个快速发展的领域,在该领域中,新型 GAN 已经迅速开发出来,以克服先前模型的缺点; 例如,正如我们在“增强图像分辨率”小节的 GAN 高级模型中看到的那样,开发了需要配对图像进行训练的 pix2pix 模型的同一位研究人员提出了一种称为 [CycleGAN](https://junyanz.github.io/CycleGAN) 的模型,删除了图像配对的要求。 如果您对我们生成的数字或增强的图像的质量不满意,则可能还应该进一步探索 GAN,以了解如何改进 GAN 模型。 正如我们之前提到的,GAN 仍很年轻,研究人员仍在努力稳定训练,如果可以稳定的话,将会取得更大的成功。 至少到目前为止,您已经获得了如何在移动应用中快速部署 GAN 模型的经验。 由您决定是关注最新,最出色的 GAN 并在移动设备上使用它们,还是暂时搁置您的移动开发人员的帽子,会全力以赴来构建新的或改进现有的 GAN 模型。
在本章中,我们快速浏览了 GAN 的美好世界。 我们介绍了 GAN 的含义以及它们为何如此有趣的原因-生成器和判别器相互竞争并尝试击败的方式听起来对大多数人来说很有吸引力。 然后,我们详细介绍了如何训练基本 GAN 模型和更高级的图像分辨率增强模型以及如何为移动设备准备它们的详细步骤。 最后,我们向您展示了如何使用这些模型构建 iOS 和 Android 应用。 如果您对整个过程和结果感到兴奋,那么您肯定会想进一步探索 GAN,这是一个快速发展的领域,在该领域中,新型 GAN 已经迅速开发出来,以克服先前模型的缺点; 例如,正如我们在“增强图像分辨率”小节的 GAN 高级模型中看到的那样,开发了需要配对图像进行训练的 pix2pix 模型的同一位研究人员提出了一种称为 [CycleGAN](https://junyanz.github.io/CycleGAN) 的模型,删除了图像配对的要求。 如果您对我们生成的数字或增强的图像的质量不满意,则可能还应该进一步探索 GAN,以了解如何改进 GAN 模型。 正如我们之前提到的,GAN 仍很年轻,研究人员仍在努力稳定训练,如果可以稳定的话,将会取得更大的成功。 至少到目前为止,您已经获得了如何在移动应用中快速部署 GAN 模型的经验。 由您决定是关注最新,最出色的 GAN 并在移动设备上使用它们,还是暂时搁置您的移动开发人员的帽子,会全力以赴来构建新的或改进现有的 GAN 模型。
如果 GAN 在深度学习社区中引起了极大的兴奋,那么 AlphaGo 在 2016 年和 2017 年击败最优秀的人类 GO 玩家的成就无疑令所有人都感到惊讶。 此外,在 2017 年 10 月,AlphaGo Zero(一种完全基于自学强化学习而无需任何人类知识的新算法)被推举为击败 AlphaGo 100-0,令人难以置信。 2017 年 12 月,与仅在 GO 游戏中定位的 AlphaGo 和 AlphaGo Zero 不同,AlphaZero(一种可在许多具有挑战性的领域实现“超人表现”的算法)被发布。 在下一章中,我们将看到如何使用最新最酷的 AlphaZero 来构建和训练用于玩简单游戏的模型,以及如何在移动设备上运行该模型。
......
# 构建类似 AlphaZero 的手机游戏应用程序
# 构建类似 AlphaZero 的手机游戏应用
......@@ -10,20 +10,20 @@
事实证明,这只是朝着 Google 更雄心勃勃的目标迈出的一步,该目标是将 AlphaGo 背后的 AI 技术应用和改进到其他领域。 2017 年 12 月,DeepMind 发表了另一篇论文,[即使用通用强化学习算法通过自学掌握国际象棋和将棋](https://arxiv.org/pdf/1712.01815.pdf),对 AlphaGo 进行了概括。 将零程序归类为一个称为 AlphaZero 的算法,并使用该算法从头开始快速学习如何玩象棋和将棋的游戏,从除了游戏规则之外没有任何领域知识的随机游戏开始,并在 24 小时内实现了超人级别并击败世界冠军。
在本章中,我们将带您浏览 AlphaZero 的最新最酷的部分,向您展示如何构建和训练类似 AlphaZero 的模型来玩一个简单而有趣的游戏,称为 [Connect4](https://en.wikipedia.org/wiki/Connect_Four),在 TensorFlow 和 Keras 中使用,这是我们在第 8 章,“使用 RNN 预测股价”的流行的高级深度学习库。 我们还将介绍如何使用训练有素的 AlphaZero 模型来获得训练有素的专家策略,以指导移动游戏的玩法,以及使用该模型玩 Connect4 游戏的完整 iOS 和 Android 应用程序的源代码。
在本章中,我们将带您浏览 AlphaZero 的最新最酷的部分,向您展示如何构建和训练类似 AlphaZero 的模型来玩一个简单而有趣的游戏,称为 [Connect4](https://en.wikipedia.org/wiki/Connect_Four),在 TensorFlow 和 Keras 中使用,这是我们在第 8 章,“使用 RNN 预测股价”的流行的高级深度学习库。 我们还将介绍如何使用训练有素的 AlphaZero 模型来获得训练有素的专家策略,以指导移动游戏的玩法,以及使用该模型玩 Connect4 游戏的完整 iOS 和 Android 应用的源代码。
总之,本章将涵盖以下主题:
* AlphaZero –它如何工作?
* 为 Connect4 构建和训练类似于 AlphaZero 的模型
* 在 iOS 中使用模型播放 Connect4
* 在 Android 中使用模型播放 Connect4
* 在 iOS 中使用模型 Connect4
* 在 Android 中使用模型 Connect4
# AlphaZero –它如何工作?
# AlphaZero – 它如何工作?
......@@ -33,7 +33,7 @@ AlphaZero 算法包含三个主要组件:
* 一种通用的强化学习算法,该算法通过自玩从头开始学习,除了游戏规则外,没有特定的领域知识。 通过自增强学习学习深度神经网络的参数,以使预测值与实际自游戏结果之间的损失最小,并使预测策略与搜索概率之间的相似性最大化,这来自以下算法。
* 一种通用(与域无关)的**蒙特卡洛树搜索****MCTS**)算法,该算法从头至尾模拟自玩游戏,并通过考虑到从深度神经网络返回的预测值和策略概率值,以及访问节点的频率—有时,选择访问次数较少的节点称为强化学习中的探索(与采取较高预测值的举动相反) 价值和政策,这称为剥削)。 探索与开发之间的良好平衡可以带来更好的结果。
强化学习的历史可以追溯到 1960 年代,当时该术语在工程文献中首次使用。 但是突破发生在 2013 年,当时 DeepMind 将强化学习与深度学习相结合,并开发了深度强化学习应用程序,该应用程序学会了从头开始玩 Atari 游戏,以原始像素为输入的,并随后击败了人类。 与监督学习不同,监督学习需要标记数据进行训练,就像我们在前几章中建立或使用的许多模型中所看到的那样,强化学习使用反复试验的方法来获得更好的效果:代理与环境交互并接收在每个状态上采取的每个动作的奖励(正面或负面)。 在 AlphaZero 下象棋的示例中,只有在游戏结束后才能获得奖励,获胜的结果为 +1,失败的为 -1,平局为 0。强化学习 AlphaZero 中的算法对我们前面提到的损失使用梯度下降来更新深层神经网络的参数, 就像一个通用函数近似来学习和编码游戏技巧。
强化学习的历史可以追溯到 1960 年代,当时该术语在工程文献中首次使用。 但是突破发生在 2013 年,当时 DeepMind 将强化学习与深度学习相结合,并开发了深度强化学习应用,该应用学会了从头开始玩 Atari 游戏,以原始像素为输入的,并随后击败了人类。 与监督学习不同,监督学习需要标记数据进行训练,就像我们在前几章中建立或使用的许多模型中所看到的那样,强化学习使用反复试验的方法来获得更好的效果:代理与环境交互并接收在每个状态上采取的每个动作的奖励(正面或负面)。 在 AlphaZero 下象棋的示例中,只有在游戏结束后才能获得奖励,获胜的结果为 +1,失败的为 -1,平局为 0。强化学习 AlphaZero 中的算法对我们前面提到的损失使用梯度下降来更新深层神经网络的参数, 就像一个通用函数近似来学习和编码游戏技巧。
学习或训练过程的结果可以是由深度神经网络生成的策略,该策略说出对任何状态应采取的行动,或者是将每个状态以及该状态的每个可能动作映射到长期奖励的价值函数 。
......@@ -51,7 +51,7 @@ AlphaZero 算法包含三个主要组件:
如果您从未玩过 Connect4,则可以在[这个页面](http://www.connectfour.org)上免费玩它。 这是一个快速有趣的游戏。 基本上,两个播放器轮流从一列的顶部将不同颜色的光盘放入六行乘七列的网格中。 如果尚未在该列中放入任何光盘,则新放置的光盘将位于该列的底部,或者位于该列中最后放置的光盘的顶部。 谁先在三个可能的方向(水平,垂直,对角线)中的任何一个方向上拥有自己颜色的四个连续光盘赢得比赛。
如果您从未玩过 Connect4,则可以在[这个页面](http://www.connectfour.org)上免费玩它。 这是一个快速有趣的游戏。 基本上,两个玩家轮流从一列的顶部将不同颜色的光盘放入六行乘七列的网格中。 如果尚未在该列中放入任何光盘,则新放置的光盘将位于该列的底部,或者位于该列中最后放置的光盘的顶部。 谁先在三个可能的方向(水平,垂直,对角线)中的任何一个方向上拥有自己颜色的四个连续光盘赢得比赛。
Connect4 的 AlphaZero 模型基于[存储库](https://github.com/jeffxtang/DeepReinforcementLearning),这是[这个页面](https://github.com/AppliedDataSciencePartners/DeepReinforcementLearning)的分支, 有一个不错的博客,[如何使用 Python 和 Keras 构建自己的 AlphaZero AI](https://applied-data.science/blog/how-to-build-your-own-alphazero-ai-using-python-and-keras),您可能应该在继续之前阅读它,因此以下步骤更有意义。
......@@ -135,7 +135,7 @@ pip install keras
playMatchesBetweenVersions(env, 1, 1, 4, 10, lg.logger_tourney, 0)
```
参数`1,1,4,10`的第一个值表示运行版本,因此 1 表示模型位于`run_archive/connect4``run0001/models`中。 第二个和第三个值是两个播放器的模型版本,因此 1 和 4 表示该模型的版本 1 将与版本 4 一起播放。10 是播放的次数或剧集。
参数`1,1,4,10`的第一个值表示运行版本,因此 1 表示模型位于`run_archive/connect4``run0001/models`中。 第二个和第三个值是两个玩家的模型版本,因此 1 和 4 表示该模型的版本 1 将与版本 4 一起玩。10 是玩的次数或剧集。
运行`python play.py`脚本按照指定的方式玩游戏后,可以使用以下命令找出结果:
......@@ -158,7 +158,7 @@ grep WINS run/logs/logger_tourney.log |tail -10
2018-03-14 23:58:36,490 INFO player1 WINS!
```
`config.py`中有一个设置`MCTS_SIMS = 50`(MCTS 的模拟次数)会对播放时间产生重大影响。 在每个状态下,MCTS 都会进行`MCTS_SIMS`次仿真,并与受过训练的网络一起提出最佳方案。 因此,将`MCTS_SIMS`设置为 50 会使`play.py` 脚本运行更长的时间,但如果训练的模型不够好,并不一定会使播放器更强大。 在使用特定版本的模型时,可以将其更改为不同的值,以查看其如何影响其强度水平。 要手动播放一个特定版本,请将`play.py`更改为:
`config.py`中有一个设置`MCTS_SIMS = 50`(MCTS 的模拟次数)会对游玩时间产生重大影响。 在每个状态下,MCTS 都会进行`MCTS_SIMS`次仿真,并与受过训练的网络一起提出最佳方案。 因此,将`MCTS_SIMS`设置为 50 会使`play.py` 脚本运行更长的时间,但如果训练的模型不够好,并不一定会使玩家更强大。 在使用特定版本的模型时,可以将其更改为不同的值,以查看其如何影响其强度水平。 要手动玩一个特定版本,请将`play.py`更改为:
```py
playMatchesBetweenVersions(env, 1, 4, -1, 10, lg.logger_tourney, 0)
......@@ -182,7 +182,7 @@ playMatchesBetweenVersions(env, 1, 4, -1, 10, lg.logger_tourney, 0)
请注意,最后 6 行代表 6 行乘 7 列的板格:第一行对应于 7 个动作编号 0、1、2、3、4、5、6,第二行对应于 7、8、9 10、11、12、13 等,因此最后一行映射到 35、36、37、38、39、40、41 动作编号。
现在,在运行`play.py`的第一个终端中输入数字 38,该模型的版本 4 的播放器 1(打为 O)将移动,显示新的棋盘格,如下所示:
现在,在运行`play.py`的第一个终端中输入数字 38,该模型的版本 4 的玩家 1(打为 O)将移动,显示新的棋盘格,如下所示:
```py
2018-03-15 00:06:13,360 INFO action: 38
......@@ -302,7 +302,7 @@ Tensor("value_head/Tanh:0", shape=(?, 1), dtype=float32)
Tensor("policy_head/MatMul:0", shape=(?, 42), dtype=float32)
```
冻结 TensorFlow 检查点文件并将模型加载到移动应用程序时,我们将需要它们。
冻结 TensorFlow 检查点文件并将模型加载到移动应用时,我们将需要它们。
......@@ -350,13 +350,13 @@ python tensorflow/python/tools/freeze_graph.py \
--input_binary=true
```
为简单起见,由于它是小型模型,因此我们不会我们不会进行图变换和内存映射变换,就像第 6 章,“用自然语言描述图像”和第 9 章,“用 GAN 生成和增强图像”。 现在,我们准备在移动设备上使用该模型并编写代码以在 iOS 和 Android 设备上播放 Connect4。
为简单起见,由于它是小型模型,因此我们不会我们不会进行图变换和内存映射变换,就像第 6 章,“用自然语言描述图像”和第 9 章,“用 GAN 生成和增强图像”。 现在,我们准备在移动设备上使用该模型并编写代码以在 iOS 和 Android 设备上 Connect4。
# 在 iOS 中使用模型播放 Connect4
# 在 iOS 中使用模型 Connect4
......@@ -374,7 +374,7 @@ Couldn't load model: Invalid argument: No OpKernel was registered to support Op
[[Node: batch_normalization_13/cond/Switch = Switch[T=DT_BOOL, _output_shapes=[[], []]](batch_normalization_1/keras_learning_phase, batch_normalization_1/keras_learning_phase)]]
```
您应该已经知道如何解决这种类型的错误,因为前面的章节已经对此进行了讨论。 回顾一下,只需确保`tensorflow/contrib/makefile/tf_op_files.txt`文件中包含`Switch`操作的内核文件。 您可以通过运行`grep 'REGISTER.*"Switch"' tensorflow/core/kernels/*.cc`来查找哪个`Switch`内核文件,该文件应显示`tensorflow/core/kernels/control_flow_ops.cc`。 默认情况下,从 TensorFlow 1.4 开始, `tf_op_files.txt`中包含 `control_flow_ops.cc` 文件,因此您所需要做的就是通过运行`tensorflow/contrib/makefile/build_all_ios.sh`来构建 TensorFlow iOS 自定义库。 如果您已在上一章中成功运行了 iOS 应用程序,则该库已经不错,您不需要或不想再次运行耗时的命令。
您应该已经知道如何解决这种类型的错误,因为前面的章节已经对此进行了讨论。 回顾一下,只需确保`tensorflow/contrib/makefile/tf_op_files.txt`文件中包含`Switch`操作的内核文件。 您可以通过运行`grep 'REGISTER.*"Switch"' tensorflow/core/kernels/*.cc`来查找哪个`Switch`内核文件,该文件应显示`tensorflow/core/kernels/control_flow_ops.cc`。 默认情况下,从 TensorFlow 1.4 开始, `tf_op_files.txt`中包含 `control_flow_ops.cc` 文件,因此您所需要做的就是通过运行`tensorflow/contrib/makefile/build_all_ios.sh`来构建 TensorFlow iOS 自定义库。 如果您已在上一章中成功运行了 iOS 应用,则该库已经不错,您不需要或不想再次运行耗时的命令。
现在,只需创建一个名为 AlphaZero 的新 Xcode iOS 项目,然后将上一章中的 iOS 项目中的`tensorflow_utils.mm``tensorflow_utils.h`文件以及上一节中生成的`alphazero19.pb`模型文件拖放到项目。 将`ViewController.m`重命名为`ViewController.mm`,并添加一些常量和变量。 您的项目应如图 10.3 所示:
......@@ -388,7 +388,7 @@ Couldn't load model: Invalid argument: No OpKernel was registered to support Op
* 显示游戏结果并提示用户采取措施的`UILabel`
* 一个`UIButton`可以玩或重玩游戏。 和以前一样,我们以编程方式在`viewDidLoad`方法中创建和定位它们。
轻按播放或重放按钮时,随机决定谁先走,重置表示为整数数组的棋盘,清除存储我们的移动和 AI 的移动的两个向量,以及重新绘制原始板格:
轻按游玩或重放按钮时,随机决定谁先走,重置表示为整数数组的棋盘,清除存储我们的移动和 AI 的移动的两个向量,以及重新绘制原始板格:
```py
int n = rand() % 2;
......@@ -822,7 +822,7 @@ int winners[69][4] = {
}
```
现在运行该应用程序,您将看到类似于图 10.4 的屏幕:
现在运行该应用,您将看到类似于图 10.4 的屏幕:
![](img/fa949c2a-3114-4a56-9041-9acb069b1ff4.png)
......@@ -840,11 +840,11 @@ int winners[69][4] = {
# 在 Android 中使用模型播放 Connect4
# 在 Android 中使用模型 Connect4
毫不奇怪,我们不需要像第 7 章,“使用 CNN 和 LSTM 识别图纸”那样使用自定义 Android 库来加载模型。 只需创建一个名称为 AlphaZero 的新 Android Studio 应用,将`alphazero19.pb`模型文件复制到新创建的素材资源文件夹,然后将 `compile 'org.tensorflow:tensorflow-android:+'` 行添加到应用程序`build.gradle`文件。
毫不奇怪,我们不需要像第 7 章,“使用 CNN 和 LSTM 识别绘画”那样使用自定义 Android 库来加载模型。 只需创建一个名称为 AlphaZero 的新 Android Studio 应用,将`alphazero19.pb`模型文件复制到新创建的素材资源文件夹,然后将 `compile 'org.tensorflow:tensorflow-android:+'` 行添加到应用`build.gradle`文件。
我们首先创建一个新类`BoardView`,该类扩展了`View`并负责绘制游戏板以及 AI 和用户制作的棋子:
......@@ -1058,7 +1058,7 @@ public class MainActivity extends AppCompatActivity implements Runnable {
private TensorFlowInferenceInterface mInferenceInterface;
```
然后像在 iOS 版本的应用程序中一样定义所有获胜职位:
然后像在 iOS 版本的应用中一样定义所有获胜职位:
```py
private final int winners[][] = {
......@@ -1313,7 +1313,7 @@ void softmax(float vals[], int count) {
}
```
现在,在 Android 虚拟或真实设备上运行该应用程序并使用该应用程序进行游戏,您将看到初始屏幕和一些游戏结果:
现在,在 Android 虚拟或真实设备上运行该应用并使用该应用进行游戏,您将看到初始屏幕和一些游戏结果:
![](img/2d40ca7c-5d3d-4586-9034-2b2ae1c71ecb.png)
......@@ -1329,10 +1329,10 @@ void softmax(float vals[], int count) {
在本章中,我们介绍了 AlphaZero 的惊人世界,这是 DeepMind 截至 2017 年 12 月的最新和最大成就。我们向您展示了如何使用功能强大的 Keras API 和 TensorFlow 后端为 Connect4 训练类似 AlphaZero 的模型,以及如何测试并可能改善这种模型。 然后,我们冻结了该模型,并详细介绍了如何构建 iOS 和 Android 应用程序以使用该模型,以及如何使用基于模型的 AI 玩 Connect4。 尚不能完全击败人类象棋或 GO 冠军的确切 AlphaZero 模型,但我们希望本章为您提供扎实的基础,并激发您继续进行工作,以复制 AlphaZero 最初所做的工作并将其进一步扩展到其他问题领域。 这将需要很多努力,但完全值得。
在本章中,我们介绍了 AlphaZero 的惊人世界,这是 DeepMind 截至 2017 年 12 月的最新和最大成就。我们向您展示了如何使用功能强大的 Keras API 和 TensorFlow 后端为 Connect4 训练类似 AlphaZero 的模型,以及如何测试并可能改善这种模型。 然后,我们冻结了该模型,并详细介绍了如何构建 iOS 和 Android 应用以使用该模型,以及如何使用基于模型的 AI 玩 Connect4。 尚不能完全击败人类象棋或 GO 冠军的确切 AlphaZero 模型,但我们希望本章为您提供扎实的基础,并激发您继续进行工作,以复制 AlphaZero 最初所做的工作并将其进一步扩展到其他问题领域。 这将需要很多努力,但完全值得。
如果最新的 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。
虽然 TensorFlow Lite 在 iOS 和 Android 上均可使用,但在 Android 设备上运行时,它也可以利用 Android Neural Networks API 进行硬件加速。 另一方面,iOS 开发人员可以利用 Core ML, Apple 针对 iOS 11 或更高版本的最新机器学习框架,该框架支持运行许多强大的预训练深度学习模型,以及使用经典的机器学习算法和 Keras,以优化的方式在设备上以最小的应用二进制文件大小运行。 在下一章中,我们将介绍如何在 iOS 和 Android 应用中使用 TensorFlow Lite 和 Core ML。
此差异已折叠。
# 在 Raspberry Pi 上开发 TensorFlow 应用程序
# 在 Raspberry Pi 上开发 TensorFlow 应用
根据 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 3B 板,包括本章中使用的所有必要配件,以使其能够看,听和说。 然后,我们将介绍如何使用 [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 3B 板,包括本章中使用的所有必要配件,以使其能够看,听和说。 然后,我们将介绍如何使用 [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 工具包,如何在模拟环境中实现强大的强化学习算法,以使我们的机器人能够在真实环境中移动和平衡身体。
......@@ -239,7 +239,7 @@ make -f tensorflow/contrib/makefile/Makefile HOST_OS=PI TARGET=PI \
OPTFLAGS="-Os -mfpu=neon-vfpv4 -funsafe-math-optimizations -ftree-vectorize" CXX=g++-4.8
```
经过几个小时的构建,您可能会收到诸如“虚拟内存耗尽:无法分配内存”之类的错误,否则 Pi 板将由于内存不足而冻结。 要解决此问题,我们需要设置一个交换,因为没有交换,当应用程序用尽内存时,由于内核崩溃,该应用程序将被杀死。 设置交换的方法有两种:交换文件和交换分区。 Raspbian 在 SD 卡上使用默认的 100MB 交换文件,如下所示,使用`free`命令:
经过几个小时的构建,您可能会收到诸如“虚拟内存耗尽:无法分配内存”之类的错误,否则 Pi 板将由于内存不足而冻结。 要解决此问题,我们需要设置一个交换,因为没有交换,当应用用尽内存时,由于内核崩溃,该应用将被杀死。 设置交换的方法有两种:交换文件和交换分区。 Raspbian 在 SD 卡上使用默认的 100MB 交换文件,如下所示,使用`free`命令:
```py
pi@raspberrypi:~/tensorflow-1.6.0 $ free -h
......@@ -299,7 +299,7 @@ make -f tensorflow/contrib/makefile/Makefile HOST_OS=PI TARGET=PI \
`tensorflow/contrib/pi_examples: label_image`和相机中有两个 [TensorFlow Raspberry Pi 示例应用程序](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/pi_examples)。 我们将修改相机示例应用程序,以将文本集成到语音中,以便该应用程序在四处走动时可以说出其识别出的图像。 在构建和测试这两个应用程序之前,我们需要安装一些库并下载预构建的 TensorFlow Inception 模型文件:
`tensorflow/contrib/pi_examples: label_image`和相机中有两个 [TensorFlow Raspberry Pi 示例应用](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/pi_examples)。 我们将修改相机示例应用,以将文本集成到语音中,以便该应用在四处走动时可以说出其识别出的图像。 在构建和测试这两个应用之前,我们需要安装一些库并下载预构建的 TensorFlow Inception 模型文件:
```py
sudo apt-get install -y libjpeg-dev
......@@ -311,14 +311,14 @@ cd ~/tensorflow-1.6.0
unzip /tmp/inception_dec_2015_stripped.zip -d tensorflow/contrib/pi_examples/label_image/data/
```
要构建`label_image`和相机应用程序,请运行:
要构建`label_image`和相机应用,请运行:
```py
make -f tensorflow/contrib/pi_examples/label_image/Makefile
make -f tensorflow/contrib/pi_examples/camera/Makefile
```
构建应用程序时,您可能会遇到以下错误:
构建应用时,您可能会遇到以下错误:
```py
./tensorflow/core/platform/default/mutex.h:25:22: fatal error: nsync_cv.h: No such file or directory
......@@ -337,7 +337,7 @@ make -f tensorflow/contrib/pi_examples/camera/Makefile
-lnsync \
```
要测试运行这两个应用程序,请直接运行这些应用程序
要测试运行这两个应用,请直接运行这些应用
```py
tensorflow/contrib/pi_examples/label_image/gen/bin/label_image
......@@ -346,13 +346,13 @@ tensorflow/contrib/pi_examples/camera/gen/bin/camera
看看 C++ 源代码`tensorflow/contrib/pi_examples/label_image/label_image.cc``tensorflow/contrib/pi_examples/camera/camera.cc`,您会看到它们使用与前几章中的 iOS 应用类似的 C++ 代码来加载模型图文件,准备输入张量,运行模型,并获得输出张量。
默认情况下,摄像机示例还使用`label_image/data`文件夹中解压缩的预构建 Inception 模型。 但是对于您自己的特定图像分类任务,提供通过迁移学习重新训练的模型。您可以像第 2 章,“通过迁移学习对图像进行分类”一样,在运行两个示例应用程序时使用`--graph`参数。
默认情况下,摄像机示例还使用`label_image/data`文件夹中解压缩的预构建 Inception 模型。 但是对于您自己的特定图像分类任务,提供通过迁移学习重新训练的模型。您可以像第 2 章,“通过迁移学习对图像进行分类”一样,在运行两个示例应用时使用`--graph`参数。
通常,语音是 Raspberry Pi 机器人与我们互动的主要 UI。 理想情况下,我们应该运行 TensorFlow 支持的自然声音**文本到语音****TTS**)模型,例如 [WaveNet](https://deepmind.com/blog/wavenet-generative-model-raw-audio)[Tacotron](https://github.com/keithito/tacotron),但运行和部署不在本章范围之内。 这样的模型。 事实证明,我们可以使用称为 [CMU **Flite**](http://www.festvox.org/flite) 的简单得多的 TTS 库,它提供了相当不错的 TTS,并且只需一个简单的命令即可安装它:`sudo apt-get install flite`。 如果要安装最新版本的 Flite 以期希望获得更好的 TTS 质量,只需从链接下载最新的 Flite 源并进行构建。
要使用我们的 USB 扬声器测试 Flite,请使用`-t`参数运行 flite,然后使用双引号引起来的文本字符串,例如 `flite -t "i recommend the ATM machine"`。 如果您不喜欢默认语音,则可以通过运行 `flite -lv`找到其他受支持的语音,它们应返回 `Voices available: kal awb_time kal16 awb rms slt` 。 然后,您可以指定用于 TTS 的语音: `flite -voice rms -t "i recommend the ATM machine"`
要使相机应用程序说出识别出的对象,这是当 Raspberry Pi 机器人四处移动时所期望的行为,可以使用以下简单的`pipe`命令:
要使相机应用说出识别出的对象,这是当 Raspberry Pi 机器人四处移动时所期望的行为,可以使用以下简单的`pipe`命令:
```py
tensorflow/contrib/pi_examples/camera/gen/bin/camera | xargs -n 1 flite -t
......@@ -415,7 +415,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)
......@@ -474,7 +474,7 @@ INFO:audio:go
INFO:audio:stop
```
您可以在单独的终端中运行相机应用程序,因此,当机器人根据您的语音命令走动时,它会识别出所看到的新图像并说出结果。 这就是构建一个基本的 Raspberry Pi 机器人所需的全部内容,该机器人可以听,动,看和说-Google I/O 2016 演示所做的事情,却不使用任何 Cloud API。 它远不是一个能听懂自然人的语音,进行有趣的对话或执行有用且不重要的任务的幻想机器人。 但是,借助预训练,再训练或其他强大的 TensorFlow 模型,并使用各种传感器,您当然可以为我们构建的 Pi 机器人增加越来越多的智能和物理动力。
您可以在单独的终端中运行相机应用,因此,当机器人根据您的语音命令走动时,它会识别出所看到的新图像并说出结果。 这就是构建一个基本的 Raspberry Pi 机器人所需的全部内容,该机器人可以听,动,看和说-Google I/O 2016 演示所做的事情,却不使用任何 Cloud API。 它远不是一个能听懂自然人的语音,进行有趣的对话或执行有用且不重要的任务的幻想机器人。 但是,借助预训练,再训练或其他强大的 TensorFlow 模型,并使用各种传感器,您当然可以为我们构建的 Pi 机器人增加越来越多的智能和物理动力。
在下一节中,您将看到如何在 Pi 上运行经过预训练和再训练的 TensorFlow 模型,我们将向您展示如何向使用 TensorFlow 构建和训练的机器人添加强大的强化学习模型。 毕竟,强化学习的反复试验方式及其与环境交互以获取最大回报的本质,使得强化学习成为机器人非常合适的机器学习方法。
......@@ -737,7 +737,7 @@ print(np.mean(total_rewards))
现在让我们看看我们是否可以制定出更好,更复杂的政策。 回想一下,策略只是从状态到操作的映射或功能。 在过去的几年中,我们在神经网络的兴起中了解到的一件事是,如果不清楚如何定义复杂的功能(例如强化学习中的策略),请考虑一下神经网络,毕竟这是通用函数近似器 (有关详细信息,请参见[神经网络可以计算任何函数的可视化证明](http://neuralnetworksanddeeplearning.com/chap4.html),Michael Nelson)。
在上一章中我们介绍了 AlphaGo 和 AlphaZero,Jim Fleming 撰写了一篇有趣的博客文章,标题为[“在 AlphaGo 之前的 TD-Gammon”](https://medium.com/jim-fleming/before-alphago-there-was-td-gammon-13deff866197),这是第一个强化学习应用程序,它使用神经网络作为评估功能来训练自己,以击败五子棋冠军。 博客条目和 Sutton 和 Barto 的《强化学习:入门》一书都对 TD-Gammon 进行了深入的描述。 如果您想了解有关使用神经网络作为强大的通用函数的更多信息,还可以使用 Google 搜索“时差学习和 TD-Gammon”的原始论文。
在上一章中我们介绍了 AlphaGo 和 AlphaZero,Jim Fleming 撰写了一篇有趣的博客文章,标题为[“在 AlphaGo 之前的 TD-Gammon”](https://medium.com/jim-fleming/before-alphago-there-was-td-gammon-13deff866197),这是第一个强化学习应用,它使用神经网络作为评估功能来训练自己,以击败五子棋冠军。 博客条目和 Sutton 和 Barto 的《强化学习:入门》一书都对 TD-Gammon 进行了深入的描述。 如果您想了解有关使用神经网络作为强大的通用函数的更多信息,还可以使用 Google 搜索“时差学习和 TD-Gammon”的原始论文。
......@@ -1031,13 +1031,13 @@ pi@raspberrypi:~/mobiletf/ch12 $ python nn_pg.py
因此,该说再见了。 在本书中,我们从三个经过预训练的 TensorFlow 模型开始,这些模型分别是图像分类,对象检测和神经样式转换,并详细讨论了如何重新训练模型并在 iOS 和 Android 应用中使用它们。 然后,我们介绍了使用 Python 构建的 TensorFlow 教程中的三个有趣的模型(音频识别,图像字幕和快速绘制),并展示了如何在移动设备上重新训练和运行这些模型。
因此,该说再见了。 在本书中,我们从三个经过预训练的 TensorFlow 模型开始,这些模型分别是图像分类,对象检测和神经样式转换,并详细讨论了如何重新训练模型并在 iOS 和 Android 应用中使用它们。 然后,我们介绍了使用 Python 构建的 TensorFlow 教程中的三个有趣的模型(音频识别,图像字幕和快速绘制),并展示了如何在移动设备上重新训练和运行这些模型。
之后,我们从零开始开发了用于预测 TensorFlow 和 Keras 中的股价的 RNN 模型,两个用于数字识别和像素转换的 GAN 模型以及一个用于 Connect4 的类似于 AlphaZero 的模型,以及使用所有这些 TensorFlow 模型的完整 iOS 和 Android 应用 。 然后,我们介绍了如何将 TensorFlow Lite 以及 Apple 的 Core ML 与标准机器学习模型和转换后的 TensorFlow 模型一起使用,展示了它们的潜力和局限性。 最后,我们探索了如何使用 TensorFlow 构建 Raspberry Pi 机器人,该机器人可以使用强大的强化学习算法来移动,观看,聆听,讲话和学习。
我们还展示了同时使用 TensorFlow Pod 和手动构建的 TensorFlow 库的 Objective-C 和 Swift iOS 应用程序,以及使用即用型 TensorFlow 库和手动构建库的 Android 应用程序,以修复您在移动设备上部署和运行 TensorFlow 模型时可能遇到的各种问题。
我们还展示了同时使用 TensorFlow Pod 和手动构建的 TensorFlow 库的 Objective-C 和 Swift iOS 应用,以及使用即用型 TensorFlow 库和手动构建库的 Android 应用,以修复您在移动设备上部署和运行 TensorFlow 模型时可能遇到的各种问题。
我们已经介绍了很多,但是还有很多要讲的。 TensorFlow 的新版本已经快速发布。 已经构建并实现了采用最新研究论文的新 TensorFlow 模型。 本书的主要目的是向您展示使用各种智能 TensorFlow 模型的足够的 iOS 和 Android 应用程序,以及所有实用的故障排除和调试技巧,以便您可以在移动设备上为你的下一个杀手级移动 AI 应用程序快速部署和运行自己喜欢的 TensorFlow 模型。
我们已经介绍了很多,但是还有很多要讲的。 TensorFlow 的新版本已经快速发布。 已经构建并实现了采用最新研究论文的新 TensorFlow 模型。 本书的主要目的是向您展示使用各种智能 TensorFlow 模型的足够的 iOS 和 Android 应用,以及所有实用的故障排除和调试技巧,以便您可以在移动设备上为你的下一个杀手级移动 AI 应用快速部署和运行自己喜欢的 TensorFlow 模型。
如果您想使用 TensorFlow 或 Keras 构建自己的出色模型,实现最令您兴奋的算法和网络,则需要在本书结束后继续学习,因为我们没有详细介绍如何做到这一点, 但希望我们能激发您足够的动力来开始这一旅程,并从书中获得保证,一旦您构建并训练了模型,便知道如何快速,随时随地在移动设备上部署和运行它们。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册