diff --git a/new/ai-py/00.md b/new/ai-py/00.md index bf182fcd47e79a8d1d5021beab37c270c7af234a..9e78e9a185ea629cd7aedc77e3a54145948c41fb 100644 --- a/new/ai-py/00.md +++ b/new/ai-py/00.md @@ -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 库来构建实际应用。 本着这种精神,我们试图使所有代码尽可能友好和可读。 我们认为,这将使我们的读者能够轻松理解代码并在不同的场景中轻松使用它。 ## 使用的约定 diff --git a/new/ai-py/01.md b/new/ai-py/01.md index d226466b7757a4c3b4c5eb9bccb41f117e814e4c..5d9af94463acae93bc253cb1faa8ac556b55bf01 100644 --- a/new/ai-py/01.md +++ b/new/ai-py/01.md @@ -1,6 +1,6 @@ # 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 diff --git a/new/ai-py/02.md b/new/ai-py/02.md index 6b49e0d5e5aeb5ad1495ab3820ab8dbb83dd1668..60b9a21cea938beee298ef17635cccaa7fe54ad2 100644 --- a/new/ai-py/02.md +++ b/new/ai-py/02.md @@ -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 的财产,然后可用于其他应用。 有趣的是,技术在该领域将如何继续发展。 diff --git a/new/ai-py/03.md b/new/ai-py/03.md index d532649b10fcf8aba32ffe9bcbb5bb3585e50115..7d53e3019c352eb8334cdc55a94229e6ce8d27ce 100644 --- a/new/ai-py/03.md +++ b/new/ai-py/03.md @@ -319,8 +319,8 @@ * **CPU 利用率**:识别峰值以及是否可以解释峰值。 * **内存使用情况**:正在消耗多少内存。 -* **磁盘使用率**:我们的应用程序消耗了多少磁盘空间。 -* **网络 I/O 流量**:如果我们的应用程序跨越实例,则衡量网络流量非常重要。 +* **磁盘使用率**:我们的应用消耗了多少磁盘空间。 +* **网络 I/O 流量**:如果我们的应用跨越实例,则衡量网络流量非常重要。 * **延迟**:发生数据传输所花费的时间。 * **吞吐量**:成功传输的数据量。 diff --git a/new/ai-py/07.md b/new/ai-py/07.md index 14417258eaf88cec3480a48e84c2a061eaee640b..835f8a352fc8567ea1ad2cd3846b3baabcd42014 100644 --- a/new/ai-py/07.md +++ b/new/ai-py/07.md @@ -174,7 +174,7 @@ plt.show() ## 使用均值漂移算法估计群集数 -**均值漂移**是用于无监督学习的功能强大的算法。 这是一种经常用于聚类的非参数算法。 它是非参数的,因为它不对基础分布进行任何假设。 这与参量技术形成对比,参量技术假定基础数据遵循标准概率分布。 MeanShift 在对象跟踪和实时数据分析等领域中找到了许多应用程序。 +**均值漂移**是用于无监督学习的功能强大的算法。 这是一种经常用于聚类的非参数算法。 它是非参数的,因为它不对基础分布进行任何假设。 这与参量技术形成对比,参量技术假定基础数据遵循标准概率分布。 MeanShift 在对象跟踪和实时数据分析等领域中找到了许多应用。 在均值漂移算法中,整个特征空间被视为概率密度函数。 我们从训练数据集开始,并假设它是从概率密度函数中采样的。 diff --git a/new/ai-py/11.md b/new/ai-py/11.md index 4147d23ea9f9d1084de97e11de3c52c35808a6a4..3aa470d088fe90123c9c5ce3c3d2e4ef9421d362 100644 --- a/new/ai-py/11.md +++ b/new/ai-py/11.md @@ -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 的广泛而多样的应用为您所熟悉。 也许您将能够提出自己独特的应用,并利用获得的知识来推动该领域的发展。 # 总结 diff --git a/new/ai-py/12.md b/new/ai-py/12.md index a3d26ffccf10cd242278f90df5fabd5b94a20902..5eebaf4ca489b39649d8ce2715c87b6d30d70784 100644 --- a/new/ai-py/12.md +++ b/new/ai-py/12.md @@ -60,9 +60,9 @@ AWS 还拥有一支由顾问组成的大军,致力于帮助其客户部署 AWS 传统的工作负载通常由传统上是 Microsoft 客户的客户在 Azure 上运行,并试图利用他们以前在该技术堆栈中的投资。 -对于新的云部署,由于 Microsoft 为应用程序开发提供了强大的产品,专业的**平台即服务**(**PaaS**)功能,数据存储,机器学习和**物联网**(**IoT**)服务,Azure 云服务吸引人们。 +对于新的云部署,由于 Microsoft 为应用开发提供了强大的产品,专业的**平台即服务**(**PaaS**)功能,数据存储,机器学习和**物联网**(**IoT**)服务,Azure 云服务吸引人们。 -在战略上致力于 Microsoft 技术堆栈的企业已经能够在生产中部署许多大型应用程序。 当开发人员完全致力于 Microsoft 产品套件(例如.NET 应用程序),然后将其部署在 Azure 上时,Azure 尤其有用。 微软之所以能够深入市场,是因为其经验丰富的销售人员和广泛的合作伙伴网络。 +在战略上致力于 Microsoft 技术堆栈的企业已经能够在生产中部署许多大型应用。 当开发人员完全致力于 Microsoft 产品套件(例如.NET 应用),然后将其部署在 Azure 上时,Azure 尤其有用。 微软之所以能够深入市场,是因为其经验丰富的销售人员和广泛的合作伙伴网络。 此外,微软意识到,下一轮技术战将不会围绕操作系统展开,而是会围绕云进行,因此它们已越来越多地接受采用非微软操作系统。 为了证明这一点,到目前为止,大约一半的 Azure 工作负载运行在 Linux 或其他开源操作系统和技术堆栈上。 @@ -120,7 +120,7 @@ OCI 同时提供虚拟服务器和裸机服务器,并一键式安装和配置 OCI 吸引具有 Oracle 工作负载的客户,这些工作负载只需要基本的**基础架构即服务**(**IaaS**)功能。 -Oracle 的云战略依赖于其应用程序,数据库和中间件。 +Oracle 的云战略依赖于其应用,数据库和中间件。 Oracle 在吸引其他云提供商的人才以增强其产品方面取得了一些进展。 它还在赢得新业务和使现有的 Oracle 客户转移到 OCI 云方面取得了一些进展。 但是,Oracle 在赶上三巨头之前还有很长的路要走。 @@ -238,7 +238,7 @@ Amazon Comprehend 是 AWS 提供的**自然语言处理**(**NLP**)服务。 **控制台访问**:可以从 AWS 管理控制台访问 Amazon Comprehend 。 将数据提取到服务中的最简单方法之一是使用 Amazon S3。 然后,我们可以调用 Comprehend 服务以分析文本中的关键短语和关系。 理解可以为每个用户请求返回一个置信度分数,以确定准确性的置信度; 百分比越高,服务越有信心。 Comprehend 可以轻松地批量处理单个请求或多个请求。 -可用的**应用程序编程接口**(**API**):截至为止,Comprehend 提供了六个不同的 API 来提供见解。 他们是: +可用的**应用编程接口**(**API**):截至为止,Comprehend 提供了六个不同的 API 来提供见解。 他们是: * **关键字提取 API**:标识关键字和术语。 * **情感分析 API**:返回文本的整体含义和感觉,无论是是肯定,否定,中立还是混合。 @@ -251,7 +251,7 @@ Amazon Comprehend 是 AWS 提供的**自然语言处理**(**NLP**)服务。 ## Amazon Rekognition – 图片和视频 -不,不是错字。 亚马逊用 k 而不是 c 命名其识别服务。 Amazon Rekognition 可以执行图像和视频分析,并使用户可以将此功能添加到其应用程序中。 Amazon Rekognition 已经接受了数百万张带有标签的图像的预训练。 因此,该服务可以快速识别: +不,不是错字。 亚马逊用 k 而不是 c 命名其识别服务。 Amazon Rekognition 可以执行图像和视频分析,并使用户可以将此功能添加到其应用中。 Amazon Rekognition 已经接受了数百万张带有标签的图像的预训练。 因此,该服务可以快速识别: * **对象类型**:椅子,桌子,汽车等 * **名人**:演员,政客,运动员等 @@ -260,15 +260,15 @@ Amazon Comprehend 是 AWS 提供的**自然语言处理**(**NLP**)服务。 * **场景**:跳舞,庆祝,吃饭等 * **不当内容**:成人,暴力或视觉干扰的内容 -Amazon Rekognition 已经识别出数十亿张图像和视频,并使用它们不断变得越来越好。 深度学习在图像识别领域的应用可以说是过去几年中最成功的机器学习应用程序,而 Amazon Rekognition 利用深度学习来提供令人印象深刻的结果。 要使用它,不需要具有高水平的机器学习专业知识。 Amazon Rekognition 提供了一个简单的 API。 要使用它,将图像和一些参数一起传递到服务,就是这样。 Amazon Rekognition 只会继续变得更好。 它使用得越多,收到的输入就越多,并且从这些输入中学到的越多。 此外,Amazon 继续增强服务并向该服务添加新功能。 +Amazon Rekognition 已经识别出数十亿张图像和视频,并使用它们不断变得越来越好。 深度学习在图像识别领域的应用可以说是过去几年中最成功的机器学习应用,而 Amazon Rekognition 利用深度学习来提供令人印象深刻的结果。 要使用它,不需要具有高水平的机器学习专业知识。 Amazon Rekognition 提供了一个简单的 API。 要使用它,将图像和一些参数一起传递到服务,就是这样。 Amazon Rekognition 只会继续变得更好。 它使用得越多,收到的输入就越多,并且从这些输入中学到的越多。 此外,Amazon 继续增强服务并向该服务添加新功能。 -Amazon Rekognition 最受欢迎的一些用例和应用程序包括: +Amazon Rekognition 最受欢迎的一些用例和应用包括: **对象,场景和活动检测**:使用 Amazon Rekognition,您可以识别成千上万种不同类型的对象(例如,汽车,房屋,椅子等)和场景(例如, 城市,购物中心,海滩等)。 分析视频时,可以识别帧中正在发生的特定活动,例如“清空后备箱”或“孩子们玩耍”。 **性别识别**:Amazon Rekognition 可用于进行有根据的猜测,以确定图像中的人是男性还是女性。 该功能不应用作一个人的性别的唯一决定因素。 它并不意味着以这种方式使用。 例如,如果男演员戴着长发假发和耳环饰演角色,则可能被识别为女性。 -**面部识别和分析**:面部识别系统的用途之一是从图像或视频中识别和验证人。 这项技术已经存在了几十年,但是直到最近,它的应用才变得更加流行,便宜和可用,这在很大程度上要归功于深度学习技术和 Rekognition 等服务的普遍存在。 面部识别技术支持当今的许多应用程序,例如照片共享和存储服务,并且是智能手机身份验证工作流中的第二个因素。 +**面部识别和分析**:面部识别系统的用途之一是从图像或视频中识别和验证人。 这项技术已经存在了几十年,但是直到最近,它的应用才变得更加流行,便宜和可用,这在很大程度上要归功于深度学习技术和 Rekognition 等服务的普遍存在。 面部识别技术支持当今的许多应用,例如照片共享和存储服务,并且是智能手机身份验证工作流中的第二个因素。 一旦我们认识到物体是一张脸,就可能要执行进一步的脸部分析。 Amazon Rekognition 可以帮助确定的一些属性包括: @@ -357,13 +357,13 @@ Amazon Translate 使用机器学习和连续学习模型来改善其翻译的性 ## 亚马逊机器学习 -在出现 Amazon SageMaker 之前,就有了 Amazon Machine Learning 或 Amazon ML。 Amazon ML 是一项更简单的服务,在某些情况下仍可以是功能强大的工具。 Amazon ML 最初于 2015 年 4 月在旧金山的 AWS 峰会上发布。 Amazon ML 使所有技能水平的开发人员都可以轻松使用机器学习技术。 Amazon ML 提供了可视化工具和向导,可以指导用户完成创建机器学习模型的过程,而无需学习复杂的 ML 算法和技术。 一旦模型准备就绪,Amazon ML 即可轻松获得预测。 应用程序可以使用简单的 API,而不必在完全托管的服务中实现自定义预测代码。 +在出现 Amazon SageMaker 之前,就有了 Amazon Machine Learning 或 Amazon ML。 Amazon ML 是一项更简单的服务,在某些情况下仍可以是功能强大的工具。 Amazon ML 最初于 2015 年 4 月在旧金山的 AWS 峰会上发布。 Amazon ML 使所有技能水平的开发人员都可以轻松使用机器学习技术。 Amazon ML 提供了可视化工具和向导,可以指导用户完成创建机器学习模型的过程,而无需学习复杂的 ML 算法和技术。 一旦模型准备就绪,Amazon ML 即可轻松获得预测。 应用可以使用简单的 API,而不必在完全托管的服务中实现自定义预测代码。 ## Amazon Transcribe – 转录 在 2017 年 re:Invent 会议上发布的另一项服务是 Amazon Transcribe。 您可以将 Amazon Transcribe 当作您的私人秘书,在讲话时做笔记。 -Amazon Transcribe 是**自动语音识别**(**ASR**)服务,允许开发人员向各种应用程序添加语音到文本功能。 Amazon Transcribe API 可用于分析存储的音频文件。 该服务返回一个包含转录语音的文本文件。 Amazon Transcribe 也可以实时使用。 它可以接收实时音频流,并将生成包含转录文本的实时流。 +Amazon Transcribe 是**自动语音识别**(**ASR**)服务,允许开发人员向各种应用添加语音到文本功能。 Amazon Transcribe API 可用于分析存储的音频文件。 该服务返回一个包含转录语音的文本文件。 Amazon Transcribe 也可以实时使用。 它可以接收实时音频流,并将生成包含转录文本的实时流。 Amazon Transcribe 可用于转录客户服务呼叫并生成音频和视频内容的字幕。 该服务支持常见的音频格式,例如 WAV 和 MP3。 它可以为每个单词生成一个时间戳。 这有助于使用生成的文本快速找到原始音频源。 像其他 Amazon 机器学习服务一样,Amazon Transcribe 不断从文本中学习其正在处理以不断改进服务。 @@ -379,7 +379,7 @@ Amazon Textract 使用户可以从文档,表单和表格中提取文本。 Ama ## Microsoft Azure 机器学习工作室 -Microsoft Azure Machine Learning Studio 是 Microsoft 对 Amazon SageMaker 的回答。 Machine Learning Studio 是一个协作工具,具有简单的拖放界面,允许用户构建,测试和部署机器学习模型。 Machine Learning Studio 支持模型发布,该模型发布可被其他应用程序使用,并可轻松与 BI 工具(例如 Excel)集成。 +Microsoft Azure Machine Learning Studio 是 Microsoft 对 Amazon SageMaker 的回答。 Machine Learning Studio 是一个协作工具,具有简单的拖放界面,允许用户构建,测试和部署机器学习模型。 Machine Learning Studio 支持模型发布,该模型发布可被其他应用使用,并可轻松与 BI 工具(例如 Excel)集成。 **Machine Learning Studio 交互式工作区**:在第 3 章,“机器学习管道”中,我们学习了关于机器学习管道的信息。 Machine Learning Studio 交互式工作区通过允许用户轻松地将数据提取到工作区,转换数据,然后通过各种数据操作和统计功能分析数据并最终生成预测,从而简化了管道开发。 开发机器学习管道通常是一个迭代过程,而工作区使执行此迭代开发变得简单。 在修改各种功能及其参数时,您将能够可视化和分析模型的性能,直到对结果满意为止。 @@ -440,14 +440,14 @@ Learning Studio 不需要任何编程。 通过直观地连接数据集和模块 ## Azure 机器学习服务 -**Azure 机器学习**(**AML**)服务是一个平台,可让数据科学家和数据工程师大规模地在云中训练,部署,自动化和管理机器学习模型 。 服务的用户可以使用基于 Python 的库来创建功能强大的应用程序和工作流。 AML 服务是一个框架,允许开发人员使用预定义的数据集训练模型,然后将其模型作为 Web 服务包装在 Docker 容器中,并使用各种容器协调器进行部署。 +**Azure 机器学习**(**AML**)服务是一个平台,可让数据科学家和数据工程师大规模地在云中训练,部署,自动化和管理机器学习模型 。 服务的用户可以使用基于 Python 的库来创建功能强大的应用和工作流。 AML 服务是一个框架,允许开发人员使用预定义的数据集训练模型,然后将其模型作为 Web 服务包装在 Docker 容器中,并使用各种容器协调器进行部署。 可以通过以下两种方式之一访问和使用 Azure 机器学习服务: * 通过软件开发工具包(SDK) * 使用服务可视界面 -如果您认为这听起来很像 Azure Machine Learning Studio,那么您会认为是正确的。 这些是类似的服务,并且在某个时候,Microsoft 可能会决定将它们合并在一起或弃用其中之一。 如果它们不推荐使用其中之一,则可以高度肯定地假定 Microsoft 将提供一种将其中一项服务中开发的工作流和应用程序迁移到另一项中的方法。 +如果您认为这听起来很像 Azure Machine Learning Studio,那么您会认为是正确的。 这些是类似的服务,并且在某个时候,Microsoft 可能会决定将它们合并在一起或弃用其中之一。 如果它们不推荐使用其中之一,则可以高度肯定地假定 Microsoft 将提供一种将其中一项服务中开发的工作流和应用迁移到另一项中的方法。 机器学习 Studio 与 Azure 机器学习服务有何不同? 这些是主要区别,这使您可以决定使用哪个: @@ -478,15 +478,15 @@ Learning Studio 不需要任何编程。 通过直观地连接数据集和模块 ## Azure 认知服务 -**决策服务**:允许用户构建可提供建议并支持有效决策的应用程序。 +**决策服务**:允许用户构建可提供建议并支持有效决策的应用。 -**视觉服务**:启用应用程序,这些应用程序可以识别,标识,字幕,索引以及适度的图像和视频。 +**视觉服务**:启用应用,这些应用可以识别,标识,字幕,索引以及适度的图像和视频。 **语音服务**:此服务将语音转换为文本,并将文本转换为自然声音。 它还可以执行从一种语言到另一种语言的翻译。 此外,它还支持说话人验证和识别。 -**搜索服务**:Bing 可以向应用程序添加搜索支持,并使用户可以通过单个 API 调用来搜索数十亿个网页,图像,视频和新闻文章。 +**搜索服务**:Bing 可以向应用添加搜索支持,并使用户可以通过单个 API 调用来搜索数十亿个网页,图像,视频和新闻文章。 -**语言服务**:使应用程序能够使用预先构建的脚本处理自然语言,以评估文本情感并确定文本的整体实体。 +**语言服务**:使应用能够使用预先构建的脚本处理自然语言,以评估文本情感并确定文本的整体实体。 # Google Cloud Platform(GCP) @@ -514,23 +514,23 @@ AI Hub 是 Google Cloud Platform 中可用的服务之一。 AI Hub 是即插即 **Google Cloud AutoML 自定义模型**:AutoML 服务使用 Google 的最新迁移学习和神经架构搜索技术,允许用户为各种用例创建特定于领域的自定义模型。 -**Google Cloud 预训练的 API**:在处理常见用例时,使用预先训练的 API 的 Google 服务用户可以立即变得富有成效,而无需事先训练模型。 预训练的 API 不断透明地升级,以提高这些模型的速度和准确性。 +**Google Cloud 预训练的 API**:在处理常见用例时,使用预训练的 API 的 Google 服务用户可以立即变得富有成效,而无需事先训练模型。 预训练的 API 不断透明地升级,以提高这些模型的速度和准确性。 -**Vision AI 和 AutoML Vision**:该服务允许用户使用 AutoML Vision 或使用预先训练的 Vision API 模型从图像中获取见解。 此服务可以检测情感,理解文字等。 +**Vision AI 和 AutoML Vision**:该服务允许用户使用 AutoML Vision 或使用预训练的 Vision API 模型从图像中获取见解。 此服务可以检测情感,理解文字等。 -要使用该服务,可以使用自定义图像模型上传和分析图像。 该服务具有易于使用的可视界面。 该服务使您可以优化模型的准确性,延迟和大小。 结果可以导出到云中的其他应用程序或边缘的一系列设备。 +要使用该服务,可以使用自定义图像模型上传和分析图像。 该服务具有易于使用的可视界面。 该服务使您可以优化模型的准确性,延迟和大小。 结果可以导出到云中的其他应用或边缘的一系列设备。 -Google Cloud 的 Vision API 提供了功能强大的经过预先训练的机器学习模型,可以使用 RESTful 和 RPC API 调用进行访问。 该服务可以快速标记图像并对其进行分类。 该服务已经过预训练,已经包含数百万个类别。 它也可以用于面部识别和分析,以及识别图像中的标题并将其转换为文本。 +Google Cloud 的 Vision API 提供了功能强大的经过预训练的机器学习模型,可以使用 RESTful 和 RPC API 调用进行访问。 该服务可以快速标记图像并对其进行分类。 该服务已经过预训练,已经包含数百万个类别。 它也可以用于面部识别和分析,以及识别图像中的标题并将其转换为文本。 -**AutoML 视频智能和视频智能 API**:AutoML 视频智能服务具有一个简单的界面,该界面可以使用自定义模型识别,跟踪和分类视频中的对象。 该服务不需要编程或人工智能方面的广泛背景。 该服务用于需要自定义标签的应用程序,而这些标签不能由经过预先训练的 Video Intelligence API 生成。 +**AutoML 视频智能和视频智能 API**:AutoML 视频智能服务具有一个简单的界面,该界面可以使用自定义模型识别,跟踪和分类视频中的对象。 该服务不需要编程或人工智能方面的广泛背景。 该服务用于需要自定义标签的应用,而这些标签不能由经过预训练的 Video Intelligence API 生成。 -Video Intelligence API 具有经过预先训练的模型,可以识别各种常见的对象,场景和活动。 除了存储的视频外,它还支持流视频。 随着处理更多图像,它会随着时间的推移自动透明地改善。 +Video Intelligence API 具有经过预训练的模型,可以识别各种常见的对象,场景和活动。 除了存储的视频外,它还支持流视频。 随着处理更多图像,它会随着时间的推移自动透明地改善。 **AutoML 翻译和翻译 API**:很少或没有编程经验的开发人员和翻译人员都可以创建生产质量的模型。 Translation API 使用预训练的神经网络算法来提供世界一流的机器翻译,在某些情况下,这种翻译已开始与人类水平的表现相抗衡。 **AutoML 自然语言和自然语言 API**:该服务可用于对文本分类,执行实体提取和情感检测,所有这些都使用简单易用的 API。 用户可以利用 AutoML 自然语言界面来提供数据集并确定将使用哪些自定义模型。 -Natural 语言 API 具有预先训练的模型,该模型使 API 的用户可以访问**自然语言理解**(**NLU**)功能,包括: +Natural 语言 API 具有预训练的模型,该模型使 API 的用户可以访问**自然语言理解**(**NLU**)功能,包括: * 实体分析 * 情感分析 @@ -545,18 +545,18 @@ Natural 语言 API 具有预先训练的模型,该模型使 API 的用户可 * 松弛 * Alexa 语音服务 -**文字转语音**:Google Cloud 文字转语音可以将文字转换为类似人类的语音,并具有 30 多种语言和口音的 180 多种语音。 例如,它可以模仿美国的口音或英国的口音。 它使用语音合成(WaveNet)和 Google 开发的神经网络来提供高保真音频。 用户可以调用 API 并创建逼真的交互。 不难想象,我们很快就会看到这种技术已嵌入到各种客户服务应用程序中。 +**文字转语音**:Google Cloud 文字转语音可以将文字转换为类似人类的语音,并具有 30 多种语言和口音的 180 多种语音。 例如,它可以模仿美国的口音或英国的口音。 它使用语音合成(WaveNet)和 Google 开发的神经网络来提供高保真音频。 用户可以调用 API 并创建逼真的交互。 不难想象,我们很快就会看到这种技术已嵌入到各种客户服务应用中。 **语音转文本**:您可以将视为该服务与先前的服务相反。 如果*文本到语音*是声音,则*语音到文本*提供了耳朵。 Google Cloud 语音转文本功能使服务的用户可以利用神经网络模型将音频文件转换为文本。 这些模型的复杂性对服务的用户完全隐藏了,他们可以调用一个易于使用的 API 来调用它。 撰写本文时,API 支持 120 多种语言和变体。 它可以用于: -* 在应用程序中启用语音命令 +* 在应用中启用语音命令 * 转录呼叫中心对话 * 与工作流程中的其他 Google 和非 Google 服务集成 * 实时处理音频以及预先录制的版本 **AutoML 表**:该服务使分析人员,开发人员和数据科学家可以在结构化数据上构建和部署机器学习模型。 在许多用例中,它几乎不需要编码,因此可以大大提高部署速度。 在这些情况下,可通过类似向导的界面进行配置。 当需要编码时,AutoML Tables 支持 *Colab 笔记本*。 这些笔记本是功能强大的笔记本,类似于 Jupyter 笔记本,并具有许多使其易于使用并与其他用户协作的附加功能。 该服务是域无关的,因此可以用来解决各种各样的问题。 截至 2019 年 10 月,该服务仍未普遍可用,但可以通过 Beta 版访问。 -**推荐 AI**:此 Google 服务可以大规模提供高度个性化的产品推荐。 二十多年来,Google 一直在其旗舰产品(例如 Google Ads,Google 搜索和 YouTube)中提供建议。 建议 AI 利用该经验,使服务的用户能够在各种应用程序和用例中提供个性化的建议,以满足个人客户的需求和偏好。 在撰写本文时,该产品也处于 beta 版本,因此通常不可用。 +**推荐 AI**:此 Google 服务可以大规模提供高度个性化的产品推荐。 二十多年来,Google 一直在其旗舰产品(例如 Google Ads,Google 搜索和 YouTube)中提供建议。 建议 AI 利用该经验,使服务的用户能够在各种应用和用例中提供个性化的建议,以满足个人客户的需求和偏好。 在撰写本文时,该产品也处于 beta 版本,因此通常不可用。 # 总结 diff --git a/new/ai-py/13.md b/new/ai-py/13.md index 535ff2976fdaf991108fd831865dc4c2e64e7641..941721076b9ba4d3630c1ea234e9df6121d634fe 100644 --- a/new/ai-py/13.md +++ b/new/ai-py/13.md @@ -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__': diff --git a/new/ai-py/15.md b/new/ai-py/15.md index f9b115797fb6db06ef66bc69cce39ff6b74a02b6..d525f373f81f7c615858ef89711cc1b234d3868b 100644 --- a/new/ai-py/15.md +++ b/new/ai-py/15.md @@ -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 diff --git a/new/ai-py/16.md b/new/ai-py/16.md index de0937353cb0c8557327f5d0238c4a603277dff3..9a697c794cc4c5e481a511fa5ded92206606cfd1 100644 --- a/new/ai-py/16.md +++ b/new/ai-py/16.md @@ -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,请使用以下命令: diff --git a/new/ai-py/17.md b/new/ai-py/17.md index e36de65112068aa1a6669396b44054f33006c346..781286dbeeef69f1c03450df7cd104a35552f023 100644 --- a/new/ai-py/17.md +++ b/new/ai-py/17.md @@ -33,7 +33,7 @@ * 影响股票价格的因素很多,这使它成为一个非常复杂的系统。 * 股票中一些最剧烈的变动发生在市场交易时间之外,这使得实时处理这些信息变得困难。 -**应用程序日志**:根据定义,应用程序日志具有两个组成部分。 指示操作何时发生以及正在记录信息或错误的时间戳。 +**应用日志**:根据定义,应用日志具有两个组成部分。 指示操作何时发生以及正在记录信息或错误的时间戳。 **IoT 活动**:IoT 设备中的活动以时间顺序方式发生,因此可以用作时间的数据。 diff --git a/new/ai-py/18.md b/new/ai-py/18.md index d407ab83a58272cf0c801a03f9e7c43603e81795..0fe125af11a027d142964883c5bd476337945be6 100644 --- a/new/ai-py/18.md +++ b/new/ai-py/18.md @@ -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() 窃听上一节中的想法,我们可以使用在本节中学到的技术为电影(或胡须或胡须等)中的屏幕角色添加眼镜。 -我想到的另一个应用程序是跟踪卡车驾驶员的眼睛,并确定他们眨眼或闭上眼睛的速度,以查看他们是否感到疲倦,并要求他们(可能是强迫他们)翻身。 +我想到的另一个应用是跟踪卡车驾驶员的眼睛,并确定他们眨眼或闭上眼睛的速度,以查看他们是否感到疲倦,并要求他们(可能是强迫他们)翻身。 本章旨在演示如何在各种应用中使用图像识别。 我们期待您的来信,并结合您自己的想法,学习如何应用本章中学到的技术。 diff --git a/new/ai-py/19.md b/new/ai-py/19.md index a6c15051230fee8b7784cc1e89b172c955a6ac8a..a1cf32f1e2b5eea1e69d00b1dcdef07496bd2794 100644 --- a/new/ai-py/19.md +++ b/new/ai-py/19.md @@ -660,7 +660,7 @@ if __name__=='__main__': 神经网络可以将用于光学字符识别。 它可能是其最常见的用例之一。 将手写体转换为计算机字符一直是许多计算机科学家试图解决的基本问题,但仍然难以捉摸。 我们已经取得了长足的进步,但是,由于显而易见的原因,100% 的准确性仍然遥不可及。 为什么? -考虑这种情况。 您曾经写下任何东西吗?五分钟后,您无法阅读自己的笔迹? 计算机也总是会出现此问题。 写下数字`6`的方法有无数种,其中有些看起来比`6`更像`0`或`5`。 我可能是错的,但是我认为我们将找到一种治愈癌症的方法,然后才能找到一种可靠的方法来使计算机识别医生的笔迹。 我们已经可以达到很高的准确性,并且*笔迹越漂亮*,阅读起来就越容易。 我们继续尝试解决此问题的原因是,这是一个有价值的目标,具有许多应用程序。 举一个简短的例子,医生的时间受到高度重视。 随着系统能够更好地识别他们的笔记,他们将获得更多的精力来专注于实际治疗和帮助患者的精力,而不再关注文书工作。 +考虑这种情况。 您曾经写下任何东西吗?五分钟后,您无法阅读自己的笔迹? 计算机也总是会出现此问题。 写下数字`6`的方法有无数种,其中有些看起来比`6`更像`0`或`5`。 我可能是错的,但是我认为我们将找到一种治愈癌症的方法,然后才能找到一种可靠的方法来使计算机识别医生的笔迹。 我们已经可以达到很高的准确性,并且*笔迹越漂亮*,阅读起来就越容易。 我们继续尝试解决此问题的原因是,这是一个有价值的目标,具有许多应用。 举一个简短的例子,医生的时间受到高度重视。 随着系统能够更好地识别他们的笔记,他们将获得更多的精力来专注于实际治疗和帮助患者的精力,而不再关注文书工作。 **光学字符识别**(**OCR**)是识别图像中手写字符的过程。 在构建模型之前,让我们使熟悉数据集。 [我们将使用以下位置提供的数据集](http://ai.stanford.edu/~btaskar/ocr)。 diff --git a/new/ai-py/20.md b/new/ai-py/20.md index 09a07201baea815f70e081bc3f7f0c24c79da0c1..25ad57a092d575d7e2f59484d90d94c7889ac335 100644 --- a/new/ai-py/20.md +++ b/new/ai-py/20.md @@ -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 的视频,并且开发人员使这些数字说出了他们从未说过的短语。 他们可能是很现实的。 或者可以将视频或图像更改为看起来像不同的人。 这是在麻省理工学院创建的唐纳德·特朗普总统形象之上插入尼古拉斯·凯奇的脸的例子: diff --git a/new/ai-py/21.md b/new/ai-py/21.md index 5c7edea8868027850e1d9940ff9b9f37526de4db..2041305100e38a215402f89a4836c56961ec2856 100644 --- a/new/ai-py/21.md +++ b/new/ai-py/21.md @@ -160,7 +160,7 @@ RNN 之所以称为递归,是因为这些算法对序列的每个元素执行 首先,像这样的模型可以用作评分机制。 语言模型可用于选择最可能的下一个单词。 从直觉上讲,最可能出现的下一个单词在语法上可能是正确的。 -语言建模具有重要应用程序。 因为它可以预测给定前面单词的单词的概率,所以可以将其用于**自然文本生成**(**NTG**)。 给定一个现有的单词序列,从概率最高的单词列表中建议一个单词,然后重复该过程,直到生成完整的句子为止。 +语言建模具有重要应用。 因为它可以预测给定前面单词的单词的概率,所以可以将其用于**自然文本生成**(**NTG**)。 给定一个现有的单词序列,从概率最高的单词列表中建议一个单词,然后重复该过程,直到生成完整的句子为止。 注意,在前面的等式中,每个单词的概率以所有先前的单词为条件。 在更实际的情况下,由于计算或内存限制,模型可能很难代表长期依赖关系。 因此,大多数模型通常仅限于仅查看少量的先前单词。 @@ -471,7 +471,7 @@ RMSE 是方差的平方根。 可以将其解释为无法解释的方差的标 此外,RNN 的计算量很大,因此生成准确的预测可能会花费大量时间。 如果我们无法使用合适的硬件,那几乎是肯定的。 -尽管如此,RNN 已经取得了许多突破,并且数据科学界继续不断地为其寻找新的应用程序。 不仅如此,它们的性能和准确性也在不断提高。 到目前为止,我们将提高您已经设计的神经网络的性能和功能,并提出您自己的示例,说明如何将网络应用于其他领域。 快乐的编码。 +尽管如此,RNN 已经取得了许多突破,并且数据科学界继续不断地为其寻找新的应用。 不仅如此,它们的性能和准确性也在不断提高。 到目前为止,我们将提高您已经设计的神经网络的性能和功能,并提出您自己的示例,说明如何将网络应用于其他领域。 快乐的编码。 # 总结 diff --git a/new/ai-py/22.md b/new/ai-py/22.md index 1c2238dad4bc84c42a2ef1cd6bcde179069d4892..7fdf089cc1b167ce496f0984a9d9b51847bd05a3 100644 --- a/new/ai-py/22.md +++ b/new/ai-py/22.md @@ -35,7 +35,7 @@ RL 是指学习操作方法并将情况映射到某些动作以最大化回报 # 强化学习的实际示例 -让我们看看 RL 在现实世界中出现的位置。 这将帮助我们了解它的工作原理以及使用此可以构建哪些可能的应用程序,除非: +让我们看看 RL 在现实世界中出现的位置。 这将帮助我们了解它的工作原理以及使用此可以构建哪些可能的应用,除非: **游戏**:让我们考虑一下棋类游戏,例如围棋或象棋。 为了确定最佳动作,玩家需要考虑各种因素。 可能性的数量如此之大,以至于无法进行暴力搜索。 如果我们要使用传统技术制造一台可以玩这种游戏的机器,则需要指定许多规则来涵盖所有这些可能性。 RL 完全绕过了这个问题。 我们不需要手动指定任何逻辑规则。 学习代理仅通过示例学习并与自己玩游戏。 diff --git a/new/ai-py/23.md b/new/ai-py/23.md index b797a075dabfe356c20b1ef8af2d6797737fae33..29256b9aa050f1d68b3ec48835b9ee0352ae4ddf 100644 --- a/new/ai-py/23.md +++ b/new/ai-py/23.md @@ -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 diff --git a/new/gan-proj/3.md b/new/gan-proj/3.md index 173ae6832330fbf60a7754548c27ce75313feb05..e7367b340d3dd2be10c417622ab2ef7ceab49068 100644 --- a/new/gan-proj/3.md +++ b/new/gan-proj/3.md @@ -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 可以加快此过程并降低创建和模拟人脸的成本。 diff --git a/new/gan-proj/5.md b/new/gan-proj/5.md index 474bcab180c5daf45942bcd2b6be2057e85e1805..e45a9ddfd38a50bf6b895c7e93b524d90e54ca23 100644 --- a/new/gan-proj/5.md +++ b/new/gan-proj/5.md @@ -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 及其不同的应用。 diff --git a/new/gan-proj/9.md b/new/gan-proj/9.md index 6aa655d84bcf5bf35764971a36c2bfca0c8ace7e..f7960fc08f0ca56426c2c55ad91fb2622f9dd6b6 100644 --- a/new/gan-proj/9.md +++ b/new/gan-proj/9.md @@ -58,7 +58,7 @@ -未来几年,我们将看到 GAN 的更多商业应用。 GAN 的许多商业应用已经开发,并给人留下了积极的印象。 例如,移动应用程序 Prisma 是 GAN 最早获得广泛成功的应用程序之一。 我们可能会在不久的将来看到 GAN 的民主化,一旦我们这样做了,我们将开始看到 GAN 改善了我们的日常生活。 +未来几年,我们将看到 GAN 的更多商业应用。 GAN 的许多商业应用已经开发,并给人留下了积极的印象。 例如,移动应用 Prisma 是 GAN 最早获得广泛成功的应用之一。 我们可能会在不久的将来看到 GAN 的民主化,一旦我们这样做了,我们将开始看到 GAN 改善了我们的日常生活。 diff --git a/new/handson-unsup-learn-py/01.md b/new/handson-unsup-learn-py/01.md index 84b70d65362d8f65f7f21fb49f326e531353df5e..33fe93d9d6ad167a59dcf6788277c5c023ebe2d0 100644 --- a/new/handson-unsup-learn-py/01.md +++ b/new/handson-unsup-learn-py/01.md @@ -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 仍然是最佳选择,这就是为什么它被选为本书的原因。 diff --git a/new/handson-unsup-learn-py/02.md b/new/handson-unsup-learn-py/02.md index ee78ef5f84605487917a840d4758b1847a52e7ae..2351b1ac23a2bf9dd59646f6d45d685c9fbcf35d 100644 --- a/new/handson-unsup-learn-py/02.md +++ b/new/handson-unsup-learn-py/02.md @@ -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])`。 集群中最可能的数量是? diff --git a/new/handson-unsup-learn-py/04.md b/new/handson-unsup-learn-py/04.md index e07d32859a18328015f5346aeab5a86fbe05ba9a..5aa6fc389cadcbf736cc321884099de8c9e80686 100644 --- a/new/handson-unsup-learn-py/04.md +++ b/new/handson-unsup-learn-py/04.md @@ -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 }回答。 当然,在这种情况下,这是一个微不足道的问题,可以通过查看数据图来解决,但是对于高维数据集,如果没有树状图的支持,它可能会变得更加困难。 diff --git a/new/handson-unsup-learn-py/05.md b/new/handson-unsup-learn-py/05.md index 5c9597b73aba619aba7bf0961dc061f64e4d307d..62f7b9854ec8e415f6da000b376f755c21e3f65e 100644 --- a/new/handson-unsup-learn-py/05.md +++ b/new/handson-unsup-learn-py/05.md @@ -224,7 +224,7 @@ print(W[:, im]) 在这种情况下,每个样本在每个高斯下始终具有非零概率,其影响取决于其均值和协方差矩阵。 例如,对应于`x`-位置的点 2.5 既可以属于中央高斯,也可以属于右手的点(而左手的影响最小)。 如本章开头所述,通过选择影响最大的组件(`argmax`),可以将任何软聚类算法转换为硬聚类算法。 -您将立即理解,在这种特定情况下,对于对角协方差矩阵,`argmax` 提供了一条附加信息(该信息已被 K 均值完全丢弃),可用于进一步的处理步骤(即, 推荐器应用程序可以提取所有群集的主要特征,然后根据相对概率对它们进行加权。 +您将立即理解,在这种特定情况下,对于对角协方差矩阵,`argmax` 提供了一条附加信息(该信息已被 K 均值完全丢弃),可用于进一步的处理步骤(即, 推荐器应用可以提取所有群集的主要特征,然后根据相对概率对它们进行加权。 diff --git a/new/handson-unsup-learn-py/08.md b/new/handson-unsup-learn-py/08.md index 006d841b0275a9edc82be0e19a396e332f854205..eb55aaac575afa4c1811e65c44dd1482dc9d19f8 100644 --- a/new/handson-unsup-learn-py/08.md +++ b/new/handson-unsup-learn-py/08.md @@ -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 非常强大(例如,在天体物理学领域有一些科学应用),即使它们的结构不像其他更新的模型那样灵活。 但是,复杂度通常较高,因此,我总是建议从较小的模型开始,仅在最终精度不足以满足特定目的的情况下才增加层和/或神经元的数量。 diff --git a/new/handson-unsup-learn-py/09.md b/new/handson-unsup-learn-py/09.md index 38096e524eeaf991e48b2d16101c397ad5c2c2de..d0b5b6fdb9a8604913734cbaa1a2196cf3549a37 100644 --- a/new/handson-unsup-learn-py/09.md +++ b/new/handson-unsup-learn-py/09.md @@ -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 距离表达式。 当图形完全定义后,可以创建一个会话并初始化所有变量,如下所示: diff --git a/new/intel-mobi-proj-tf/00.md b/new/intel-mobi-proj-tf/00.md index 38bfd2558d9ce45c112c4a21cc24826264512be8..b735acdfc66641029e85b620ba8210159a5c934f 100644 --- a/new/intel-mobi-proj-tf/00.md +++ b/new/intel-mobi-proj-tf/00.md @@ -6,15 +6,15 @@ **人工智能**(**AI**),是计算机中人类智能的模拟,历史悠久。 自 1956 年正式诞生以来,人工智能经历了数次兴衰。 持续不断的 AI 复兴或新的 AI 革命始于深度学习的突破。深度学习是机器学习的一个分支,由于深度学习,机器学习的分支现已成为 AI 最热门的分支。 深度卷积神经网络(**DCNN**)赢得了 ImageNet 大规模视觉识别挑战赛,其错误率仅为 16.4%,相比之下,第二好的非 DCNN 模型错误率为 26.2%。 自 2012 年以来,基于 DCNN 的改进条目每年都赢得了 ImageNet 挑战,并且深度学习技术已应用于计算机视觉以外的许多硬 AI 问题,例如语音识别,机器翻译和围棋游戏,从而取得了接连而至的突破。 2016 年 3 月,谷歌 DeepMind 的 AlphaGo 通过深度强化学习构建,击败了 18 届人类世界围棋冠军 Lee Sedol 4:1。 在 2017 年 Google I/O 大会上,Google 宣布他们正从移动优先转变为 AI 优先。 其他领先的公司,例如亚马逊,苹果,Facebook 和微软,都对 AI 进行了大量投资,并推出了许多基于 AI 的产品。 -TensorFlow 是 Google 的开放源代码框架,用于构建机器学习 AI 应用程序。 自 2015 年 11 月首次发布以来,TensorFlow 已经有数个流行的开源深度学习框架,在不到两年的时间内,它已迅速成为最受欢迎的开源深度学习框架。 每周都会构建新的 TensorFlow 模型,以解决需要人类甚至是超人类智能的所有任务。 关于 TensorFlow 的数十本书已经出版。 TensorFlow 上的更多在线博客,教程,课程和视频已可用。 很明显,AI 和 TensorFlow 很热门,但为什么还要再加上一本书标题中带有“ TensorFlow”一词呢? +TensorFlow 是 Google 的开放源代码框架,用于构建机器学习 AI 应用。 自 2015 年 11 月首次发布以来,TensorFlow 已经有数个流行的开源深度学习框架,在不到两年的时间内,它已迅速成为最受欢迎的开源深度学习框架。 每周都会构建新的 TensorFlow 模型,以解决需要人类甚至是超人类智能的所有任务。 关于 TensorFlow 的数十本书已经出版。 TensorFlow 上的更多在线博客,教程,课程和视频已可用。 很明显,AI 和 TensorFlow 很热门,但为什么还要再加上一本书标题中带有“ TensorFlow”一词呢? 这是一本独特的书,也是第一本将 TensorFlow 驱动的 AI 与移动设备相结合的书,将最光明的未来与现在最繁荣的世界联系在一起。 在过去的十年中,我们都见证并经历了 iOS 和 Android 智能手机的革命,而我们刚刚开始的 AI 革命将对我们周围的世界产生更深远的影响。 还有什么比将两个世界的精华融合在一起的主题更好,这本书展示了如何在随时随地的移动设备上构建 TensorFlow AI 应用? -的确,您可以使用许多现有的云 AI API 来构建 AI 应用,有时这很有意义。 但是,在移动设备上完全运行 AI 应用程序的好处是,即使没有可用的网络连接,无法承受往返云服务器的费用或用户不想发送云服务时,您也可以运行应用程序,将手机上的数据发送给其他任何人。 +的确,您可以使用许多现有的云 AI API 来构建 AI 应用,有时这很有意义。 但是,在移动设备上完全运行 AI 应用的好处是,即使没有可用的网络连接,无法承受往返云服务器的费用或用户不想发送云服务时,您也可以运行应用,将手机上的数据发送给其他任何人。 -确实,在 TensorFlow 开源项目中已经有一些 TensorFlow iOS 和 Android 应用程序示例,可以帮助您开始使用移动 TensorFlow。 但是,如果您曾经尝试在 iOS 或 Android 设备上运行令您惊讶的酷 TensorFlow 模型,则很可能会遇到很多麻烦,然后才能在手机上成功看到运行的模型。 +确实,在 TensorFlow 开源项目中已经有一些 TensorFlow iOS 和 Android 应用示例,可以帮助您开始使用移动 TensorFlow。 但是,如果您曾经尝试在 iOS 或 Android 设备上运行令您惊讶的酷 TensorFlow 模型,则很可能会遇到很多麻烦,然后才能在手机上成功看到运行的模型。 -本书向您展示了如何解决在移动平台上运行 TensorFlow 模型时可能遇到的所有常见问题,从而可以节省大量时间和精力。 您会在一书中看到超过 10 个完整的从零开始构建的 TensorFlow iOS 和 Android 应用程序,它们运行着各种凉爽的 TensorFlow 模型,包括最新和最酷的**生成对抗网络**(**GAN**)和类似 AlphaZero 的模型。 +本书向您展示了如何解决在移动平台上运行 TensorFlow 模型时可能遇到的所有常见问题,从而可以节省大量时间和精力。 您会在一书中看到超过 10 个完整的从零开始构建的 TensorFlow iOS 和 Android 应用,它们运行着各种凉爽的 TensorFlow 模型,包括最新和最酷的**生成对抗网络**(**GAN**)和类似 AlphaZero 的模型。 @@ -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 或 Android 示例 TensorFlow 应用中使用模型。 最后,我们将向您展示如何训练 YOLO2(另一个流行的对象检测模型),该模型也在示例 TensorFlow Android 应用程序中使用,以及如何在 iOS 应用程序中使用它。 +第 3 章,“检测对象及其位置”,快速概述了对象检测,然后向您展示如何设置 TensorFlow 对象检测 API 并使用它来重新训练 SSD-MobileNet 和 Faster RCNN 模型。 我们还将通过手动构建 TensorFlow iOS 库以支持非默认 TensorFlow 操作的方式,向您展示如何在 iOS 或 Android 示例 TensorFlow 应用中使用模型。 最后,我们将向您展示如何训练 YOLO2(另一个流行的对象检测模型),该模型也在示例 TensorFlow Android 应用中使用,以及如何在 iOS 应用中使用它。 -第 4 章,“变换具有惊人艺术风格的图片” 首先概述了神经样式转换在过去几年中的快速发展。 然后,它向您展示了如何训练快速的神经样式转换模型,以及如何在 iOS 和 Android 应用中使用它们。 之后,我们将介绍如何在您自己的 iOS 和 Android 应用程序中使用 TensorFlow Magenta 多样式模型轻松创建令人惊叹的艺术风格。 +第 4 章,“变换具有惊人艺术风格的图片” 首先概述了神经样式转换在过去几年中的快速发展。 然后,它向您展示了如何训练快速的神经样式转换模型,以及如何在 iOS 和 Android 应用中使用它们。 之后,我们将介绍如何在您自己的 iOS 和 Android 应用中使用 TensorFlow Magenta 多样式模型轻松创建令人惊叹的艺术风格。 第 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 的工作原理以及如何在 TensorFlow 作为后端的 Keras 中,训练和测试 AlphaZero 的模型,开始玩一个简单但有趣的游戏,名为 Connect4。 然后,我们将向您展示完整的 iOS 和 Android 应用程序,以使用该模型并在您的移动设备上玩 Connect4 游戏。 +第 10 章,“构建类似 AlphaZero 的手机游戏应用”,从最新和最酷的 AlphaZero 的工作原理以及如何在 TensorFlow 作为后端的 Keras 中,训练和测试 AlphaZero 的模型,开始玩一个简单但有趣的游戏,名为 Connect4。 然后,我们将向您展示完整的 iOS 和 Android 应用,以使用该模型并在您的移动设备上玩 Connect4 游戏。 第 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 在模拟环境中从头开始构建和训练强大的基于神经网络的强化学习策略模型,以使机器人学会保持平衡。 @@ -66,33 +66,33 @@ TensorFlow 是 Google 的开放源代码框架,用于构建机器学习 AI 应 -我们建议您先按顺序阅读前四章,然后运行[这里](http://github.com/jeffxtang/mobiletfbook)。 这将帮助您确保已为 TensorFlow 移动应用程序开发设置了全部开发环境,并且知道如何将 TensorFlow 集成到自己的 iOS 和/或 Android 应用程序中。 如果您是 iOS 开发人员,还将学习如何在 TensorFlow 中使用 Objective-C 或 Swift,以及何时以及如何使用 TensorFlow pod 或手动 TensorFlow iOS 库。 +我们建议您先按顺序阅读前四章,然后运行[这里](http://github.com/jeffxtang/mobiletfbook)。 这将帮助您确保已为 TensorFlow 移动应用开发设置了全部开发环境,并且知道如何将 TensorFlow 集成到自己的 iOS 和/或 Android 应用中。 如果您是 iOS 开发人员,还将学习如何在 TensorFlow 中使用 Objective-C 或 Swift,以及何时以及如何使用 TensorFlow pod 或手动 TensorFlow iOS 库。 -然后,如果您需要构建自定义的 TensorFlow Android 库,请转到第 7 章,“使用 CNN 和 LSTM 识别图形”,以及如果您想学习如何在您的移动应用程序中使用 Keras 模型,请查看第 8 章,“使用 RNN 预测股价”,和第 10 章, “构建类似 AlphaZero 的手机游戏应用程序” 。 +然后,如果您需要构建自定义的 TensorFlow Android 库,请转到第 7 章,“使用 CNN 和 LSTM 识别图形”,以及如果您想学习如何在您的移动应用中使用 Keras 模型,请查看第 8 章,“使用 RNN 预测股价”,和第 10 章, “构建类似 AlphaZero 的手机游戏应用” 。 -如果您对 TensorFlow Lite 或 Core ML 更感兴趣,请阅读第 11 章,“在移动设备上使用 TensorFlow Lite 和 Core ML”,以及您对 Raspberry Pi 上的 TensorFlow 或 TensorFlow 中的强化学习最感兴趣,请跳至第 12 章,“在 Raspberry Pi 上开发 TensorFlow 应用程序”。 +如果您对 TensorFlow Lite 或 Core ML 更感兴趣,请阅读第 11 章,“在移动设备上使用 TensorFlow Lite 和 Core ML”,以及您对 Raspberry Pi 上的 TensorFlow 或 TensorFlow 中的强化学习最感兴趣,请跳至第 12 章,“在 Raspberry Pi 上开发 TensorFlow 应用”。 -除此之外,您可以阅读第 5 至 10 章,以了解如何训练不同类型的 CNN,RNN,LSTM,GAN 和 AlphaZero 模型以及如何在移动设备上使用它们,也许是运行 iOS 和/ 或每章的 Android 应用程式,然后再研究详细的实作。 另外,您可以直接跳到最感兴趣的模型的任何章节。 请注意,稍后的章节可能会参考较早的章节以获取一些重复的细节,例如将 TensorFlow 自定义 iOS 库添加到 iOS 应用中的步骤,或通过构建 TensorFlow 自定义库来修复某些模型加载或运行错误的步骤。 但是,请放心,您不会迷路,或者至少我们已尽力提供了用户友好的分步教程,并偶尔参考了先前教程的某些步骤,以帮助您避免在构建移动 TensorFlow 应用程序时可能会遇到的一切陷阱,同时也避免了重复自己。 +除此之外,您可以阅读第 5 至 10 章,以了解如何训练不同类型的 CNN,RNN,LSTM,GAN 和 AlphaZero 模型以及如何在移动设备上使用它们,也许是运行 iOS 和/ 或每章的 Android 应用程式,然后再研究详细的实作。 另外,您可以直接跳到最感兴趣的模型的任何章节。 请注意,稍后的章节可能会参考较早的章节以获取一些重复的细节,例如将 TensorFlow 自定义 iOS 库添加到 iOS 应用中的步骤,或通过构建 TensorFlow 自定义库来修复某些模型加载或运行错误的步骤。 但是,请放心,您不会迷路,或者至少我们已尽力提供了用户友好的分步教程,并偶尔参考了先前教程的某些步骤,以帮助您避免在构建移动 TensorFlow 应用时可能会遇到的一切陷阱,同时也避免了重复自己。 -# 什么时候看书 +# 什么时候看这本书 人工智能,或其最热门的分支机器学习,或其最热门的分支深度学习,近年来发展迅速。 由 Google 支持并在所有开源机器学习框架中最受欢迎的开发人员社区的 TensorFlow 新版本也以更快的速度发布。 当我们于 2017 年 12 月开始写书时,最新的 TensorFlow 版本为 1.4.0,于 2017 年 11 月 2 日发布,之后的 1.5.0 是 2018 年 1 月 26 日发布的,而 1.6.0 是 2018 年 2 月 28 日发布的,1.7 2018 年 3 月 29 日为.0,2018 年 4 月 27 日为 1.8.0。本书中所有的 iOS,Android 和 Python 代码均已使用所有这些 TensorFlow 版本进行了测试。 不过,到您阅读本书时,最新的 TensorFlow 版本可能会晚于 1.8.0。 -事实证明,您无需太担心 TensorFlow 的新版本。 本书中的代码很可能将在最新的 TensorFlow 版本上无缝运行。 在我们的测试中,在 TensorFlow 1.4、1.5、1.6、1.7 和 1.8 上运行应用程序时,我们根本没有进行任何代码更改。 可能是在更高版本中,默认情况下将支持更多 TensorFlow 操作,因此您无需构建自定义 TensorFlow 库,也可以以更简单的方式构建自定义 TensorFlow 库。 +事实证明,您无需太担心 TensorFlow 的新版本。 本书中的代码很可能将在最新的 TensorFlow 版本上无缝运行。 在我们的测试中,在 TensorFlow 1.4、1.5、1.6、1.7 和 1.8 上运行应用时,我们根本没有进行任何代码更改。 可能是在更高版本中,默认情况下将支持更多 TensorFlow 操作,因此您无需构建自定义 TensorFlow 库,也可以以更简单的方式构建自定义 TensorFlow 库。 -当然,我们不能保证所有代码在将来的所有 TensorFlow 版本中都不会更改而运行,但是无论书本是在什么时候阅读,无论现在还是几个月后,本书中都包含了所有详细的教程和故障排除技巧,您应该使用 TensorFlow 1.4-1.8 或更高版本,可以使阅读本书和在本书中运行应用程序的过程顺利进行。 +当然,我们不能保证所有代码在将来的所有 TensorFlow 版本中都不会更改而运行,但是无论书本是在什么时候阅读,无论现在还是几个月后,本书中都包含了所有详细的教程和故障排除技巧,您应该使用 TensorFlow 1.4-1.8 或更高版本,可以使阅读本书和在本书中运行应用的过程顺利进行。 由于我们必须在某些时候停止使用特定的 TensorFlow 版本才能出版该书,因此我们将继续在每个新的主要 TensorFlow 版本中测试运行该书中的所有代码,并相应地在[源代码存储库](http://github.com/jeffxtang/mobiletfbook)中更新该书的代码和测试结果。 如果您对代码或书籍有任何疑问,也可以直接在存储库中发布问题。 另一个问题是 TensorFlow Mobile 和 TensorFlow Lite 之间的选择。 该书在大多数章节(1 至 10)中介绍了 TensorFlow Mobile。 TensorFlow Lite 可能是在移动设备上运行 TensorFlow 的未来,它在 Google I/O 2018 上仍处于开发人员预览版中,这就是 Google 希望您“使用 TensorFlow Mobile 覆盖生产案例”的原因。 即使在 TensorFlow Lite 正式发布后,根据 Google 的说法,“ TensorFlow Mobile 不会很快消失”-实际上,在本书出版之前我们测试了最新的 TensorFlow 1.8.0 版本,我们发现使用 TensorFlow Mobile 变得更加简单。 -如果 TensorFlow Lite 在所有用例中完全取代 TensorFlow Mobile 的那一天(具有 Lite 更好的性能和更小的尺寸)终于到了,那么您从书本中学到的技能将只会为您做好准备。 同时,在那个不可预见的未来到来之前,您可以阅读这本书并了解如何使用 TensorFlow Mobile 这样的老大哥在您的移动应用程序中运行所有这些功能强大的 TensorFlow 模型。 +如果 TensorFlow Lite 在所有用例中完全取代 TensorFlow Mobile 的那一天(具有 Lite 更好的性能和更小的尺寸)终于到了,那么您从书本中学到的技能将只会为您做好准备。 同时,在那个不可预见的未来到来之前,您可以阅读这本书并了解如何使用 TensorFlow Mobile 这样的老大哥在您的移动应用中运行所有这些功能强大的 TensorFlow 模型。 diff --git a/new/intel-mobi-proj-tf/01.md b/new/intel-mobi-proj-tf/01.md index a0d57606250c923287c60c25fd38dbce3facf990..50c0bea6df7d0f0a45ff392b6100f1581e1c857d 100644 --- a/new/intel-mobi-proj-tf/01.md +++ b/new/intel-mobi-proj-tf/01.md @@ -4,11 +4,11 @@ -本章介绍如何设置开发环境,以使用 TensorFlow 构建所有 iOS 或 Android 应用程序,本书其余部分对此进行了讨论。 我们不会详细讨论可用于开发的所有受支持的 TensorFlow 版本,OS 版本,Xcode 和 Android Studio 版本,因为可以在 [TensorFlow 网站](http://www.tensorflow.org)或通过 Google。 相反,我们将在本章中简要讨论示例工作环境,以便我们能够快速了解​​可使用该环境构建的所有出色应用程序。 +本章介绍如何设置开发环境,以使用 TensorFlow 构建所有 iOS 或 Android 应用,本书其余部分对此进行了讨论。 我们不会详细讨论可用于开发的所有受支持的 TensorFlow 版本,OS 版本,Xcode 和 Android Studio 版本,因为可以在 [TensorFlow 网站](http://www.tensorflow.org)或通过 Google。 相反,我们将在本章中简要讨论示例工作环境,以便我们能够快速了解​​可使用该环境构建的所有出色应用。 -如果您已经安装了 TensorFlow,Xcode 和 Android Studio,并且可以运行和测试示例 TensorFlow iOS 和 Android 应用程序,并且如果您已经安装了 NVIDIA GPU 以进行更快的深度学习模型训练,则可以跳过本章。 或者,您可以直接跳到您不熟悉的部分。 +如果您已经安装了 TensorFlow,Xcode 和 Android Studio,并且可以运行和测试示例 TensorFlow iOS 和 Android 应用,并且如果您已经安装了 NVIDIA GPU 以进行更快的深度学习模型训练,则可以跳过本章。 或者,您可以直接跳到您不熟悉的部分。 -我们将在本章涵盖以下主题(如何设置 Raspberry Pi 开发环境将在第 12 章,“在 Raspberry Pi 上开发 TensorFlow 应用程序”中进行讨论): +我们将在本章涵盖以下主题(如何设置 Raspberry Pi 开发环境将在第 12 章,“在 Raspberry Pi 上开发 TensorFlow 应用”中进行讨论): * 设置 TensorFlow * 设置 Xcode @@ -31,11 +31,11 @@ TensorFlow 是领先的机器智能开源框架。 当 Google 在 2015 年 11 我们假设您已经对 TensorFlow 有了基本的了解,但是如果您还没有,请查看[入门](https://www.tensorflow.org/get_started)和[教程](https://www.tensorflow.org/tutorials)部分或 [Awesome TensorFlow 教程](https://github.com/jtoy/awesome-tensorflow)。 关于该主题的两本好书是《Python 机器学习:Python , scikit-learn 和 TensorFlow 机器学习和深度学习》和《使用 Scikit-Learn 和 TensorFlow 动手进行机器学习》。 -TensorFlow 可以安装在 MacOS,Ubuntu 或 Windows 上。 我们将介绍在 MacOS X El Capitan(10.11.6),macOS Sierra(10.12.6)和 Ubuntu 16.04 上从源代码安装 TensorFlow 1.4 的步骤。 如果您使用其他操作系统或版本,则可以参考 [TensorFlow 安装文档](https://www.tensorflow.org/install)以获取更多信息。 当您阅读本书时,可能会出现更新的 TensorFlow 版本。 尽管您仍然应该能够使用较新版本运行本书中的代码,但这并不能保证,因此我们在 Mac 和 Ubuntu 上使用 TensorFlow 1.4 发行源代码来设置 TensorFlow; 这样,您可以轻松地测试运行并与书中的应用程序一起玩。 +TensorFlow 可以安装在 MacOS,Ubuntu 或 Windows 上。 我们将介绍在 MacOS X El Capitan(10.11.6),macOS Sierra(10.12.6)和 Ubuntu 16.04 上从源代码安装 TensorFlow 1.4 的步骤。 如果您使用其他操作系统或版本,则可以参考 [TensorFlow 安装文档](https://www.tensorflow.org/install)以获取更多信息。 当您阅读本书时,可能会出现更新的 TensorFlow 版本。 尽管您仍然应该能够使用较新版本运行本书中的代码,但这并不能保证,因此我们在 Mac 和 Ubuntu 上使用 TensorFlow 1.4 发行源代码来设置 TensorFlow; 这样,您可以轻松地测试运行并与书中的应用一起玩。 自从我们于 2017 年 12 月撰写以上段落以来,TensorFlow 已有四个新的正式版本(1.5、1.6、1.7和1.8),以及截至 2018 年 5 月的新版本 Xcode(9.3),您可以在[以下位置](https://github.com/tensorflow/tensorflow/releases)下载, 或在 TensorFlow [源代码仓库](https://github.com/tensorflow/tensorflow)。 TensorFlow 的较新版本(例如 1.8)默认情况下支持 NVIDIA CUDA 和 cuDNN 的较新版本(有关详细信息,请参阅“在 Ubuntu 上设置基于 GPU 的 TensorFlow”部分),并且最好遵循官方的 TensorFlow 文档来安装具有 GPU 支持的最新 TensorFlow 版本。 在本章及以下各章中,我们将以特定的 TensorFlow 版本为例,但将对所有 iOS,Android 和 Python 代码进行测试,并在需要时针对其中的最新 TensorFlow,Xcode 和 Android Studio 版本进行更新。 本书的源代码仓库位于[这里](https://github.com/jeffxtang/mobiletfbook)。 -总体而言,我们将在 Mac 上使用 TensorFlow 开发 iOS 和 Android TensorFlow 应用程序,并在 Ubuntu 上使用 TensorFlow 训练应用中使用的深度学习模型。 +总体而言,我们将在 Mac 上使用 TensorFlow 开发 iOS 和 Android TensorFlow 应用,并在 Ubuntu 上使用 TensorFlow 训练应用中使用的深度学习模型。 @@ -45,7 +45,7 @@ TensorFlow 可以安装在 MacOS,Ubuntu 或 Windows 上。 我们将介绍在 -通常,您应该使用 VirtualEnv,Docker 或 Anaconda 安装在单独的环境中安装 TensorFlow。 但是由于我们必须使用 TensorFlow 源代码构建 iOS 和 Android TensorFlow 应用程序,因此我们不妨从源代码构建 TensorFlow 本身,在这种情况下,使用本机 PIP 安装选择可能比其他选择更容易。 如果您想尝试不同的 TensorFlow 版本,我们建议您使用 VirtualEnv,Docker 和 Anaconda 选项之一安装其他 TensorFlow 版本。 在这里,我们将使用本地 PIP 和 Python 2.7.10 直接在 MacOS 系统上安装 TensorFlow 1.4。 +通常,您应该使用 VirtualEnv,Docker 或 Anaconda 安装在单独的环境中安装 TensorFlow。 但是由于我们必须使用 TensorFlow 源代码构建 iOS 和 Android TensorFlow 应用,因此我们不妨从源代码构建 TensorFlow 本身,在这种情况下,使用本机 PIP 安装选择可能比其他选择更容易。 如果您想尝试不同的 TensorFlow 版本,我们建议您使用 VirtualEnv,Docker 和 Anaconda 选项之一安装其他 TensorFlow 版本。 在这里,我们将使用本地 PIP 和 Python 2.7.10 直接在 MacOS 系统上安装 TensorFlow 1.4。 请按照以下步骤在 MacOS 上下载并安装 TensorFlow 1.4: @@ -79,7 +79,7 @@ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg sudo pip install --upgrade /tmp/tensorflow_pkg/tensorflow-1.4.0-cp27-cp27m-macosx_10_12_intel.whl ``` -老实说,如果您在此过程中遇到任何错误,则搜索错误消息应该是修复该错误的最佳方法,因为我们打算在本书中重点介绍从我们长期积累的技巧和知识,从数小时的构建和调试实用的移动 TensorFlow 应用程序中获取,它们在其他地方不易获得。 运行`sudo pip install`命令时,您可能会看到的一个特定错误是`Operation not permitted`错误。 要解决此问题,您可以通过重新启动 Mac 并点击`Cmd + R`键来禁用 Mac 的**系统完整性保护**(**SIP**) 要进入恢复模式,请在实用程序终端下,在重新启动 Mac 之前运行`csrutil disable`。 如果您对禁用 SIP 不满意,可以按照 TensorFlow 文档尝试使用更复杂的安装方法之一,例如 VirtualEnv。 +老实说,如果您在此过程中遇到任何错误,则搜索错误消息应该是修复该错误的最佳方法,因为我们打算在本书中重点介绍从我们长期积累的技巧和知识,从数小时的构建和调试实用的移动 TensorFlow 应用中获取,它们在其他地方不易获得。 运行`sudo pip install`命令时,您可能会看到的一个特定错误是`Operation not permitted`错误。 要解决此问题,您可以通过重新启动 Mac 并点击`Cmd + R`键来禁用 Mac 的**系统完整性保护**(**SIP**) 要进入恢复模式,请在实用程序终端下,在重新启动 Mac 之前运行`csrutil disable`。 如果您对禁用 SIP 不满意,可以按照 TensorFlow 文档尝试使用更复杂的安装方法之一,例如 VirtualEnv。 如果一切顺利,则应该能够在终端窗口,Python 或最好在 IPython 上运行,然后运行`import tensorflow as tf`和`tf.__version__`将 1.4.0 作为输出。 @@ -93,7 +93,7 @@ sudo pip install --upgrade /tmp/tensorflow_pkg/tensorflow-1.4.0-cp27-cp27m-macos 使用良好的深度学习框架(例如 TensorFlow)的好处之一是在模型训练中无缝支持使用**图形处理单元**(**GPU**) 。 在 GPU 上训练非平凡的基于 TensorFlow 的模型要比在 CPU 上训练要快得多,并且当前 NVIDIA 提供 TensorFlow 支持的最佳和最具成本效益的 GPU。 Ubuntu 是使用 TensorFlow 运行 NVIDIA GPU 的最佳操作系统。 您可以花几百美元轻松购买一个 GPU,然后将其安装在带有 Ubuntu 系统的廉价台式机上。 您也可以在 Windows 上安装 NVIDIA GPU,但 TensorFlow 对 Windows 的支持不如对 Ubuntu 的支持。 -为了训练本书中应用程序中部署的模型,我们使用 NVIDIA GTX 1070,您可以在 Amazon 或 eBay 上以大约 400 美元的价格购买。 蒂姆·戴特默斯(Tim Dettmers)有一个不错的博客,其中介绍了[用于深度学习的 GPU](http://timdettmers.com/2017/04/09/which-gpu-for-deep-learning/)。 在获得这样的 GPU 并将其安装在 Ubuntu 系统上之后,以及在安装启用 GPU 的 TensorFlow 之前,您需要安装 NVIDIA CUDA 8.0(或 9.0)和 cuDNN(CUDA-DeepNeuralNetwork)6.0 (或 7.0),两者均受 TensorFlow 1.4 支持。 +为了训练本书中应用中部署的模型,我们使用 NVIDIA GTX 1070,您可以在 Amazon 或 eBay 上以大约 400 美元的价格购买。 蒂姆·戴特默斯(Tim Dettmers)有一个不错的博客,其中介绍了[用于深度学习的 GPU](http://timdettmers.com/2017/04/09/which-gpu-for-deep-learning/)。 在获得这样的 GPU 并将其安装在 Ubuntu 系统上之后,以及在安装启用 GPU 的 TensorFlow 之前,您需要安装 NVIDIA CUDA 8.0(或 9.0)和 cuDNN(CUDA-DeepNeuralNetwork)6.0 (或 7.0),两者均受 TensorFlow 1.4 支持。 使用 TensorFlow 设置自己的 GPU 驱动的 Ubuntu 的另一种方法是[在支持 GPU 的云服务(例如Google Cloud Platform 的 Cloud ML Engine)中使用 TensorFlow](https://cloud.google.com/ml-engine/docs/using-gpus)。 每个选项都有优点和缺点。 云服务通常是基于时间的计费。 如果您的目标是训练或重新训练要在移动设备上部署的模型,这意味着模型并不复杂,并且如果您计划长时间进行机器学习训练,那么拥有自己的 GPU 成本效益更高并且令人满意。 @@ -181,7 +181,7 @@ totalMemory: 7.92GiB freeMemory: 7.60GiB 2017-12-28 23:45:37.600186: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: GeForce GTX 1070, pci bus id: 0000:01:00.0, compute capability: 6.1) ``` -恭喜你! 现在,您就可以训练本书中应用程序中使用的深度学习模型了。 在我们开始玩我们的新玩具并用它来训练我们的炫酷模型然后在移动设备上部署和运行它们之前,我们首先来看看准备好开发移动应用程序需要做什么。 +恭喜你! 现在,您就可以训练本书中应用中使用的深度学习模型了。 在我们开始玩我们的新玩具并用它来训练我们的炫酷模型然后在移动设备上部署和运行它们之前,我们首先来看看准备好开发移动应用需要做什么。 @@ -193,11 +193,11 @@ totalMemory: 7.92GiB freeMemory: 7.60GiB Xcode 用于开发 iOS 应用,您需要 Mac 电脑和免费的 Apple ID 才能下载和安装它。 如果您的 Mac 相对较旧并且使用 OS X El Capitan(版本 10.11.6),则可以从[这里](https://developer.apple.com/download/more)下载 Xcode 8.2.1。 或者,如果您安装了 macOS Sierra(10.12.6 版)或更高版本,则可以从前面的链接下载 Xcode 9.2 或 9.3(截至 2018 年 5 月的最新版本)。 本书中的所有 iOS 应用均已在 Xcode 8.2.1、9.2 和 9.3 中进行了测试。 -要安装 Xcode,只需双击下载的文件,然后按照屏幕上的步骤进行操作。 这很简单。 现在,您可以在 Xcode 随附的 iOS 模拟器或您自己的 iOS 设备上运行应用程序。 从 Xcode 7 开始,您可以在 iOS 设备上免费运行和调试 iOS 应用,但如果要分发或发布您的应用,[则需要以每年 99 美元的价格参加 Apple 开发人员计划](https://developer.apple.com/programs/enroll)。 +要安装 Xcode,只需双击下载的文件,然后按照屏幕上的步骤进行操作。 这很简单。 现在,您可以在 Xcode 随附的 iOS 模拟器或您自己的 iOS 设备上运行应用。 从 Xcode 7 开始,您可以在 iOS 设备上免费运行和调试 iOS 应用,但如果要分发或发布您的应用,[则需要以每年 99 美元的价格参加 Apple 开发人员计划](https://developer.apple.com/programs/enroll)。 -尽管您可以使用 Xcode 模拟器测试运行书中的许多应用程序,但是书中的某些应用程序需要使用实际的 iOS 设备上的相机拍摄照片,然后才能使用经过 TensorFlow 训练的深度学习模型对其进行处理。 此外,通常最好在实际设备上测试模型的准确性能和内存使用情况:在模拟器中运行良好的模型可能会崩溃或在实际设备中运行太慢。 因此,强烈建议或要求您(如果并非总是)至少在您的实际 iOS 设备上测试并运行本书中的 iOS 应用程序一次。 +尽管您可以使用 Xcode 模拟器测试运行书中的许多应用,但是书中的某些应用需要使用实际的 iOS 设备上的相机拍摄照片,然后才能使用经过 TensorFlow 训练的深度学习模型对其进行处理。 此外,通常最好在实际设备上测试模型的准确性能和内存使用情况:在模拟器中运行良好的模型可能会崩溃或在实际设备中运行太慢。 因此,强烈建议或要求您(如果并非总是)至少在您的实际 iOS 设备上测试并运行本书中的 iOS 应用一次。 -本书假定您熟悉 iOS 编程,但是如果您不熟悉 iOS 开发,则可以从许多出色的在线教程中学习,例如 [Ray Wenderlich 的 iOS 教程](https://www.raywenderlich.com)。 我们不会介绍复杂的 iOS 编程; 我们将主要向您展示如何在我们的 iOS 应用中使用 TensorFlow C++ API 来运行 TensorFlow 训练有素的模型来执行各种智能任务。 Apple 的两种官方 iOS 编程语言 Objective-C 和 Swift 代码都将用于与我们的移动 AI 应用程序中的 C++ 代码进行交互。 +本书假定您熟悉 iOS 编程,但是如果您不熟悉 iOS 开发,则可以从许多出色的在线教程中学习,例如 [Ray Wenderlich 的 iOS 教程](https://www.raywenderlich.com)。 我们不会介绍复杂的 iOS 编程; 我们将主要向您展示如何在我们的 iOS 应用中使用 TensorFlow C++ API 来运行 TensorFlow 训练有素的模型来执行各种智能任务。 Apple 的两种官方 iOS 编程语言 Objective-C 和 Swift 代码都将用于与我们的移动 AI 应用中的 C++ 代码进行交互。 @@ -207,7 +207,7 @@ Xcode 用于开发 iOS 应用,您需要 Mac 电脑和免费的 Apple ID 才能 -Android Studio 是开发 Android 应用程序的最佳工具,并且 TensorFlow 对其使用提供了强大的支持。 与 Xcode 不同,您可以在 Mac,Windows 或 Linux 上安装并运行 Android Studio。 有关详细的系统要求,请参阅 [Android Studio 网站](https://developer.android.com/studio/index.html)。 在这里,我们将介绍如何在 Mac 上设置 Android Studio 3.0 或 3.0.1-本书中的所有应用均已在两个版本上进行了测试。 +Android Studio 是开发 Android 应用的最佳工具,并且 TensorFlow 对其使用提供了强大的支持。 与 Xcode 不同,您可以在 Mac,Windows 或 Linux 上安装并运行 Android Studio。 有关详细的系统要求,请参阅 [Android Studio 网站](https://developer.android.com/studio/index.html)。 在这里,我们将介绍如何在 Mac 上设置 Android Studio 3.0 或 3.0.1-本书中的所有应用均已在两个版本上进行了测试。 首先,从前面的链接下载 Android Studio 3.0.1,如果最新版本是 3.0.1 以上,并且您不介意解决可能的小问题,请下载最新版本。 您也可以从[这里](https://developer.android.com/studio/archive.html)的存档中下载 3.0.1 或 3.0。 @@ -219,13 +219,13 @@ Android Studio 是开发 Android 应用程序的最佳工具,并且 TensorFlow 图 1.4:Android SDK Manager,用于安装 SDK 工具和 NDK -最后,由于 TensorFlow Android 应用程序使用 C++ 中的本机 TensorFlow 库来加载和运行 TensorFlow 模型,因此您需要安装 Android **本机开发套件**(**NDK**),您可以执行以下任一操作,从上一个屏幕快照中显示的 Android SDK Manager 中获取,或者直接从[这里](https://developer.android.com/ndk/downloads/index.html)下载 NDK。 NDK 版本 r16b 和 r15c 均已通过测试可运行本书中的 Android 应用。 如果直接下载 NDK,则在打开项目并选择 Android Studio 的`File | Project Structure`后,您可能还需要设置 Android NDK 位置,如以下屏幕截图所示: +最后,由于 TensorFlow Android 应用使用 C++ 中的本机 TensorFlow 库来加载和运行 TensorFlow 模型,因此您需要安装 Android **本机开发套件**(**NDK**),您可以执行以下任一操作,从上一个屏幕快照中显示的 Android SDK Manager 中获取,或者直接从[这里](https://developer.android.com/ndk/downloads/index.html)下载 NDK。 NDK 版本 r16b 和 r15c 均已通过测试可运行本书中的 Android 应用。 如果直接下载 NDK,则在打开项目并选择 Android Studio 的`File | Project Structure`后,您可能还需要设置 Android NDK 位置,如以下屏幕截图所示: ![](img/1f6a2d74-0be0-4f36-9796-2cf66eb1694f.png) 图 1.5:设置项目级别的 Android NDK 位置 -安装并设置了 Android SDK 和 NDK 之后,您就可以测试运行示例 TensorFlow Android 应用程序了。 +安装并设置了 Android SDK 和 NDK 之后,您就可以测试运行示例 TensorFlow Android 应用了。 @@ -235,9 +235,9 @@ Android Studio 是开发 Android 应用程序的最佳工具,并且 TensorFlow -在我们开始运行示例 TensorFlow iOS 和 Android 应用程序之前,让我们澄清一下。 TensorFlow 当前有两种在移动设备上开发和部署深度学习应用程序的方法:TensorFlow Mobile 和 TensorFlow Lite。 TensorFlow Mobile 从一开始就是 TensorFlow 的一部分,而 TensorFlow Lite 是开发和部署 TensorFlow 应用程序的较新方法,因为它具有更好的性能和更小的应用程序尺寸。 但是有一个关键因素可以让我们在本书中专注于 TensorFlow Mobile,同时仍在一个章节中介绍 TensorFlow Lite:从 TensorFlow 1.8 和 2018 年 5 月的 Google I/O 开始,TensorFlow Lite 仍在开发人员预览版中。 现在,准备投入生产的移动 TensorFlow 应用程序,您必须按照 Google 的建议使用 TensorFlow Mobile。 +在我们开始运行示例 TensorFlow iOS 和 Android 应用之前,让我们澄清一下。 TensorFlow 当前有两种在移动设备上开发和部署深度学习应用的方法:TensorFlow Mobile 和 TensorFlow Lite。 TensorFlow Mobile 从一开始就是 TensorFlow 的一部分,而 TensorFlow Lite 是开发和部署 TensorFlow 应用的较新方法,因为它具有更好的性能和更小的应用尺寸。 但是有一个关键因素可以让我们在本书中专注于 TensorFlow Mobile,同时仍在一个章节中介绍 TensorFlow Lite:从 TensorFlow 1.8 和 2018 年 5 月的 Google I/O 开始,TensorFlow Lite 仍在开发人员预览版中。 现在,准备投入生产的移动 TensorFlow 应用,您必须按照 Google 的建议使用 TensorFlow Mobile。 -我们决定现在专注于 TensorFlow Mobile 的另一个原因是,虽然 TensorFlow Lite 仅对模型运算符提供了有限的支持,但 TensorFlow Mobile 支持自定义以添加默认情况下 TensorFlow Mobile 不支持的新运算符,您会发现它经常发生在我们的各种模型中 AI 应用程序的模型。 +我们决定现在专注于 TensorFlow Mobile 的另一个原因是,虽然 TensorFlow Lite 仅对模型运算符提供了有限的支持,但 TensorFlow Mobile 支持自定义以添加默认情况下 TensorFlow Mobile 不支持的新运算符,您会发现它经常发生在我们的各种模型中 AI 应用的模型。 但是将来,当 TensorFlow Lite 不在开发人员预览版中时,它很可能会取代 TensorFlow Mobile,或者至少克服其当前的局限性。 为了为此做好准备,我们将在下一章中详细介绍 TensorFlow Lite。 @@ -249,9 +249,9 @@ Android Studio 是开发 Android 应用程序的最佳工具,并且 TensorFlow -在本章的最后两部分中,我们将测试运行 TensorFlow 1.4 随附的三个示例 iOS 应用程序和四个示例 Android 应用程序,以确保您正确设置了移动 TensorFlow 开发环境并快速预览了其中的一些内容 TensorFlow 移动应用程序可以做到。 +在本章的最后两部分中,我们将测试运行 TensorFlow 1.4 随附的三个示例 iOS 应用和四个示例 Android 应用,以确保您正确设置了移动 TensorFlow 开发环境并快速预览了其中的一些内容 TensorFlow 移动应用可以做到。 -三个示例 TensorFlow iOS 应用程序的源代码位于`tensorflow/examples/ios: simple`,`camera`和`benchmark`。 为了成功运行这些样本,您需要首先下载一个由 Google 训练的深度学习模型,称为 [Inception](https://github.com/tensorflow/models/tree/master/research/inception),用于图像识别。 Inception 有多个版本:v1 到 v4,在每个较新的版本中准确性更高。 在这里,我们将使用 Inception v1 作为为其开发的示例。 下载模型文件后,将与模型相关的文件复制到每个样本的`data`文件夹中: +三个示例 TensorFlow iOS 应用的源代码位于`tensorflow/examples/ios: simple`,`camera`和`benchmark`。 为了成功运行这些样本,您需要首先下载一个由 Google 训练的深度学习模型,称为 [Inception](https://github.com/tensorflow/models/tree/master/research/inception),用于图像识别。 Inception 有多个版本:v1 到 v4,在每个较新的版本中准确性更高。 在这里,我们将使用 Inception v1 作为为其开发的示例。 下载模型文件后,将与模型相关的文件复制到每个样本的`data`文件夹中: ```py curl -o ~/graphs/inception5h.zip https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip @@ -262,7 +262,7 @@ cp ~/graphs/inception5h/* camera/data/ cp ~/graphs/inception5h/* benchmark/data/ ``` -现在,在打开和运行应用程序之前,转到每个`app`文件夹并运行以下命令以下载每个应用程序所需的 Pod: +现在,在打开和运行应用之前,转到每个`app`文件夹并运行以下命令以下载每个应用所需的 Pod: ```py cd simple @@ -277,11 +277,11 @@ open tf_benchmark_example.xcworkspace ``` -然后,您可以在 iOS 设备上运行这三个应用程序,或者在 iOS 模拟器上运行简单和基准的应用程序。 如果在运行简单应用程序后点击运行模型按钮,您将看到一条文本消息,提示已加载 TensorFlow Inception 模型,随后是几个顶级识别结果以及置信度值。 +然后,您可以在 iOS 设备上运行这三个应用,或者在 iOS 模拟器上运行简单和基准的应用。 如果在运行简单应用后点击运行模型按钮,您将看到一条文本消息,提示已加载 TensorFlow Inception 模型,随后是几个顶级识别结果以及置信度值。 -如果在运行基准测试应用程序后点击 Benchmark Model 按钮,您将看到运行模型超过 20 次的平均时间。 例如,在我的 iPhone 6 上平均需要大约 0.2089 秒,在 iPhone 6 模拟器上平均需要 0.0359 秒。 +如果在运行基准测试应用后点击 Benchmark Model 按钮,您将看到运行模型超过 20 次的平均时间。 例如,在我的 iPhone 6 上平均需要大约 0.2089 秒,在 iPhone 6 模拟器上平均需要 0.0359 秒。 -最后,在 iOS 设备上运行照相机应用程序并将其对准相机可以向您实时显示该应用程序看到和识别的对象。 +最后,在 iOS 设备上运行照相机应用并将其对准相机可以向您实时显示该应用看到和识别的对象。 @@ -293,7 +293,7 @@ open tf_benchmark_example.xcworkspace `tensorflow/examples/android`中有四个样本 TensorFlow Android 应用,分别为 TF 分类,TF 检测,TF 语音和 TF 风格化。 运行这些示例的最简单方法是使用 Android Studio 在前面的文件夹中打开项目,如“设置 Android Studio”部分中所示,然后通过编辑项目的`build.gradle`文件进行单个更改,并将`def nativeBuildSystem = 'bazel'`更改为`def nativeBuildSystem = 'none'`。 -现在,将 Android 设备连接到您的计算机,然后通过选择 Android Studio 的`Run | Run 'android'`构建,安装和运行该应用。这会在您的设备上安装四个名称为“TF 分类”,“TF 检测”,“TF 语音”和“TF 风格化”的 Android 应用。 “TF 分类”就像 iOS 相机应用程序一样,使用 TensorFlow Inception v1 模型对设备相机进行实时对象分类。 “TF 检测”使用另一种模型,称为**单发多框检测器**(**SSD**)和 MobileNet,这是 Google 发布的一组新的深度学习模型,专门针对移动和嵌入式设备, 要执行对象检测,请在检测到的对象上绘制矩形。 “TF 语音”使用另一种不同的深度学习(语音识别)模型来收听和识别一小部分单词,例如`Yes`,`No`,`Left`,`Right`,`Stop`和`Start`。 “TF 风格化”使用另一种模型来更改相机看到的图像样式。 有关这些应用程序的更多详细信息,您可以在[这个页面](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android)中查看 TensorFlow Android 示例文档。 +现在,将 Android 设备连接到您的计算机,然后通过选择 Android Studio 的`Run | Run 'android'`构建,安装和运行该应用。这会在您的设备上安装四个名称为“TF 分类”,“TF 检测”,“TF 语音”和“TF 风格化”的 Android 应用。 “TF 分类”就像 iOS 相机应用一样,使用 TensorFlow Inception v1 模型对设备相机进行实时对象分类。 “TF 检测”使用另一种模型,称为**单发多框检测器**(**SSD**)和 MobileNet,这是 Google 发布的一组新的深度学习模型,专门针对移动和嵌入式设备, 要执行对象检测,请在检测到的对象上绘制矩形。 “TF 语音”使用另一种不同的深度学习(语音识别)模型来收听和识别一小部分单词,例如`Yes`,`No`,`Left`,`Right`,`Stop`和`Start`。 “TF 风格化”使用另一种模型来更改相机看到的图像样式。 有关这些应用的更多详细信息,您可以在[这个页面](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android)中查看 TensorFlow Android 示例文档。 @@ -303,6 +303,6 @@ open tf_benchmark_example.xcworkspace -在本章中,我们介绍了如何在 Mac 和 Ubuntu 上安装 TensorFlow 1.4,如何在 Ubuntu 上设置具有成本效益的 NVIDIA GPU 以便进行更快的模型训练以及如何为移动 AI 应用程序开发设置 Xcode 和 Android Studio。 我们还向您展示了如何运行一些很酷的 TensorFlow 示例 iOS 和 Android 应用程序。 在本书的其余部分,我们将详细讨论如何在基于 GPU 的 Ubuntu 系统上构建和训练或重新训练应用程序中使用的每个模型以及其他模型,并向您展示如何在以下环境中部署模型 iOS 和 Android 应用程序,并编写代码以在移动 AI 应用程序中使用模型。 现在我们已经准备就绪,我们已经迫不及待要上路了。 这将是一段激动人心的旅程,我们当然很乐意与朋友分享这一旅程。 那么,为什么不从我们最好的朋友开始,让我们看看构建狗品种识别应用需要什么呢? +在本章中,我们介绍了如何在 Mac 和 Ubuntu 上安装 TensorFlow 1.4,如何在 Ubuntu 上设置具有成本效益的 NVIDIA GPU 以便进行更快的模型训练以及如何为移动 AI 应用开发设置 Xcode 和 Android Studio。 我们还向您展示了如何运行一些很酷的 TensorFlow 示例 iOS 和 Android 应用。 在本书的其余部分,我们将详细讨论如何在基于 GPU 的 Ubuntu 系统上构建和训练或重新训练应用中使用的每个模型以及其他模型,并向您展示如何在以下环境中部署模型 iOS 和 Android 应用,并编写代码以在移动 AI 应用中使用模型。 现在我们已经准备就绪,我们已经迫不及待要上路了。 这将是一段激动人心的旅程,我们当然很乐意与朋友分享这一旅程。 那么,为什么不从我们最好的朋友开始,让我们看看构建狗品种识别应用需要什么呢? diff --git a/new/intel-mobi-proj-tf/02.md b/new/intel-mobi-proj-tf/02.md index 88ed52ec0765e1f3f941b298e9e625eef1cdc71e..7f9136f8d0e290191c3a4b2e583dd2902f702ae5 100644 --- a/new/intel-mobi-proj-tf/02.md +++ b/new/intel-mobi-proj-tf/02.md @@ -4,9 +4,9 @@ -上一章中描述的示例 TensorFlow iOS 应用程序,Simple 和 Camera 以及 Android 应用程序“TF 分类”都使用了 Inception v1 模型,该模型是 Google 公开提供的预先训练的图像分类深度神经网络模型。 该模型针对 [ImageNet](http://image-net.org) 进行了训练,ImageNet 是最大和最知名的图像数据库之一,其中有超过一千万个图像被标注为对象类别。 Inception 模型可用于将图像分类为[列出的 1,000 个类别之一](http://image-net.org/challenges/LSVRC/2014/browse-synsets)。 这 1000 个对象类别包括很多对象中的很多犬种。 但是,识别狗品种的准确性不是很高,约为 70%,因为模型经过训练可以识别大量对象,而不是像狗品种之类的特定对象。 +上一章中描述的示例 TensorFlow iOS 应用,Simple 和 Camera 以及 Android 应用“TF 分类”都使用了 Inception v1 模型,该模型是 Google 公开提供的预训练的图像分类深度神经网络模型。 该模型针对 [ImageNet](http://image-net.org) 进行了训练,ImageNet 是最大和最知名的图像数据库之一,其中有超过一千万个图像被标注为对象类别。 Inception 模型可用于将图像分类为[列出的 1,000 个类别之一](http://image-net.org/challenges/LSVRC/2014/browse-synsets)。 这 1000 个对象类别包括很多对象中的很多犬种。 但是,识别狗品种的准确性不是很高,约为 70%,因为模型经过训练可以识别大量对象,而不是像狗品种之类的特定对象。 -如果我们想提高准确性并在使用改进模型的智能手机上构建移动应用程序怎么办,那么当我们四处走走并看到一只有趣的狗时,我们可以使用该应用程序告诉我们它是哪种狗。 +如果我们想提高准确性并在使用改进模型的智能手机上构建移动应用怎么办,那么当我们四处走走并看到一只有趣的狗时,我们可以使用该应用告诉我们它是哪种狗。 在本章中,我们将首先讨论为什么对于这样的图像分类任务,迁移学习或重新训练经过预训练的深度学习模型是完成任务的最经济有效的方法。 然后,我们将向您展示如何使用良好的狗数据集对一些最佳图像分类模型进行再训练,以及在第 1 章,“移动 TensorFlow 入门”。 此外,我们还将分步说明如何将 TensorFlow 添加到基于 Objective-C 或 Swift 的 iOS 和 Android 应用中。 @@ -24,7 +24,7 @@ -# 迁移学习-什么和为什么 +# 迁移学习 -- 什么和为什么 @@ -233,9 +233,9 @@ python tensorflow/tools/quantization/quantize_graph.py --mode=weights ``` -之后,可以在 iOS 和 Android 应用程序中部署和使用模型`quantized_stripped_dogs_retrained.pb`,我们将在本章的以下部分中看到。 +之后,可以在 iOS 和 Android 应用中部署和使用模型`quantized_stripped_dogs_retrained.pb`,我们将在本章的以下部分中看到。 -剥离未使用的节点并量化模型的另一种方法是使用称为`transform_graph`的工具。 这是 TensorFlow 1.4 中推荐的新方法,并且可以在 Python `label_image`脚本中正常工作,但是在部署到 iOS 和 Android 应用程序时仍然会导致不正确的识别结果。 +剥离未使用的节点并量化模型的另一种方法是使用称为`transform_graph`的工具。 这是 TensorFlow 1.4 中推荐的新方法,并且可以在 Python `label_image`脚本中正常工作,但是在部署到 iOS 和 Android 应用时仍然会导致不正确的识别结果。 ```py bazel build tensorflow/tools/graph_transforms:transform_graph @@ -252,7 +252,7 @@ bazel-bin/tensorflow/tools/graph_transforms/transform_graph quantize_weights' ``` -在测试中使用`label_image`脚本可以正确运行`quantized_stripped_dogs_retrained.pb`和`transform_dog_retrained.pb`。 但是只有第一个可以在 iOS 和 Android 应用程序中正常工作。 +在测试中使用`label_image`脚本可以正确运行`quantized_stripped_dogs_retrained.pb`和`transform_dog_retrained.pb`。 但是只有第一个可以在 iOS 和 Android 应用中正常工作。 有关图形转换工具的详细文档,请参见其 [GitHub README](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/graph_transforms/README.md)。 @@ -349,14 +349,14 @@ bazel-bin/tensorflow/tools/benchmark/benchmark_model -我们在第 1 章,“移动 TensorFlow 入门”中看到的 iOS 简单示例使用了 Inception v1 模型。 为了使该应用程序使用我们经过重新训练的 Inception v3 模型和 MobileNet 模型来更好地识别狗的品种,我们需要对该应用程序进行一些更改。 首先,让我们看看在 iOS 简单应用中使用经过重新训练的`quantized_stripped_dogs_retrained.pb`会发生什么: +我们在第 1 章,“移动 TensorFlow 入门”中看到的 iOS 简单示例使用了 Inception v1 模型。 为了使该应用使用我们经过重新训练的 Inception v3 模型和 MobileNet 模型来更好地识别狗的品种,我们需要对该应用进行一些更改。 首先,让我们看看在 iOS 简单应用中使用经过重新训练的`quantized_stripped_dogs_retrained.pb`会发生什么: 1. 双击`tensorflow/examples/ios/simple`中的`tf_simple_example.xcworkspace`文件以 Xcode 打开应用 2. 拖动我们用来测试`label_image`脚本的`quantized_stripped_dogs_retrained.pb`模型文件,`dog_retrained_labels.txt`标签文件和`lab1.jpg`图像文件,然后拖放到项目的数据文件夹中,并确保同时选中“按需复制项目”和“添加到目标”,如以下屏幕截图所示: ![](img/d2e25f9d-c88d-4fe5-918d-ba7e64420682.png) -图 2.5:将重新训练的模型文件和标签文件添加到应用程序 +图 2.5:将重新训练的模型文件和标签文件添加到应用 3. 单击 Xco​​de 中的`RunModelViewController.mm`文件,该文件使用 TensorFlow C++ API 处理输入图像,通过 Inception v1 模型运行它,并获得图像分类结果,并更改行: @@ -391,7 +391,7 @@ std::string output_layer = "final_result"; 6. 最后,您可以编辑`dog_retrained_labels.txt`文件以删除每行中的前导`nxxxx`字符串(例如,删除`n02099712 labrador retriever`中的`n02099712`)– 在 Mac 上,您可以通过按住`Option`键然后进行选择和删除–从而使识别结果更具可读性 -立即运行应用程序,然后单击运行模型按钮,在 Xcode 的控制台窗口或应用程序的编辑框中,您将看到以下识别结果,与运行`label_image`脚本的结果非常一致: +立即运行应用,然后单击运行模型按钮,在 Xcode 的控制台窗口或应用的编辑框中,您将看到以下识别结果,与运行`label_image`脚本的结果非常一致: ```py Predictions: 41 0.645 labrador retriever @@ -403,7 +403,7 @@ Predictions: 41 0.645 labrador retriever 要使用 MobileNet(`mobilenet_1.0_224_quantized`)训练模型`dog_retrained_mobilenet10_224.pb`,请按照与之前类似的步骤进行操作,而在步骤 2 和 3 中,我们使用`dog_retrained_mobilenet10_224.pb`,但是在步骤 4 中,我们需要保留`const int wanted_width = 224;`和 `const int wanted_height = 224;`,仅将`const float input_mean`和`const float input_std`更改为`128`。 最后,在步骤 5 中,我们必须使用`std::string input_layer = "input";`和`std::string output_layer = "final_result";`。 这些参数与`dog_retrained_mobilenet10_224.pb`的`label_image`脚本使用的参数相同。 -再次运行该应用程序,您将看到类似的最佳识别结果。 +再次运行该应用,您将看到类似的最佳识别结果。 @@ -413,10 +413,10 @@ Predictions: 41 0.645 labrador retriever -在 Android 的“TF 分类”应用程序中使用经过重新训练的 Inception v3 模型和 MobileNet 模型也非常简单。 请按照此处的步骤测试两个重新训练的模型: +在 Android 的“TF 分类”应用中使用经过重新训练的 Inception v3 模型和 MobileNet 模型也非常简单。 请按照此处的步骤测试两个重新训练的模型: 1. 使用 Android Studio 打开位于`tensorflow/examples/android`中的示例 TensorFlow Android 应用。 -2. 将两个重新训练的模型`quantized_stripped_dogs_retrained .pb`和`dog_retrained_mobilenet10_224.pb`以及标签文件`dog_retrained_labels.txt`拖放到 android 应用程序的`assets`文件夹中。 +2. 将两个重新训练的模型`quantized_stripped_dogs_retrained .pb`和`dog_retrained_mobilenet10_224.pb`以及标签文件`dog_retrained_labels.txt`拖放到 android 应用的`assets`文件夹中。 3. 打开文件`ClassifierActivity.java`,以使用 Inception v3 训练后的模型,并替换以下代码: ```py @@ -452,19 +452,19 @@ private static final String MODEL_FILE = "file:///android_asset/dog_retrained_mo private static final String LABEL_FILE = "file:///android_asset/dog_retrained_labels.txt"; ``` -5. 将 Android 设备连接到计算机并在其上运行该应用程序。 然后点击 TF 分类应用程序,将相机指向一些狗的照片,您将在屏幕上看到最佳结果。 +5. 将 Android 设备连接到计算机并在其上运行该应用。 然后点击 TF 分类应用,将相机指向一些狗的照片,您将在屏幕上看到最佳结果。 -这就是在示例 TensorFlow iOS 和 Android 应用程序中使用两个经过重新训练的模型所需要的全部。 既然您已经了解了如何在示例应用程序中使用经过重新训练的模型,那么您可能想知道的下一件事是如何将 TensorFlow 添加到自己的新的或现有的 iOS 或 Android 应用程序中,以便可以开始添加 AI 对您自己的移动应用程序的强大功能。 这就是本章其余部分将详细讨论的内容。 +这就是在示例 TensorFlow iOS 和 Android 应用中使用两个经过重新训练的模型所需要的全部。 既然您已经了解了如何在示例应用中使用经过重新训练的模型,那么您可能想知道的下一件事是如何将 TensorFlow 添加到自己的新的或现有的 iOS 或 Android 应用中,以便可以开始添加 AI 对您自己的移动应用的强大功能。 这就是本章其余部分将详细讨论的内容。 -# 将 TensorFlow 添加到您自己的 iOS 应用中 +# 将 TensorFlow 添加到您自己的 iOS 应用 -在 TensorFlow 的早期版本中,将 TensorFlow 添加到您自己的应用程序非常繁琐,需要使用 TensorFlow 的手动构建过程和其他手动设置。 在 TensorFlow 1.4 中,该过程非常简单,但在 TensorFlow 网站上并未详细记录详细步骤。 缺少的另一件事是缺少有关如何在基于 Swift 的 iOS 应用中使用 TensorFlow 的文档; 示例 TensorFlow iOS 应用程序都在 Objective-C 中,它们调用了 TensorFlow 的 C++ API。 让我们看看我们如何做得更好。 +在 TensorFlow 的早期版本中,将 TensorFlow 添加到您自己的应用非常繁琐,需要使用 TensorFlow 的手动构建过程和其他手动设置。 在 TensorFlow 1.4 中,该过程非常简单,但在 TensorFlow 网站上并未详细记录详细步骤。 缺少的另一件事是缺少有关如何在基于 Swift 的 iOS 应用中使用 TensorFlow 的文档; 示例 TensorFlow iOS 应用都在 Objective-C 中,它们调用了 TensorFlow 的 C++ API。 让我们看看我们如何做得更好。 @@ -474,7 +474,7 @@ private static final String LABEL_FILE = "file:///android_asset/dog_retrained_la -首先,按照以下步骤将具有图像分类功能的 TensorFlow 添加到您的 Objective-C iOS 应用程序(我们将从一个新应用程序开始,但是如果需要将 TensorFlow 添加到现有应用程序,则可以跳过第一步): +首先,按照以下步骤将具有图像分类功能的 TensorFlow 添加到您的 Objective-C iOS 应用(我们将从一个新应用开始,但是如果需要将 TensorFlow 添加到现有应用,则可以跳过第一步): 1. 在您的 Xcode 中,单击“文件 | 新增 | 项目 ...”,选择“Single View App”,然后选择接下来的,输入`HelloTensorFlow`作为产品名称,选择 Obj-C 作为语言,然后单击接下来并选择项目的位置,然后单击创建。 关闭 Xcode 中的项目窗口(因为我们稍后将使用 Pod 来打开项目的工作区文件)。 2. 打开一个终端窗口,即`cd`到项目所在的位置,然后创建一个名为`Podfile`的新文件,其内容如下: @@ -519,7 +519,7 @@ NSString* FilePathForResourceName(NSString* name, NSString* extension) { NSString* RunInferenceOnImage(int wanted_width, int wanted_height, std::string input_layer, NSString *model) { ``` -8. 仍然在`viewDidLoad`方法的`ViewController.mm`中,首先添加添加标签的代码,以使用户知道他们可以使用该应用程序执行的操作: +8. 仍然在`viewDidLoad`方法的`ViewController.mm`中,首先添加添加标签的代码,以使用户知道他们可以使用该应用执行的操作: ```py UILabel *lbl = [[UILabel alloc] init]; @@ -631,11 +631,11 @@ std::vector > top_results; GetTopN(output->flat(), kNumResults, kThreshold, &top_results); ``` -在本书的其余部分,我们将实现`RunInferenceOnxxx`方法的不同版本,以使用不同的输入来运行不同的模型。 因此,如果您不完全理解前面的一些代码,请不要担心; 通过构建更多的应用程序,您将为新的自定义模型编写自己的推理逻辑而感到自在。 +在本书的其余部分,我们将实现`RunInferenceOnxxx`方法的不同版本,以使用不同的输入来运行不同的模型。 因此,如果您不完全理解前面的一些代码,请不要担心; 通过构建更多的应用,您将为新的自定义模型编写自己的推理逻辑而感到自在。 -此外,完整的 iOS 应用程序 HelloTensorFlow 也包含在本书的源代码存储库中。 +此外,完整的 iOS 应用 HelloTensorFlow 也包含在本书的源代码存储库中。 -现在,在模拟器中或实际的 iOS 设备上运行该应用程序,首先,您将看到以下消息框,要求您选择重新训练的模型: +现在,在模拟器中或实际的 iOS 设备上运行该应用,首先,您将看到以下消息框,要求您选择重新训练的模型: ![](img/1823f6a6-f212-4ac9-9d78-a978a234c4aa.png) @@ -657,7 +657,7 @@ GetTopN(output->flat(), kNumResults, kThreshold, &top_results); -自 2014 年 6 月诞生以来,Swift 已成为最优雅的现代编程语言之一。因此,对于某些开发人员而言,将现代 TensorFlow 集成到其基于 Swift 的现代 iOS 应用程序中既有趣又有用。 这样做的步骤与基于 Objective-C 的应用程序的步骤相似,但具有一些与 Swift 相关的技巧。 如果您已经按照 Objective-C 部分的步骤进行操作,则可能会发现这里的某些步骤是重复的,但是对于那些可能会跳过 Objective-C 部分并直接进入 Swift 的用户而言,仍然提供了完整的步骤: +自 2014 年 6 月诞生以来,Swift 已成为最优雅的现代编程语言之一。因此,对于某些开发人员而言,将现代 TensorFlow 集成到其基于 Swift 的现代 iOS 应用中既有趣又有用。 这样做的步骤与基于 Objective-C 的应用的步骤相似,但具有一些与 Swift 相关的技巧。 如果您已经按照 Objective-C 部分的步骤进行操作,则可能会发现这里的某些步骤是重复的,但是对于那些可能会跳过 Objective-C 部分并直接进入 Swift 的用户而言,仍然提供了完整的步骤: 1. 在您的 Xcode 中,单击“文件 | 新增 | 项目...”,选择“Single View App”,然后接下来的,输入`HelloTensorFlow_Swift`作为产品名称,选择 Swift 将设置为语言,然后单击接下来并选择项目的位置,然后单击创建。 关闭 Xcode 中的项目窗口(因为稍后将使用 Pod 来打开项目的工作区文件)。 2. 打开一个终端窗口,即`cd`到项目所在的位置,然后创建一个名为`Podfile`的新文件,其内容如下: @@ -731,7 +731,7 @@ NSString* FilePathForResourceName(NSString* name, NSString* extension) { NSString* RunInferenceOnImage(int wanted_width, int wanted_height, std::string input_layer, NSString *model) { ``` -10. 现在打开`viewDidLoad method`末尾的`ViewController.swift`,首先添加添加标签的代码,以使用户知道他们可以使用该应用程序做什么: +10. 现在打开`viewDidLoad method`末尾的`ViewController.swift`,首先添加添加标签的代码,以使用户知道他们可以使用该应用做什么: ```py let lbl = UILabel() @@ -793,7 +793,7 @@ self.present(alert, animated: true, completion: nil) 12. 打开`HelloTensorFlow_Swift-Bridging-Header.h`文件,并向其中添加一行代码:`#include "RunInference.h"`。 -现在,在模拟器中运行该应用程序,您将看到一个警报控制器,要求您选择模型: +现在,在模拟器中运行该应用,您将看到一个警报控制器,要求您选择模型: ![](img/098c0b7a-c32a-4ffc-bf3d-49c1ea80d36f.png) @@ -805,22 +805,22 @@ self.present(alert, animated: true, completion: nil) 图 2.12:不同再训练模型的推理结果 -继续,既然您知道了将强大的 TensorFlow 模型添加到 iOS 应用程序需要做什么,无论它是用 Objective-C 还是 Swift 编写的,都没有理由阻止您将 AI 添加到您的移动应用程序中,除非您是 Android。 但是您知道我们当然也会照顾 Android。 +继续,既然您知道了将强大的 TensorFlow 模型添加到 iOS 应用需要做什么,无论它是用 Objective-C 还是 Swift 编写的,都没有理由阻止您将 AI 添加到您的移动应用中,除非您是 Android。 但是您知道我们当然也会照顾 Android。 -# 将 TensorFlow 添加到您自己的 Android 应用中 +# 将 TensorFlow 添加到您自己的 Android 应用 -事实证明,将 TensorFlow 添加到自己的 Android 应用程序比 iOS 容易。 让我们跳到步骤: +事实证明,将 TensorFlow 添加到自己的 Android 应用比 iOS 容易。 让我们跳到步骤: 1. 如果您有现有的 Android 应用,请跳过此步骤。 否则,在 Android Studio 中,选择“文件 | 新增 | 新项目...”并接受所有默认设置,然后单击完成。 2. 打开`build.gradle`(`Module: app`)文件,并在依赖项`{...};`内部和末尾添加编译`'org.tensorflow:tensorflow-android:+'`。 3. 生成`gradle`文件,您将在`app`目录的位置`app/build/intermediates/transforms/mergeJniLibs/debug/0/lib`的子文件夹内看到`libtensorflow_inference.so`,这是 Java 代码与之对话的 TensorFlow 本机库。 -4. 如果这是一个新项目,则可以通过首先切换到软件包,然后右键单击该应用程序并选择“新建 | 文件夹 | `assets`文件夹”来创建`assets`文件夹。 ,如以下屏幕截图所示,然后从软件包切换回 Android: +4. 如果这是一个新项目,则可以通过首先切换到软件包,然后右键单击该应用并选择“新建 | 文件夹 | `assets`文件夹”来创建`assets`文件夹。 ,如以下屏幕截图所示,然后从软件包切换回 Android: ![](img/6cf6b889-8ecb-4837-9087-19b34d6e68ed.png) @@ -875,19 +875,19 @@ final List results = classifier.recognizeImage(croppedBi ``` -为简单起见,我们没有向 Android 应用程序添加任何与 UI 相关的代码,但是您可以在获取结果后在此行设置一个断点,并调试运行该应用程序; 您将看到以下屏幕截图所示的结果: +为简单起见,我们没有向 Android 应用添加任何与 UI 相关的代码,但是您可以在获取结果后在此行设置一个断点,并调试运行该应用; 您将看到以下屏幕截图所示的结果: ![](img/4c91b3a9-1a32-4288-aa75-205d0b71d584.png) 图 2.16:使用 MobileNet 再训练模型的识别结果 -如果您通过将`MODEL_FILE`更改为`quantized_stripped_dogs_retrained.pb`,将`INPUT_SIZE`更改为`299`,并且将`INPUT_NAME`更改为`Mul`来使用 Inception v3 训练后的模型,则调试该应用程序,您将获得如下所示的结果 : +如果您通过将`MODEL_FILE`更改为`quantized_stripped_dogs_retrained.pb`,将`INPUT_SIZE`更改为`299`,并且将`INPUT_NAME`更改为`Mul`来使用 Inception v3 训练后的模型,则调试该应用,您将获得如下所示的结果 : ![](img/ca49452a-b256-4c9e-8e96-6de4c75effa7.png) 图 2.17:使用 Inception v3 再训练模型的识别结果 -既然您已经了解了如何将 TensorFlow 和经过重新训练的模型添加到自己的 iOS 和 Android 应用程序,那么如果想要添加非 TensorFlow 相关功能应该不会太难。例如使用手机的摄像头拍摄狗的照片和识别它的品种。 +既然您已经了解了如何将 TensorFlow 和经过重新训练的模型添加到自己的 iOS 和 Android 应用,那么如果想要添加非 TensorFlow 相关功能应该不会太难。例如使用手机的摄像头拍摄狗的照片和识别它的品种。 diff --git a/new/intel-mobi-proj-tf/03.md b/new/intel-mobi-proj-tf/03.md index e25760454edad013d197f15009010c9aa621551e..8da2236fd9aa9d1f6263de2b31420e91f9b0533d 100644 --- a/new/intel-mobi-proj-tf/03.md +++ b/new/intel-mobi-proj-tf/03.md @@ -6,7 +6,7 @@ 对象检测比上一章中讨论的图像分类迈出了一步。 图像分类仅返回图像的类别标签,而对象检测返回图像中标识的对象列表以及每个标识对象的边界框。 现代的对象检测算法使用深度学习来构建可用于检测和定位单个图像中各种对象的模型。 在过去的几年中,更快,更准确的对象检测算法相继问世.2017 年 6 月,谷歌发布了 TensorFlow 对象检测 API,该 API 集成了几种领先的对象检测算法。 -在本章中,我们将首先简要概述对象检测:创建有效的深度学习模型进行对象检测,然后使用该模型进行推理的过程。 然后,我们将详细讨论 TensorFlow 对象检测 API 的工作原理,如何使用其多个模型进行推理以及如何使用自己的数据集对其进行重新训练。 然后,我们将向您展示如何在 iOS 应用中使用预先训练的对象检测模型以及重新训练的模型。 我们将介绍一些强大的技巧,使您可以手动构建自定义的 TensorFlow iOS 库,以解决使用 TensorFlow Pod 的问题; 这将帮助您准备好处理本书其余部分中介绍的任何受 TensorFlow 支持的模型。 在本章中,我们将不提供用于对象检测的 Android 示例应用程序,因为 TensorFlow 源代码已经附带了一个很好的示例,可以使用 TensorFlow 对象检测预训练模型以及 YOLO 模型进行操作。 我们将在本章最后介绍。 我们将向您展示如何在 iOS 应用中使用另一种领先的物体检测模型 YOLO v2。 总而言之,我们将在本章中介绍以下主题: +在本章中,我们将首先简要概述对象检测:创建有效的深度学习模型进行对象检测,然后使用该模型进行推理的过程。 然后,我们将详细讨论 TensorFlow 对象检测 API 的工作原理,如何使用其多个模型进行推理以及如何使用自己的数据集对其进行重新训练。 然后,我们将向您展示如何在 iOS 应用中使用预训练的对象检测模型以及重新训练的模型。 我们将介绍一些强大的技巧,使您可以手动构建自定义的 TensorFlow iOS 库,以解决使用 TensorFlow Pod 的问题; 这将帮助您准备好处理本书其余部分中介绍的任何受 TensorFlow 支持的模型。 在本章中,我们将不提供用于对象检测的 Android 示例应用,因为 TensorFlow 源代码已经附带了一个很好的示例,可以使用 TensorFlow 对象检测预训练模型以及 YOLO 模型进行操作。 我们将在本章最后介绍。 我们将向您展示如何在 iOS 应用中使用另一种领先的物体检测模型 YOLO v2。 总而言之,我们将在本章中介绍以下主题: * 物体检测:快速概述 * 设置 TensorFlow 对象检测 API @@ -19,11 +19,11 @@ -# 对象检测-快速概述 +# 对象检测 -- 快速概述 -自从 2012 年神经网络取得突破以来,当名为 **AlexNet** 的深层 CNN 模型通过大大降低错误率赢得了年度 ImageNet 视觉识别挑战时,许多计算机视觉和自然语言处理领域的研究人员就开始利用深度学习模型的强大功能这一优势。 基于深度学习的现代对象检测全部基于 CNN,并建立在诸如 AlexNet,Google Inception 或其他流行的 VGG 网络等预先训练的模型之上。 这些 CNN 通常已经训练了数百万个参数,并且可以将输入图像转换为一组功能,这些功能可以进一步用于诸如上一章中涉及的图像分类以及对象检测以及其他与计算机视觉相关的任务。 +自从 2012 年神经网络取得突破以来,当名为 **AlexNet** 的深层 CNN 模型通过大大降低错误率赢得了年度 ImageNet 视觉识别挑战时,许多计算机视觉和自然语言处理领域的研究人员就开始利用深度学习模型的强大功能这一优势。 基于深度学习的现代对象检测全部基于 CNN,并建立在诸如 AlexNet,Google Inception 或其他流行的 VGG 网络等预训练的模型之上。 这些 CNN 通常已经训练了数百万个参数,并且可以将输入图像转换为一组功能,这些功能可以进一步用于诸如上一章中涉及的图像分类以及对象检测以及其他与计算机视觉相关的任务。 2014 年,提出了一种最新的对象检测器,该对象检测器使用称为 RCNN(具有 CNN 特征的区域)的标记对象检测数据集对 AlexNet 进行了训练,与传统的检测方法相比,它在准确性上有了很大的提高。 RCNN 结合了一种称为区域提议的技术,该技术可生成大约 2,000 个可能的区域候选者,并在每个这些区域上运行 CNN 以进行分类和边界框预测。 然后,将这些结果合并以生成检测结果。 RCNN 的训练过程非常复杂,耗时数天,推理速度也很慢,在 GPU 上的图像上花费了将近一分钟。 @@ -35,9 +35,9 @@ 与 RCNN 检测系列不同,SSD 和 YOLO 都是单发方法,这意味着它们将单个 CNN 应用于完整的输入图像,而无需使用区域建议和区域分类。 这使这两种方法都非常快,它们的平均平均精度(mAP)约为 80%,优于 Faster RCNN。 -如果这是您第一次听说这些方法,则可能会感到有些迷茫。 但是,作为对使用 AI 增强移动应用程序功能感兴趣的开发人员,您无需了解设置深度神经网络架构和训练对象检测模型的所有细节; 您应该只知道如何使用以及(如果需要)重新训练经过预先训练的模型,以及如何在 iOS 和 Android 应用中使用经过预先训练或重新训练的模型。 +如果这是您第一次听说这些方法,则可能会感到有些迷茫。 但是,作为对使用 AI 增强移动应用功能感兴趣的开发人员,您无需了解设置深度神经网络架构和训练对象检测模型的所有细节; 您应该只知道如何使用以及(如果需要)重新训练经过预训练的模型,以及如何在 iOS 和 Android 应用中使用经过预训练或重新训练的模型。 -如果您真的对深度学习研究感兴趣,并且想知道每个检测器如何工作以决定使用哪种检测器的所有细节,那么您绝对应该阅读每种方法的论文,并尝试自己复制训练过程。 这将是一条漫长而有益的道路。 但是,如果您想听 Andrej Karpathy 的建议,“不要成为英雄”(在 YouTube 上搜索“Andrej 的计算机视觉深度学习”),那么您可以“采取最有效的方法,下载经过预先训练的模型, 添加/删除其中的某些部分,然后在您的应用程序上对其进行微调”,这也是我们将在此处使用的方法。 +如果您真的对深度学习研究感兴趣,并且想知道每个检测器如何工作以决定使用哪种检测器的所有细节,那么您绝对应该阅读每种方法的论文,并尝试自己复制训练过程。 这将是一条漫长而有益的道路。 但是,如果您想听 Andrej Karpathy 的建议,“不要成为英雄”(在 YouTube 上搜索“Andrej 的计算机视觉深度学习”),那么您可以“采取最有效的方法,下载经过预训练的模型, 添加/删除其中的某些部分,然后在您的应用上对其进行微调”,这也是我们将在此处使用的方法。 在开始研究哪种方法最适合 TensorFlow 之前,让我们快速了解一下数据集。 有 3 个主要的数据集用于训练对象检测:[PASCAL VOC](http://host.robots.ox.ac.uk/pascal/VOC),[ImageNet](http://image-net.org) 和 [Microsoft COCO](http://cocodataset.org),它们具有的类数分别为 20、200 和 80。 TensorFlow 对象检测 API 当前支持的大多数预训练模型都在 80 级 MS COCO 数据集上进行了训练(有关预训练模型及其训练的数据集的完整列表,请参见[这里](https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md)。 @@ -96,7 +96,7 @@ protoc object_detection/protos/*.proto --python_out=. -# 使用预先训练的模型 +# 使用预训练的模型 @@ -235,7 +235,7 @@ Found 4 possible outputs: (name=detection_boxes, op=Identity) (name=detection_sc -# 重新训练 SSD-MobileNet 和更快的 RCNN 模型 +# 重新训练 SSD-MobileNet 和 Faster RCNN 模型 @@ -261,7 +261,7 @@ python object_detection/dataset_tools/create_pet_tf_record.py \ --output_dir=`pwd` ``` -该命令将在`models/research`目录中生成两个名为`pet_train_with_masks.record`(268MB)和`pet_val_with_masks.record`(110MB)的 TFRecord 文件。 TFRecords 是一种有趣的二进制格式,其中包含 TensorFlow 应用程序可用于训练或验证的所有数据,如果您想使用 TensorFlow 对象检测 API 重新训练自己的数据集,则 TFRecords 是必需的文件格式。 +该命令将在`models/research`目录中生成两个名为`pet_train_with_masks.record`(268MB)和`pet_val_with_masks.record`(110MB)的 TFRecord 文件。 TFRecords 是一种有趣的二进制格式,其中包含 TensorFlow 应用可用于训练或验证的所有数据,如果您想使用 TensorFlow 对象检测 API 重新训练自己的数据集,则 TFRecords 是必需的文件格式。 3. 如果在上一节中测试对象检测笔记本时还没有下载`ssd_mobilenet_v1_coco`模型和`faster_rcnn_resnet101_coco`模型并将其解压缩到`models/research`目录,请执行以下操作: @@ -423,7 +423,7 @@ python object_detection/export_inference_graph.py \ 您需要用自己的特定检查点值替换`--trained_checkpoint_prefix`值(上述 21817 和 24009)。 -到此为止-您现在拥有两个经过重新训练的对象检测模型`output_inference_graph_ssd_mobilenet.pb`和`output_inference_graph_faster_rcnn.pb`,可以在您的 Python 代码(上一节中的 Jupyter 笔记本)或移动应用程序中使用它们。 不用再拖延了,让我们跳到移动世界,看看如何使用我们拥有的预先训练和重新训练的模型。 +到此为止-您现在拥有两个经过重新训练的对象检测模型`output_inference_graph_ssd_mobilenet.pb`和`output_inference_graph_faster_rcnn.pb`,可以在您的 Python 代码(上一节中的 Jupyter 笔记本)或移动应用中使用它们。 不用再拖延了,让我们跳到移动世界,看看如何使用我们拥有的预训练和重新训练的模型。 @@ -462,15 +462,15 @@ tensorflow/contrib/makefile/gen/lib/libtensorflow-core.a 前两个库处理我们之前讨论的 protobuf 数据。 最后一个库是 iOS 通用静态库。 -如果您运行该应用程序,请完成以下步骤,并在Xcode控制台中遇到错误,`Invalid argument: No OpKernel was registered to support Op 'Less' with these attrs. Registered devices: [CPU], Registered kernels: device='CPU'; T in [DT_FLOAT]`,您需要在此处执行步骤 2 之前更改`tensorflow/contrib/makefile/Makefile`文件(请参阅第 7 章,“使用 CNN 和 LSTM 识别绘图”中的“为 iOS 构建自定义 TensorFlow 库”一节)。 使用新版本的 TensorFlow 时可能看不到错误。 +如果您运行该应用,请完成以下步骤,并在Xcode控制台中遇到错误,`Invalid argument: No OpKernel was registered to support Op 'Less' with these attrs. Registered devices: [CPU], Registered kernels: device='CPU'; T in [DT_FLOAT]`,您需要在此处执行步骤 2 之前更改`tensorflow/contrib/makefile/Makefile`文件(请参阅第 7 章,“使用 CNN 和 LSTM 识别绘图”中的“为 iOS 构建自定义 TensorFlow 库”一节)。 使用新版本的 TensorFlow 时可能看不到错误。 -# 在应用程序中使用 TensorFlow iOS 库 +# 在应用中使用 TensorFlow iOS 库 -要在您自己的应用程序中使用库,请执行以下操作: +要在您自己的应用中使用库,请执行以下操作: 1. 在 Xcode 中,单击“文件 | 新增 | 项目…”,选择“Single View App”,然后输入 TFObjectDetectionAPI 作为产品名称,然后选择 Objective-C 作为语言(如果您想使用 Swift,请参阅上一章有关如何将 TensorFlow 添加到基于 Swift 的 iOS 应用并进行此处所示的必要更改),然后选择项目的位置并单击“创建”。 2. 在`TFObjectDetectionAPI`项目中,单击项目名称,然后在构建设置下,单击`+`并添加用户定义的设置,然后输入`TENSORFLOW_ROOT`作为 TensorFlow 源根的路径(例如`$HOME/tensorflow-1.4`),如图 3.4 所示。 如果您要引用较新的 TensorFlow 来源,此用户定义的设置将在其他设置中使用,以便以后轻松更改项目设置: @@ -485,7 +485,7 @@ tensorflow/contrib/makefile/gen/lib/libtensorflow-core.a -force_load $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/gen/lib/libtensorflow-core.a $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/gen/protobuf_ios/lib/libprotobuf.a $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/gen/protobuf_ios/lib/libprotobuf-lite.a $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/downloads/nsync/builds/lipo.ios.c++11/nsync.a ``` -需要第一个`–force_load`,因为它确保 TensorFlow 所需的 C++ 构造函数将被链接,否则,您仍可以构建和运行该应用程序,但会遇到有关未注册会话的错误。 +需要第一个`–force_load`,因为它确保 TensorFlow 所需的 C++ 构造函数将被链接,否则,您仍可以构建和运行该应用,但会遇到有关未注册会话的错误。 最后一个库用于`nsync`,这是一个 C 库,[可导出互斥量和其他同步方法](https://github.com/google/nsync)。 在新的 TensorFlow 版本中引入。 @@ -523,7 +523,7 @@ $(TENSORFLOW_ROOT) $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/downloads/prot 只需将手动构建的 TensorFlow 库 TensorFlow 添加到 iOS 应用即可。 -使用从 TensorFlow 的更高版本(例如 1.4)手动构建的 TensorFlow 库在您的应用程序中加载 TensorFlow 对象检测模型时,将不会出现使用 TensorFlow 实验性 POD 或从早期版本构建的手动库时可能会看到的错误版。这是因为位于`tensorflow/contrib/makefile`中的名为`tf_op_files.txt`的文件用于定义应为 TensorFlow 库构建和包括哪些操作,在 TensorFlow 1.4 中定义的操作比早期版本更多。例如,TensorFlow 1.4 中的`tf_op_files.txt`文件有一行`tensorflow/core/kernels/non_max_suppression_op.cc`定义了`NonMaxSuppressionV2`操作,这就是为什么我们手动构建的库中定义了该操作,防止出现错误`Could not create TensorFlow Graph: Not found: Op type not registered 'NonMaxSuppressionV2'`,我们将查看是否发生过使用 TensorFlow 窗格的错误。将来,如果遇到类似的`Op type not registered`错误,则可以通过在`tf_op_files.txt`文件中添加定义操作的正确的源代码文件,然后再次运行`build_all_ios.sh`来修复该错误。创建一个新的`libtensorflow-core.a`文件。 +使用从 TensorFlow 的更高版本(例如 1.4)手动构建的 TensorFlow 库在您的应用中加载 TensorFlow 对象检测模型时,将不会出现使用 TensorFlow 实验性 POD 或从早期版本构建的手动库时可能会看到的错误版。这是因为位于`tensorflow/contrib/makefile`中的名为`tf_op_files.txt`的文件用于定义应为 TensorFlow 库构建和包括哪些操作,在 TensorFlow 1.4 中定义的操作比早期版本更多。例如,TensorFlow 1.4 中的`tf_op_files.txt`文件有一行`tensorflow/core/kernels/non_max_suppression_op.cc`定义了`NonMaxSuppressionV2`操作,这就是为什么我们手动构建的库中定义了该操作,防止出现错误`Could not create TensorFlow Graph: Not found: Op type not registered 'NonMaxSuppressionV2'`,我们将查看是否发生过使用 TensorFlow 窗格的错误。将来,如果遇到类似的`Op type not registered`错误,则可以通过在`tf_op_files.txt`文件中添加定义操作的正确的源代码文件,然后再次运行`build_all_ios.sh`来修复该错误。创建一个新的`libtensorflow-core.a`文件。 @@ -531,10 +531,10 @@ $(TENSORFLOW_ROOT) $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/downloads/prot -现在执行以下步骤以将模型文件,标签文件和代码添加到应用程序,并运行以查看实际的对象检测: +现在执行以下步骤以将模型文件,标签文件和代码添加到应用,并运行以查看实际的对象检测: 1. 拖放上一节中的三个物体检测模型图`ssd_mobilenet_v1_frozen_inference_graph.pb`,`faster_rcnn_inceptionv2_frozen_inference_graph.pb`和`faster_rcnn_resnet101_frozen_inference_graph.pb`,以及`mscoco_label_map.pbtxt`标签映射文件和几个测试图像发送到`TFObjectDetectionAPI`项目。 -2. 将 TensorFlow iOS 示例简单应用程序或上一章中创建的 iOS 应用程序中的`ios_image_load.mm`及其`.h`文件添加到项目中。 +2. 将 TensorFlow iOS 示例简单应用或上一章中创建的 iOS 应用中的`ios_image_load.mm`及其`.h`文件添加到项目中。 3. 在[这里](https://github.com/google/protobuf/releases)(在 Mac 上为`protoc-3.4.0-osx-x86_64.zip`文件)下载协议缓冲区版本 3.4.0。 要使用 TensorFlow 1.4 库需要确切的 3.4.0 版本,而更高版本的 TensorFlow 可能需要更高版本的协议缓冲区。 4. 假设下载的文件解压缩到`~/Downloads`目录中,请打开“终端”窗口并运行以下命令: @@ -568,7 +568,7 @@ void RunInferenceOnImage(NSString *model) ![](img/411e68db-3026-4ba4-964a-3d9a174dce6f.png) -图 3.8:使用不同的模型运行应用程序并显示检测结果 +图 3.8:使用不同的模型运行应用并显示检测结果 返回步骤 7 中的功能,`FilePathForResourceName`函数是用于返回资源文件路径的帮助程序功能:`mscoco_label_map.pbtxt`文件,该文件定义了要检测的 90 个对象类的 ID,内部名称和显示名称。 ,模型图文件和测试图像。 它的实现与我们在上一章的`HelloTensorFlow`应用中看到的实现相同。 @@ -576,13 +576,13 @@ void RunInferenceOnImage(NSString *model) LoadGraph 尝试加载三个用户选择的模型文件之一,并返回加载状态。 -这两个关键功能是`RunInferenceOnImage`和`DrawTopDetections`。 正如我们在“设置 TensorFlow 对象检测 API”部分中所看到的那样,`summary_graph`工具显示了我们在应用程序中使用的三种预训练对象检测模型的以下信息(请注意`uint8`类型): +这两个关键功能是`RunInferenceOnImage`和`DrawTopDetections`。 正如我们在“设置 TensorFlow 对象检测 API”部分中所看到的那样,`summary_graph`工具显示了我们在应用中使用的三种预训练对象检测模型的以下信息(请注意`uint8`类型): ```py Found 1 possible inputs: (name=image_tensor, type=uint8(4), shape=[?,?,?,3]) ``` -这就是为什么我们需要使用`uint8`创建一个图像张量,而不是`float`类型来加载到我们的模型,否则在运行模型时会出现错误。 另请注意,当我们使用 TensorFlow C++ API 的`Session`的`Run`方法将`image_data`转换为`Tensor`类型的`image_data`时,我们不使用`input_mean`和 `input_std`就像我们在使用图像分类模型时所做的(有关详细比较,请参见第 2 章,“通过迁移学习对图像进行分类”的 HelloTensorFlow 应用程序的`RunInferenceOnImage`实现)。 我们知道有四个名为`detection_boxes`,`detection_scores`,`detection_classes`和`num_detections`的输出,因此`RunInferenceOnImage`具有以下代码来为模型输入图像输入并获得四个输出: +这就是为什么我们需要使用`uint8`创建一个图像张量,而不是`float`类型来加载到我们的模型,否则在运行模型时会出现错误。 另请注意,当我们使用 TensorFlow C++ API 的`Session`的`Run`方法将`image_data`转换为`Tensor`类型的`image_data`时,我们不使用`input_mean`和 `input_std`就像我们在使用图像分类模型时所做的(有关详细比较,请参见第 2 章,“通过迁移学习对图像进行分类”的 HelloTensorFlow 应用的`RunInferenceOnImage`实现)。 我们知道有四个名为`detection_boxes`,`detection_scores`,`detection_classes`和`num_detections`的输出,因此`RunInferenceOnImage`具有以下代码来为模型输入图像输入并获得四个输出: ```py tensorflow::Tensor image_tensor(tensorflow::DT_UINT8, tensorflow::TensorShape({1, image_height, image_width, wanted_channels})); @@ -637,13 +637,13 @@ num_detections: 100, detection_scores size: 100, detection_classes size: 100, de Detected 3: kite, 0.769913, (591.238, 72.0729, 676.863, 149.322) ``` -这就是在 iOS 应用中使用现有的经过预先训练的对象检测模型所需要的。 如何在 iOS 中使用我们的经过训练的对象检测模型? 事实证明,这与使用预训练模型几乎相同,在处理再训练图像分类模型时,无需像上一章一样修改`input_size, input_mean, input_std`和`input_name`。 您只需要执行以下操作: +这就是在 iOS 应用中使用现有的经过预训练的对象检测模型所需要的。 如何在 iOS 中使用我们的经过训练的对象检测模型? 事实证明,这与使用预训练模型几乎相同,在处理再训练图像分类模型时,无需像上一章一样修改`input_size, input_mean, input_std`和`input_name`。 您只需要执行以下操作: 1. 将您的训练后的模型(例如,在上一节中创建的`output_inference_graph_ssd_mobilenet.pb`文件,用于模型的训练的标签映射文件,例如`pet_label_map.pbtxt`)添加到`TFObjectDetectionAPI` 项目 2. 在`ViewController.mm`中,使用重新训练的模型调用`RunInferenceOnImage` 3. 仍在`ViewController.mm`中,在`DrawTopDetections`函数内调用`LoadLablesFile([FilePathForResourceName(@"pet_label_map", @"pbtxt") UTF8String], &imageLabels);` -而已。 运行该应用程序,您可以看到针对重新训练的模型对检测到的结果进行了更精细的调整。 例如,使用通过使用牛津宠物数据集进行重新训练而生成的前面的重新训练模型,我们希望看到边界框围绕头部区域而不是整个身体,而这正是我们在图 3.9 中所示的测试图像所看到的: +而已。 运行该应用,您可以看到针对重新训练的模型对检测到的结果进行了更精细的调整。 例如,使用通过使用牛津宠物数据集进行重新训练而生成的前面的重新训练模型,我们希望看到边界框围绕头部区域而不是整个身体,而这正是我们在图 3.9 中所示的测试图像所看到的: ![](img/ced173a8-1b82-4868-a274-3cdf666556e1.png) @@ -651,13 +651,13 @@ num_detections: 100, detection_scores size: 100, detection_classes size: 100, de -# 使用 YOLO2 –另一种物体检测模型 +# 使用 YOLO2 – 另一种物体检测模型 正如我们在第一部分中提到的,[YOLO2](https://pjreddie.com/darknet/yolo) 是另一个很酷的对象检测模型,它使用了与 RCNN 系列不同的方法。 它使用单个神经网络将输入图像划分为固定大小的区域(但不像 RCNN 系列方法那样提供区域建议),并预测每个区域的边界框,类别和概率。 -TensorFlow Android 示例应用程序具有使用预训练的 YOLO 模型的示例代码,但没有 iOS 示例。 由于 YOLO2 是最快的对象检测模型之一,而且非常准确(请在其网站上查看其与 SSD 模型的 mAP 比较),因此有必要了解一下如何在 iOS 应用中使用它。 +TensorFlow Android 示例应用具有使用预训练的 YOLO 模型的示例代码,但没有 iOS 示例。 由于 YOLO2 是最快的对象检测模型之一,而且非常准确(请在其网站上查看其与 SSD 模型的 mAP 比较),因此有必要了解一下如何在 iOS 应用中使用它。 YOLO 使用称为 [Darknet](https://pjreddie.com/darknet) 的独特开源神经网络框架来训练其模型。 [还有另一个名为 darkflow 的库](https://github.com/thtrieu/darkflow),该库可以将使用 Darknet 训练的 YOLO 模型的神经网络权重转换为 TensorFlow 图格式,并重新训练预训练的模型。 @@ -691,7 +691,7 @@ python tensorflow/tools/quantization/quantize_graph.py --input=darkflow/built_gr 现在,请按照以下步骤查看如何在我们的 iOS 应用中使用两个 YOLO 模型: 1. 将`quantized_tiny-yolo-voc.pb`和`quantized_tiny-yolo.pb`都拖到`TFObjectDetectionAPI`项目中 -2. 在`ViewController.mm`中添加两个新的警报操作,因此在运行该应用程序时,您将看到可用于运行的模型,如图 3.10 所示: +2. 在`ViewController.mm`中添加两个新的警报操作,因此在运行该应用时,您将看到可用于运行的模型,如图 3.10 所示: ![](img/532a45ca-35ee-452b-b33a-79d557fee667.png) @@ -724,9 +724,9 @@ YoloPostProcess(model, output->flat(), &top_results); 我们不会在此处显示其余代码。 您可以在源代码存储库的`ch3/ios`中检出完整的 iOS 应用。 -5. 运行该应用程序,然后选择 YOLO2 Tiny VOC 或 YOLO2 Tiny COCO,与使用 SSD MobileNet v1 模型相比,您会看到类似的速度,但检测结果的准确性较差。 +5. 运行该应用,然后选择 YOLO2 Tiny VOC 或 YOLO2 Tiny COCO,与使用 SSD MobileNet v1 模型相比,您会看到类似的速度,但检测结果的准确性较差。 -尽管基于 MobileNet 的 TensorFlow 模型和 Tiny YOLO2 模型的准确性较低,但 TensorFlow 对象检测模型和 YOLO2 模型在移动设备上的运行速度都非常快。 较大的 Faster RNN 模型和完整的 YOLO2 模型更准确,但是它们花费的时间更长,甚至无法在移动设备上运行。 因此,向移动应用程序添加快速对象检测的最佳方法是使用 SSD MobileNet 或 Tiny-YOLO2 模型,或经过重新训练和微调的模型。 模型的未来版本很可能会具有更好的性能和准确性。 凭借本章介绍的知识,您应该能够在 iOS 应用中快速启用对象检测。 +尽管基于 MobileNet 的 TensorFlow 模型和 Tiny YOLO2 模型的准确性较低,但 TensorFlow 对象检测模型和 YOLO2 模型在移动设备上的运行速度都非常快。 较大的 Faster RNN 模型和完整的 YOLO2 模型更准确,但是它们花费的时间更长,甚至无法在移动设备上运行。 因此,向移动应用添加快速对象检测的最佳方法是使用 SSD MobileNet 或 Tiny-YOLO2 模型,或经过重新训练和微调的模型。 模型的未来版本很可能会具有更好的性能和准确性。 凭借本章介绍的知识,您应该能够在 iOS 应用中快速启用对象检测。 @@ -736,8 +736,8 @@ YoloPostProcess(model, output->flat(), &top_results); -在本章中,我们首先简要概述了各种不同的基于深度学习的对象检测方法。 然后,我们详细介绍了如何使用 TensorFlow 对象检测 API 通过预先训练的模型进行现成的推理,以及如何在 Python 中重新训练预先训练的 TensorFlow 对象检测模型。 我们还提供了有关如何手动构建 TensorFlow iOS 库,使用该库创建新的 iOS 应用以及如何在 iOS 中使用预先存在和经过重新训练的 SSD MobileNet 和 Faster RCNN 模型的详细教程。 最后,我们展示了在您的 iOS 应用中使用另一种强大的对象检测模型 YOLO2 所需要的内容。 +在本章中,我们首先简要概述了各种不同的基于深度学习的对象检测方法。 然后,我们详细介绍了如何使用 TensorFlow 对象检测 API 通过预训练的模型进行现成的推理,以及如何在 Python 中重新训练预训练的 TensorFlow 对象检测模型。 我们还提供了有关如何手动构建 TensorFlow iOS 库,使用该库创建新的 iOS 应用以及如何在 iOS 中使用预先存在和经过重新训练的 SSD MobileNet 和 Faster RCNN 模型的详细教程。 最后,我们展示了在您的 iOS 应用中使用另一种强大的对象检测模型 YOLO2 所需要的内容。 -在下一章中,这是我们与计算机视觉相关的第三项任务,我们将仔细研究如何在 Python 和 TensorFlow 中训练和构建有趣的深度学习模型,以及如何在 iOS 和 Android 应用程序中使用它来添加令人赞叹的图像艺术风格。 +在下一章中,这是我们与计算机视觉相关的第三项任务,我们将仔细研究如何在 Python 和 TensorFlow 中训练和构建有趣的深度学习模型,以及如何在 iOS 和 Android 应用中使用它来添加令人赞叹的图像艺术风格。 diff --git a/new/intel-mobi-proj-tf/04.md b/new/intel-mobi-proj-tf/04.md index 7162eeb45bf23ac4dcd0f6a6e45b033975721956..4ad10128777780771044f6e953ec5c528fb4d63a 100644 --- a/new/intel-mobi-proj-tf/04.md +++ b/new/intel-mobi-proj-tf/04.md @@ -4,9 +4,9 @@ -自从 2012 年深层神经网络在 AlexNet 赢得 ImageNet 挑战后开始起飞以来,人工智能研究人员一直在将深度学习技术(包括经过预训练的深度 CNN 模型)应用于越来越多的问题领域。 有什么能比创造艺术更有创造力? 一种想法已经提出并实现了,称为神经样式传递,它使您可以利用预先训练的深度神经网络模型并传递图像或任何梵高的样式或莫奈的杰作),例如另一张图片(例如个人资料图片或您喜欢的狗的图片),从而创建将图片内容与杰作风格融合在一起的图片。 实际上,有一个名为 Prisma 的 iOS 应用程序在 2016 年获得了年度最佳应用程序奖。 在短短几秒钟内,它将以您选择的任何样式转换您的图片。 +自从 2012 年深层神经网络在 AlexNet 赢得 ImageNet 挑战后开始起飞以来,人工智能研究人员一直在将深度学习技术(包括经过预训练的深度 CNN 模型)应用于越来越多的问题领域。 有什么能比创造艺术更有创造力? 一种想法已经提出并实现了,称为神经样式传递,它使您可以利用预训练的深度神经网络模型并传递图像或任何梵高的样式或莫奈的杰作),例如另一张图片(例如个人资料图片或您喜欢的狗的图片),从而创建将图片内容与杰作风格融合在一起的图片。 实际上,有一个名为 Prisma 的 iOS 应用在 2016 年获得了年度最佳应用奖。 在短短几秒钟内,它将以您选择的任何样式转换您的图片。 -在本章中,我们将首先概述三种神经样式转换方法,其中一种是原始方法,一种是经过改进的方法,另一种是进一步改进的方法。 然后,我们将详细研究如何使用第二种方法来训练快速神经样式转换模型,该模型可在您的 iOS 和 Android 智能手机中使用,以实现 Prisma 的功能。 接下来,我们将实际在 iOS 应用程序和 Android 应用程序中使用该模型,引导您完成从头开始创建此类应用程序的整个过程。 最后,我们将向您简要介绍 TensorFlow Magenta 开源项目,您可以将其用于基于深度学习构建更多的音乐和艺术生成应用程序,并向您展示如何使用单个预先训练的样式转换模型, 是基于神经样式转换的最新研究进展而创建的,其中包括 26 种很酷的艺术样式,可在您的 iOS 和 Android 应用中获得更快的性能和结果。 总之,本章将涵盖以下主题: +在本章中,我们将首先概述三种神经样式转换方法,其中一种是原始方法,一种是经过改进的方法,另一种是进一步改进的方法。 然后,我们将详细研究如何使用第二种方法来训练快速神经样式转换模型,该模型可在您的 iOS 和 Android 智能手机中使用,以实现 Prisma 的功能。 接下来,我们将实际在 iOS 应用和 Android 应用中使用该模型,引导您完成从头开始创建此类应用的整个过程。 最后,我们将向您简要介绍 TensorFlow Magenta 开源项目,您可以将其用于基于深度学习构建更多的音乐和艺术生成应用,并向您展示如何使用单个预训练的样式转换模型, 是基于神经样式转换的最新研究进展而创建的,其中包括 26 种很酷的艺术样式,可在您的 iOS 和 Android 应用中获得更快的性能和结果。 总之,本章将涵盖以下主题: * 神经风格转换-快速概述 * 训练快速的神经风格转换模型 @@ -20,7 +20,7 @@ -# 神经风格转换-快速概述 +# 神经风格转换 -- 快速概述 @@ -28,11 +28,11 @@ 尽管原始神经样式转换算法的结果令人惊叹,但其性能却很差-训练是样式转换图像生成过程的一部分,通常在 GPU 上花费几分钟,在 CPU 上花费约一个小时才能生成良好的图像。 结果。 -如果您对原始算法的细节感兴趣,可以在[以下位置](https://github.com/log0/neural-style-painting/blob/master/art.py)阅读该论文以及文档齐全的 Python 实现。我们不会讨论这种原始算法,因为在手机上运行该算法是不可行的,但是尝试该算法很有趣且有用,可以更好地了解如何针对不同的计算机视觉任务使用预先训练的深度 CNN 模型。 +如果您对原始算法的细节感兴趣,可以在[以下位置](https://github.com/log0/neural-style-painting/blob/master/art.py)阅读该论文以及文档齐全的 Python 实现。我们不会讨论这种原始算法,因为在手机上运行该算法是不可行的,但是尝试该算法很有趣且有用,可以更好地了解如何针对不同的计算机视觉任务使用预训练的深度 CNN 模型。 自然地,在 2016 年,论文中发布了一种“快三个数量级”的新算法,即[《实时样式传递和超分辨率的感知损失》](https://cs.stanford.edu/people/jcjohns/eccv16/),作者是 Justin Johnson 等。 它使用单独的训练过程,并定义了更好的损失函数,这些函数本身就是深度神经网络。 训练后(在下一节中我们将看到,在 GPU 上可能要花费几个小时),使用训练后的模型来生成样式转换的图像在计算机上几乎是实时的,而在智能手机上只需几秒钟。 -使用这种快速神经传递算法仍然有一个缺点:只能针对特定样式训练模型,因此,要在您的应用中使用不同的样式,必须逐一训练这些样式以为每种样式生成一个模型 。 2017 年发表了一篇名为[《学习风格的艺术表现形式》](https://arxiv.org/abs/1610.07629)的新论文,它发现一个单一的深度神经网络模型可以概括许多不同的样式。 [TensorFlow Magenta 项目](https://github.com/tensorflow/magenta/tree/master/magenta/models/image_stylization)包括具有多种样式的预训练模型,我们将在本章的最后两个部分中看到,在 iOS 和 Android 应用程序中使用这种模型来产生强大而神奇的艺术效果是多么容易。 +使用这种快速神经迁移算法仍然有一个缺点:只能针对特定样式训练模型,因此,要在您的应用中使用不同的样式,必须逐一训练这些样式以为每种样式生成一个模型 。 2017 年发表了一篇名为[《学习风格的艺术表现形式》](https://arxiv.org/abs/1610.07629)的新论文,它发现一个单一的深度神经网络模型可以概括许多不同的样式。 [TensorFlow Magenta 项目](https://github.com/tensorflow/magenta/tree/master/magenta/models/image_stylization)包括具有多种样式的预训练模型,我们将在本章的最后两个部分中看到,在 iOS 和 Android 应用中使用这种模型来产生强大而神奇的艺术效果是多么容易。 @@ -42,10 +42,10 @@ -在本部分中,我们将向您展示如何使用带有 TensorFlow 的快速神经样式传输算法训练模型。 执行以下步骤来训练这样的模型: +在本部分中,我们将向您展示如何使用带有 TensorFlow 的快速神经样式迁移算法训练模型。 执行以下步骤来训练这样的模型: -1. 在 Mac 的终端上,或者最好在 GPU 驱动的 Ubuntu 上,运行`git clone https://github.com/jeffxtang/fast-style-transfer`,这是 Johnson 的快速样式传输的 TensorFlow 实现的一个很好的分支,已修改为允许在 iOS 或 Android 应用中使用经过训练的模型。 -2. `cd`到快速样式迁移目录,然后运行`setup.sh`脚本下载预先训练的 VGG-19 模型文件以及 MS COCO 训练数据集,我们在上一章中提到过,注意下载大文件可能需要几个小时。 +1. 在 Mac 的终端上,或者最好在 GPU 驱动的 Ubuntu 上,运行`git clone https://github.com/jeffxtang/fast-style-transfer`,这是 Johnson 的快速样式迁移的 TensorFlow 实现的一个很好的分支,已修改为允许在 iOS 或 Android 应用中使用经过训练的模型。 +2. `cd`到快速样式迁移目录,然后运行`setup.sh`脚本下载预训练的 VGG-19 模型文件以及 MS COCO 训练数据集,我们在上一章中提到过,注意下载大文件可能需要几个小时。 3. 运行以下命令,使用名为`starry_night.jpg`的样式图像和名为`ww1.jpg`的内容图像进行训练,以创建检查点文件: ```py @@ -95,17 +95,17 @@ bazel-bin/tensorflow/tools/quantization/quantize_graph \ --mode=weights ``` -这会将冻结的图形文件大小从 6.7MB 减小到 1.7MB,这意味着,如果在您的应用中放置 50 种不同风格的 50 个模型,则增加的大小将约为 85MB。 苹果于 2017 年 9 月宣布,蜂窝无线应用程序下载限制已增加至 150MB,因此用户仍应能够通过蜂窝网络下载具有 50 多种不同样式的应用程序。 +这会将冻结的图形文件大小从 6.7MB 减小到 1.7MB,这意味着,如果在您的应用中放置 50 种不同风格的 50 个模型,则增加的大小将约为 85MB。 苹果于 2017 年 9 月宣布,蜂窝无线应用下载限制已增加至 150MB,因此用户仍应能够通过蜂窝网络下载具有 50 多种不同样式的应用。 -这就是使用样式图像和输入图像来训练和量化快速神经传递模型的全部步骤。 您可以在步骤 3 中生成的 `test_dir` 目录中签出生成的图像,以查看样式转换的效果。 如果需要,您可以使用[中记录的超参数 https://github.com/jeffxtang/fast-style-transfer/blob/master/docs.md#style](https://github.com/jeffxtang/fast-style-transfer/blob/master/docs.md#style) 进行查看,以及希望样式迁移效果更好。 +这就是使用样式图像和输入图像来训练和量化快速神经迁移模型的全部步骤。 您可以在步骤 3 中生成的 `test_dir` 目录中签出生成的图像,以查看样式转换的效果。 如果需要,您可以使用[中记录的超参数 https://github.com/jeffxtang/fast-style-transfer/blob/master/docs.md#style](https://github.com/jeffxtang/fast-style-transfer/blob/master/docs.md#style) 进行查看,以及希望样式迁移效果更好。 -在了解如何在 iOS 和 Android 应用程序中使用这些模型之前,重要的一点是,您需要记下在第 5 步中使用的,指定为`--in-path`值的图像的确切图像宽度和高度参数,并在 iOS 或 Android 代码中使用图像的宽度和高度值(您会看到多久了),否则在应用中运行模型时,会出现 `Conv2DCustomBackpropInput: Size of out_backprop doesn't match computed`错误 。 +在了解如何在 iOS 和 Android 应用中使用这些模型之前,重要的一点是,您需要记下在第 5 步中使用的,指定为`--in-path`值的图像的确切图像宽度和高度参数,并在 iOS 或 Android 代码中使用图像的宽度和高度值(您会看到多久了),否则在应用中运行模型时,会出现 `Conv2DCustomBackpropInput: Size of out_backprop doesn't match computed`错误 。 -# 在 iOS 中使用快速的神经样式传输模型 +# 在 iOS 中使用快速的神经样式迁移模型 @@ -117,19 +117,19 @@ 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 应用。 -# 使用快速神经传递模型进行添加和测试 +# 对快速神经迁移模型进行添加和测试 -如果您尚未手动构建 TensorFlow 库,则需要先回到上一章。 然后执行以下步骤以将 TensorFlow 支持和快速的神经样式传输模型文件添加到您的 iOS 应用并测试运行该应用: +如果您尚未手动构建 TensorFlow 库,则需要先回到上一章。 然后执行以下步骤以将 TensorFlow 支持和快速的神经样式迁移模型文件添加到您的 iOS 应用并测试运行该应用: -1. 如果您已经具有添加了 TensorFlow 手动库的 iOS 应用,则可以跳过此步骤。 否则,类似于我们在上一章中所做的,创建一个新的基于 Objective-C 的 iOS 应用程序,例如`NeuralStyleTransfer`,或者在现有应用程序中,在`PROJECT`下创建一个新的用户定义设置,命名为`TENSORFLOW_ROOT`,值为`$HOME/tensorflow-1.4.0`,假定在那儿已安装 TensorFlow 1.4.0,然后在`TARGET`的构建设置中,将其他链接器标志设置为: +1. 如果您已经具有添加了 TensorFlow 手动库的 iOS 应用,则可以跳过此步骤。 否则,类似于我们在上一章中所做的,创建一个新的基于 Objective-C 的 iOS 应用,例如`NeuralStyleTransfer`,或者在现有应用中,在`PROJECT`下创建一个新的用户定义设置,命名为`TENSORFLOW_ROOT`,值为`$HOME/tensorflow-1.4.0`,假定在那儿已安装 TensorFlow 1.4.0,然后在`TARGET`的构建设置中,将其他链接器标志设置为: ```py -force_load $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/gen/lib/libtensorflow-core.a $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/gen/protobuf_ios/lib/libprotobuf.a $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/gen/protobuf_ios/lib/libprotobuf-lite.a $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/downloads/nsync/builds/lipo.ios.c++11/nsync.a @@ -141,10 +141,10 @@ Could not create TensorFlow Graph: Invalid argument: No OpKernel was registered $(TENSORFLOW_ROOT) $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/downloads/protobuf/src $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/downloads $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/downloads/eigen $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/gen/proto ``` -2. 将 `fst_frozen_quantized.pb` 文件和一些测试图像拖放到项目的文件夹中。 从以前的 iOS 应用程序中,或从本书源代码仓库中`Ch4/ios`下的`NeuralStyleTransfer`应用程序文件夹中复制我们在前几章中使用过的相同`ios_image_load.mm`和`.h`文件到项目中。 -3. 将`ViewController.m`重命名为`ViewController.mm`并将其替换为`Ch4/ios/NeuralStyleTransfer`中的`ViewController.h`和`.mm`文件。 在测试运行该应用程序后,我们将详细介绍核心代码段。 +2. 将 `fst_frozen_quantized.pb` 文件和一些测试图像拖放到项目的文件夹中。 从以前的 iOS 应用中,或从本书源代码仓库中`Ch4/ios`下的`NeuralStyleTransfer`应用文件夹中复制我们在前几章中使用过的相同`ios_image_load.mm`和`.h`文件到项目中。 +3. 将`ViewController.m`重命名为`ViewController.mm`并将其替换为`Ch4/ios/NeuralStyleTransfer`中的`ViewController.h`和`.mm`文件。 在测试运行该应用后,我们将详细介绍核心代码段。 -4. 在 iOS 模拟器或 iOS 设备上运行该应用程序,您将看到一张狗图片,如图 4.2 所示: +4. 在 iOS 模拟器或 iOS 设备上运行该应用,您将看到一张狗图片,如图 4.2 所示: ![](img/9bdc2a19-7e59-4f72-b41f-ea3eeba0c5c5.png) @@ -162,7 +162,7 @@ $(TENSORFLOW_ROOT) $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/downloads/prot -# 使用快速神经传递模型回顾 iOS 代码 +# 回顾快速神经迁移模型的 iOS 代码 @@ -175,7 +175,7 @@ const int wanted_width = 300; const int wanted_height = 400; ``` -2. iOS 的分派队列用于在非 UI 线程中加载和运行我们的快速神经传递模型,并在生成样式转换的图像后,将图像发送到 UI 线程进行显示: +2. iOS 的分派队列用于在非 UI 线程中加载和运行我们的快速神经迁移模型,并在生成样式转换的图像后,将图像发送到 UI 线程进行显示: ```py dispatch_async(dispatch_get_global_queue(0, 0), ^{ @@ -236,19 +236,19 @@ return imgScaled; -# 在 Android 中使用快速的神经样式传输模型 +# 在 Android 中使用快速的神经样式迁移模型 -在第 2 章,“通过迁移学习对图像进行分类”中,我们描述了如何将 TensorFlow 添加到您自己的 Android 应用中,但没有任何 UI。 让我们创建一个新的 Android 应用程序,以使用我们之前训练并在 iOS 中使用的快速样式传输模型。 +在第 2 章,“通过迁移学习对图像进行分类”中,我们描述了如何将 TensorFlow 添加到您自己的 Android 应用中,但没有任何 UI。 让我们创建一个新的 Android 应用,以使用我们之前训练并在 iOS 中使用的快速样式迁移模型。 -由于此 Android 应用程序提供了一个很好的机会来使用最少的 TensorFlow 相关代码,Android UI 和线程化代码来运行完整的 TensorFlow 模型驱动的应用程序,因此,我们将从头开始添加每行代码,以帮助您进一步了解从头开始开发 Android TensorFlow 应用需要什么: +由于此 Android 应用提供了一个很好的机会来使用最少的 TensorFlow 相关代码,Android UI 和线程化代码来运行完整的 TensorFlow 模型驱动的应用,因此,我们将从头开始添加每行代码,以帮助您进一步了解从头开始开发 Android TensorFlow 应用需要什么: -1. 在 Android Studio 中,选择“文件 | 新增 | 新项目...”,然后输入`FastNeuralTransfer`作为应用程序名称; 在单击“完成”之前,接受所有默认设置。 +1. 在 Android Studio 中,选择“文件 | 新增 | 新项目...”,然后输入`FastNeuralTransfer`作为应用名称; 在单击“完成”之前,接受所有默认设置。 -2. 创建一个新的`assets`文件夹,如图 2.13 所示,然后将您训练过的快速神经传递模型从 iOS 应用中拖动(如果您在上一节中尝试过),或者从文件夹`/tf_files`中拖动,如“训练快速神经样式转换模型”部分步骤 7 所示,以及一些测试图像到`assets`文件夹。 +2. 创建一个新的`assets`文件夹,如图 2.13 所示,然后将您训练过的快速神经迁移模型从 iOS 应用中拖动(如果您在上一节中尝试过),或者从文件夹`/tf_files`中拖动,如“训练快速神经样式转换模型”部分步骤 7 所示,以及一些测试图像到`assets`文件夹。 -3. 在应用程序的`build.gradle` 文件中,在 `dependencies` 的末尾添加一行 `compile 'org.tensorflow:tensorflow-android:+'`和。 +3. 在应用的`build.gradle` 文件中,在 `dependencies` 的末尾添加一行 `compile 'org.tensorflow:tensorflow-android:+'`和。 4. 打开`res/layout/activity_main.xml`文件,在其中删除默认的`TextView`,然后首先添加一个`ImageView`以显示样式转换前后的图像: @@ -279,13 +279,13 @@ return imgScaled; app:layout_constraintVertical_bias="0.965" /> ``` -6. 在应用程序的`MainActivity.java`文件中,首先输入我们最重要的导入: +6. 在应用的`MainActivity.java`文件中,首先输入我们最重要的导入: ```py import org.tensorflow.contrib.android.TensorFlowInferenceInterface; ``` -`TensorFlowInferenceInterface`提供 JAVA 接口来访问本机 TensorFlow 推理 API。 然后确保`MainActivity`类实现了`Runnable` 接口,因为我们需要保持我们的应用程序响应速度,并在工作线程上加载并运行 TensorFlow 模型。 +`TensorFlowInferenceInterface`提供 JAVA 接口来访问本机 TensorFlow 推理 API。 然后确保`MainActivity`类实现了`Runnable` 接口,因为我们需要保持我们的应用响应速度,并在工作线程上加载并运行 TensorFlow 模型。 7. 在类的开头,定义六个常量,如下所示: @@ -380,7 +380,7 @@ for (int i = 0; i < intValues.length; i++) { 注意,`val`或`intValues`像素阵列的每个元素是一个 32 位整数,在其每个 8 位区域中均保留 ARGB。 我们使用向右移位(用于红色和绿色)和按位与运算来提取每个像素的红色,绿色和蓝色值,而忽略`intValues`元素中最左边的 8 位的 Alpha 值。 因此`floatValues[i*3]`,`floatValues[i*3+1]`和`floatValues[i*3+2]`分别保持像素的红色,绿色和蓝色值。 -现在,我们创建一个新的`TensorFlowInferenceInterface`实例,并在其中将`AssetManager`实例和模型文件名传递到`assets`文件夹中,然后使用 `TensorFlowInferenceInterface`实例将转换后的[ `floatValues`阵列。 如果模型需要多个输入节点,则可以调用多个`feed`方法。 然后,我们通过传递输出节点名称的字符串数组来运行模型。 在这里,对于我们的快速样式传输模型,我们只有一个输入节点和一个输出节点。 最后,我们通过传递输出节点名称来获取模型的输出值。 如果希望接收多个输出节点,则可以调用多个访存: +现在,我们创建一个新的`TensorFlowInferenceInterface`实例,并在其中将`AssetManager`实例和模型文件名传递到`assets`文件夹中,然后使用 `TensorFlowInferenceInterface`实例将转换后的[ `floatValues`阵列。 如果模型需要多个输入节点,则可以调用多个`feed`方法。 然后,我们通过传递输出节点名称的字符串数组来运行模型。 在这里,对于我们的快速样式迁移模型,我们只有一个输入节点和一个输出节点。 最后,我们通过传递输出节点名称来获取模型的输出值。 如果希望接收多个输出节点,则可以调用多个访存: ```py AssetManager assetManager = getAssets(); @@ -416,7 +416,7 @@ msg.obj = "Tranfer Processing Done"; mHandler.sendMessage(msg); ``` -因此,总共不到 100 行代码,您就有了一个完整的 Android 应用程序,可以对图像进行惊人的样式转换。 在 Android 设备或虚拟设备上运行该应用程序,首先将看到一个带有按钮的测试图像,点击该按钮,几秒钟后,您将看到样式转换的图像,如图 4.4 所示: +因此,总共不到 100 行代码,您就有了一个完整的 Android 应用,可以对图像进行惊人的样式转换。 在 Android 设备或虚拟设备上运行该应用,首先将看到一个带有按钮的测试图像,点击该按钮,几秒钟后,您将看到样式转换的图像,如图 4.4 所示: ![](img/07ef305b-1e23-4a4c-98f5-faf14f398d65.png) @@ -432,7 +432,7 @@ mHandler.sendMessage(msg); -[TensorFlow Magenta 项目](https://github.com/tensorflow/magenta)允许您使用 10 多种经过预训练的模型来生成新的音乐和图像。 在本节和下一节中,我们将重点介绍使用 Magenta 的图像样式化模型。 您可以单击链接在计算机上安装 Magenta,尽管要在移动应用程序中使用其炫酷的图像样式传输模型,也不必安装 Magenta。 基于论文《艺术风格的习得表示》实现的 Magenta 预训练风格转换模型,消除了一个模型只能具有一种风格的限制,并允许多种风格包含在单个模型文件中,您可以选择使用这些样式的任意组合。 您可以在[这个页面](https://github.com/tensorflow/magenta/tree/master/magenta/models/image_stylization)上快速浏览该演示,但可以在此处下载两个预先训练的检查点模型。 由于检查点文件中保存了某些`NaN`(不是数字)错误,因此无法直接在您的移动应用中使用。 我们不会详细说明如何删除这些数字并生成可在您的应用中使用的`.pb`模型文件(如果感兴趣,您可以查看[这里](https://github.com/tensorflow/tensorflow/issues/9678)),我们仅使用 TensorFlow Android 示例`tensorflow/examples/android/assets`中包含的经过预训练的`stylize_quantized.pb`模型文件来查看其工作原理。 +[TensorFlow Magenta 项目](https://github.com/tensorflow/magenta)允许您使用 10 多种经过预训练的模型来生成新的音乐和图像。 在本节和下一节中,我们将重点介绍使用 Magenta 的图像样式化模型。 您可以单击链接在计算机上安装 Magenta,尽管要在移动应用中使用其炫酷的图像样式迁移模型,也不必安装 Magenta。 基于论文《艺术风格的习得表示》实现的 Magenta 预训练风格转换模型,消除了一个模型只能具有一种风格的限制,并允许多种风格包含在单个模型文件中,您可以选择使用这些样式的任意组合。 您可以在[这个页面](https://github.com/tensorflow/magenta/tree/master/magenta/models/image_stylization)上快速浏览该演示,但可以在此处下载两个预训练的检查点模型。 由于检查点文件中保存了某些`NaN`(不是数字)错误,因此无法直接在您的移动应用中使用。 我们不会详细说明如何删除这些数字并生成可在您的应用中使用的`.pb`模型文件(如果感兴趣,您可以查看[这里](https://github.com/tensorflow/tensorflow/issues/9678)),我们仅使用 TensorFlow Android 示例`tensorflow/examples/android/assets`中包含的经过预训练的`stylize_quantized.pb`模型文件来查看其工作原理。 如果您确实想训练自己的模型,则可以按照前面的`image_stylization`链接中的训练模型下的步骤进行。 但是请注意,您至少需要 500GB 的可用磁盘空间才能下载 ImageNet 数据集,并需要强大的 GPU 来完成训练。 在本节或下一节中看到代码和结果之后,您更有可能对预训练的`stylize_quantized.pb`模型启用的炫酷样式转换效果感到满意。 @@ -463,7 +463,7 @@ std::string style_layer = "style_num"; std::string output_layer = "transformer/expand/conv3/conv/Sigmoid"; ``` -4. 与快速样式传输模型不同,此处的多样式模型期望使用 4 维浮点张量作为图像输入: +4. 与快速样式迁移模型不同,此处的多样式模型期望使用 4 维浮点张量作为图像输入: ```py tensorflow::Tensor image_tensor(tensorflow::DT_FLOAT, tensorflow::TensorShape({1, wanted_height, wanted_width, wanted_channels})); @@ -486,7 +486,7 @@ for (int i = 0; i < NUM_STYLES; i++) { out_style[19] = 1.0; ``` -`out_style`数组中所有值的总和必须为 1,最终的样式传输图像将是由`out_style`数组中指定的值加权的样式的混合。 例如,前面的代码将仅使用繁星点点的夜晚样式(数组索引 19 对应于图 4.5 中的样式图像列表中的第 20 个图像)。 +`out_style`数组中所有值的总和必须为 1,最终的样式迁移图像将是由`out_style`数组中指定的值加权的样式的混合。 例如,前面的代码将仅使用繁星点点的夜晚样式(数组索引 19 对应于图 4.5 中的样式图像列表中的第 20 个图像)。 如果希望将繁星点点的夜景图像和右上角图像均匀混合,则需要用以下代码替换前面代码块中的最后一行: @@ -511,7 +511,7 @@ for (int i = 0; i < NUM_STYLES; i++) { tensorflow::Status run_status = session->Run({{input_layer, image_tensor}, {style_layer, style_tensor}}, {output_layer}, {}, &outputs); ``` -这些就是使用多样式模型运行 iOS 应用所需的全部更改。 现在运行您的应用程序,您将首先看到如图 4.6 所示的内容: +这些就是使用多样式模型运行 iOS 应用所需的全部更改。 现在运行您的应用,您将首先看到如图 4.6 所示的内容: ![](img/f2841f1f-b0c3-412d-822b-5e9d0f34f235.png) @@ -535,7 +535,7 @@ tensorflow::Status run_status = session->Run({{input_layer, image_tensor}, {styl 图 4.9:多种样式的不同混合的结果(左边:一半星空一半其它,右边:所有 26 种样式的混合) -多样式模型在 iPhone 6 上运行大约需要 5 秒钟,比快速样式传输模型运行快大约 2-3 倍。 +多样式模型在 iPhone 6 上运行大约需要 5 秒钟,比快速样式迁移模型运行快大约 2-3 倍。 @@ -545,11 +545,11 @@ tensorflow::Status run_status = session->Run({{input_layer, image_tensor}, {styl -尽管 TensorFlow Android 示例应用程序已经具有使用多种样式模型的代码(实际上我们在上一节的 iOS 应用中使用了 Android 示例应用程序中的模型),但示例应用程序中与 TensorFlow 相关的代码却与超过 600 行的`StylizeActivity.java`文件中的很多 UI 代码混在一起。 您还可以通过 TensorFlow Android 样式转换的 [Codelab](https://codelabs.developers.google.com/codelabs/tensorflow-style-transfer-android/index.html) 进行操作,但是代码与 TensorFlow Android 示例应用程序大致相同。 由于我们已经使用 TensorFlow 快速样式传输模型实现了 Android 应用程序的简约实现,因此很有趣的是,我们如何仅需更改几行代码就可以拥有一个强大的多样式样式传输应用程序。 这也应该是一种更直观的方法,以了解如何将出色的 TensorFlow 模型添加到现有的 Android 应用中。 +尽管 TensorFlow Android 示例应用已经具有使用多种样式模型的代码(实际上我们在上一节的 iOS 应用中使用了 Android 示例应用中的模型),但示例应用中与 TensorFlow 相关的代码却与超过 600 行的`StylizeActivity.java`文件中的很多 UI 代码混在一起。 您还可以通过 TensorFlow Android 样式转换的 [Codelab](https://codelabs.developers.google.com/codelabs/tensorflow-style-transfer-android/index.html) 进行操作,但是代码与 TensorFlow Android 示例应用大致相同。 由于我们已经使用 TensorFlow 快速样式迁移模型实现了 Android 应用的简约实现,因此很有趣的是,我们如何仅需更改几行代码就可以拥有一个强大的多样式样式迁移应用。 这也应该是一种更直观的方法,以了解如何将出色的 TensorFlow 模型添加到现有的 Android 应用中。 -因此,这就是在我们之前构建的 Android 应用中使用多样式传输模型所需要的: +因此,这就是在我们之前构建的 Android 应用中使用多样式迁移模型所需要的: -1. 将 `stylize_quantized.pb`文件从`tensorflow/examples/android/assets`拖放到我们 Android 应用程序的`assets`文件夹中。 +1. 将 `stylize_quantized.pb`文件从`tensorflow/examples/android/assets`拖放到我们 Android 应用的`assets`文件夹中。 2. 在 Android Studio 中,打开`MainActivity.java`,找到以下三行代码: @@ -568,9 +568,9 @@ private static final String INPUT_NODE = "input"; private static final String OUTPUT_NODE = "transformer/expand/conv3/conv/Sigmoid"; ``` -这些值与我们在上一节中构建的 iOS 应用相同。 如果您仅进行 Android 应用程序开发并跳过了上一个 iOS 部分,请快速阅读上一个 iOS 部分中对步骤 3 的解释。 +这些值与我们在上一节中构建的 iOS 应用相同。 如果您仅进行 Android 应用开发并跳过了上一个 iOS 部分,请快速阅读上一个 iOS 部分中对步骤 3 的解释。 -3. 替换以下代码片段,该片段将输入图像馈送到快速样式传输模型并处理输出图像: +3. 替换以下代码片段,该片段将输入图像馈送到快速样式迁移模型并处理输出图像: ```py mInferenceInterface.feed(INPUT_NODE, floatValues, WANTED_HEIGHT, WANTED_WIDTH, 3); @@ -617,7 +617,7 @@ for (int i=0; i < intValues.length; ++i) { 注意,多样式模型返回浮点数数组到`outputValues`,它们的范围都在 0.0 到 1.0 之间,因此我们需要将它们相乘。在应用左位移操作以获取红色和绿色值之前,先进行 255 乘以 255,然后对 `intValues` 数组的每个元素应用按位“或”设置最终 ARGB 值。 -这就是将酷炫的多样式模型添加到独立的 Android 应用程序所需的全部工作。 现在,让我们运行该应用程序,并使用不同的测试图像,但使用与 iOS 应用程序中相同的三种样式值组合。 +这就是将酷炫的多样式模型添加到独立的 Android 应用所需的全部工作。 现在,让我们运行该应用,并使用不同的测试图像,但使用与 iOS 应用中相同的三种样式值组合。 将第 20 和第 5 种样式图像按步骤 3 中的代码片段进行均等混合后,原始图像和传输的图像如图 4.10 所示: @@ -656,7 +656,7 @@ for (int i = 0; i < NUM_STYLES; ++i) { 图 4.11:仅以星空风格来风格化的图像,以及将所有 26 种风格均等混合的图像 -在一些强大的 TensorFlow 模型的帮助下以及我们如何在移动应用程序中使用它们的知识,看起来我们的移动开发人员也可以成为伟大的艺术家。 +在一些强大的 TensorFlow 模型的帮助下以及我们如何在移动应用中使用它们的知识,看起来我们的移动开发人员也可以成为伟大的艺术家。 @@ -666,8 +666,8 @@ for (int i = 0; i < NUM_STYLES; ++i) { -在本章中,我们首先概述了自 2015 年以来开发的各种神经样式转换方法。然后,我们展示了如何训练第二代样式转换模型,该模型足够快,可以在几秒钟内在移动设备上运行。 之后,我们介绍了如何在 iOS 应用程序和 Android 应用程序中使用该模型,这些方法是从头开始构建的,采用极简方法,总共不到 100 行代码。 最后,我们讨论了如何在 iOS 和 Android 应用程序中使用 TensorFlow Magenta 多样式神经传递模型,该模型在单个小模型中包含 26 种惊人的艺术样式。 +在本章中,我们首先概述了自 2015 年以来开发的各种神经样式转换方法。然后,我们展示了如何训练第二代样式转换模型,该模型足够快,可以在几秒钟内在移动设备上运行。 之后,我们介绍了如何在 iOS 应用和 Android 应用中使用该模型,这些方法是从头开始构建的,采用极简方法,总共不到 100 行代码。 最后,我们讨论了如何在 iOS 和 Android 应用中使用 TensorFlow Magenta 多样式神经迁移模型,该模型在单个小模型中包含 26 种惊人的艺术样式。 -在下一章中,我们将探讨另一个在人类或我们最好的朋友演示时被视为智能的任务:能够识别语音命令。 谁不想让我们的狗狗理解“坐下”,“来”,“不”等命令或我们的婴儿对“是”,“停止”或“走”做出回应? 让我们看看我们如何开发与它们一样的移动应用程序。 +在下一章中,我们将探讨另一个在人类或我们最好的朋友演示时被视为智能的任务:能够识别语音命令。 谁不想让我们的狗狗理解“坐下”,“来”,“不”等命令或我们的婴儿对“是”,“停止”或“走”做出回应? 让我们看看我们如何开发与它们一样的移动应用。 diff --git a/new/intel-mobi-proj-tf/05.md b/new/intel-mobi-proj-tf/05.md index a0ac3de35b474e064efde0803f9182fae425f551..f9728a3a433ec770d14cac8d37d8fce9109b0c5f 100644 --- a/new/intel-mobi-proj-tf/05.md +++ b/new/intel-mobi-proj-tf/05.md @@ -8,7 +8,7 @@ 但是在某些情况下,能够离线识别设备上的简单语音命令是有意义的。 例如,要控制 Raspberry-Pi 驱动的机器人的运动,您不需要复杂的语音命令,不仅设备上的 ASR 比基于云的解决方案还快,而且即使在没有网络访问的环境。 设备上的简单语音命令识别还可以通过仅在发出某些明确的用户命令时才向服务器发送复杂的用户语音来节省网络带宽。 -在本章中,我们将首先概述 ASR 技术,涵盖基于最新的深度学习系统和顶级开源项目。 然后,我们将讨论如何训练和重新训练 TensorFlow 模型,以识别简单的语音命令,例如`"left", "right", "up", "down", "stop", "go"`。 接下来,我们将使用训练有素的模型来构建一个简单的 Android 应用程序,然后再构建两个完整的 iOS 应用程序,一个由 Objective-C 实现,另一个由 Swift 实现。 在前两章中我们没有介绍使用 TensorFlow 模型的基于 Swift 的 iOS 应用,而本章是回顾和加强我们对构建基于 Swift 的 TensorFlow iOS 应用的理解的好地方。 +在本章中,我们将首先概述 ASR 技术,涵盖基于最新的深度学习系统和顶级开源项目。 然后,我们将讨论如何训练和重新训练 TensorFlow 模型,以识别简单的语音命令,例如`"left", "right", "up", "down", "stop", "go"`。 接下来,我们将使用训练有素的模型来构建一个简单的 Android 应用,然后再构建两个完整的 iOS 应用,一个由 Objective-C 实现,另一个由 Swift 实现。 在前两章中我们没有介绍使用 TensorFlow 模型的基于 Swift 的 iOS 应用,而本章是回顾和加强我们对构建基于 Swift 的 TensorFlow iOS 应用的理解的好地方。 总之,本章将涵盖以下主题: @@ -22,7 +22,7 @@ -# 语音识别-快速概述 +# 语音识别 -- 快速概述 @@ -36,7 +36,7 @@ RNN 允许我们处理输入和/或输出的序列,因为根据设计,网络 在 2015 年和 2016 年,较新的语音识别系统使用了类似的端到端 RNN 方法,但将 CTC 层替换为[基于注意力的模型](https://arxiv.org/pdf/1508.01211.pdf),因此运行模型时不需要大型语言模型,因此可以在内存有限的移动设备上进行部署。 在本书的此版本中,我们将不会探讨这种可能性,而将介绍如何在移动应用中使用最新的高级 ASR 模型。 相反,我们将从一个更简单的语音识别模型开始,我们知道该模型肯定会在移动设备上很好地工作。 -要将离线语音识别功能添加到移动应用程序,您还可以使用以下两个领先的开源语音识别项目之一: +要将离线语音识别功能添加到移动应用,您还可以使用以下两个领先的开源语音识别项目之一: * [CMU Sphinx](https://cmusphinx.github.io) 大约 20 年前开始,但仍在积极开发中。 要构建具有语音识别功能的 Android 应用,您可以使用其为 Android 构建的 [PocketSphinx](https://github.com/cmusphinx/pocketsphinx-android)。 要构建具有语音识别功能的 iOS 应用,您可以使用 [OpenEars 框架](https://www.politepix.com/openears),这是一个免费的 SDK,在 iOS 应用中使用 CMU PocketSphinx 构建离线语音识别和文本转换。 * [Kaldi](https://github.com/kaldi-asr/kaldi),成立于 2009 年,最近非常活跃,截至 2018 年 1 月,已有 165 个参与者。要在 Android 上进行尝试,您可以查看[此博客文章](http://jcsilva.github.io/2017/03/18/compile-kaldi-android)。 对于 iOS,请查看[在 iOS 上使用 Kaldi 的原型](https://github.com/keenresearch/keenasr-ios-poc)。 @@ -112,7 +112,7 @@ stop go ``` -现在运行以下命令,将图形定义文件和检查点文件组合成一个我们可以在移动应用程序中使用的模型文件: +现在运行以下命令,将图形定义文件和检查点文件组合成一个我们可以在移动应用中使用的模型文件: ```py python tensorflow/examples/speech_commands/freeze.py \ @@ -120,7 +120,7 @@ python tensorflow/examples/speech_commands/freeze.py \ --output_file=/tmp/speech_commands_graph.pb ``` -4. (可选)在移动应用程序中部署`speech_commands_graph.pb`模型文件之前,可以使用以下命令对其进行快速测试: +4. (可选)在移动应用中部署`speech_commands_graph.pb`模型文件之前,可以使用以下命令对其进行快速测试: ```py python tensorflow/examples/speech_commands/label_wav.py \ @@ -169,7 +169,7 @@ Out[5]: u'labels_softmax'] ``` -因此,我们看到`wav_data`和`decoded_sample_data`都是可能的输入。 如果在`freeze.py`文件中看不到注释,我们就必须深入研究模型训练代码,以准确找出应该使用的输入名称:“结果图包含一个名为 WAV 的编码数据输入 `wav_data`,用于原始 PCM 数据(在 -1.0 到 1.0 范围内浮动)的一种称为`decoded_sample_data`,输出称为`labels_softmax`。” 实际上,在该模型的情况下,有一个 TensorFlow Android 示例应用程序,这是我们在第 1 章,“移动 TensorFlow 入门”中看到的一部分,称为 TF 语音,专门定义了那些输入名称和输出名称。 在本书后面的几章中,您将看到如何在需要时借助或不借助我们的三种方法来查找模型训练的源代码,以找出关键的输入和输出节点名称。 或者希望,当您阅读本书时,TensorFlow `summarize_graph`工具将得到改进,以为我们提供准确的输入和输出节点名称。 +因此,我们看到`wav_data`和`decoded_sample_data`都是可能的输入。 如果在`freeze.py`文件中看不到注释,我们就必须深入研究模型训练代码,以准确找出应该使用的输入名称:“结果图包含一个名为 WAV 的编码数据输入 `wav_data`,用于原始 PCM 数据(在 -1.0 到 1.0 范围内浮动)的一种称为`decoded_sample_data`,输出称为`labels_softmax`。” 实际上,在该模型的情况下,有一个 TensorFlow Android 示例应用,这是我们在第 1 章,“移动 TensorFlow 入门”中看到的一部分,称为 TF 语音,专门定义了那些输入名称和输出名称。 在本书后面的几章中,您将看到如何在需要时借助或不借助我们的三种方法来查找模型训练的源代码,以找出关键的输入和输出节点名称。 或者希望,当您阅读本书时,TensorFlow `summarize_graph`工具将得到改进,以为我们提供准确的输入和输出节点名称。 现在是时候在移动应用中使用我们的热门新模型了。 @@ -181,7 +181,7 @@ Out[5]: -位于`tensorflow/example/android`的用于简单语音命令识别的 TensorFlow Android 示例应用程序具有在`SpeechActivity.java`文件中进行音频记录和识别的代码,假定该应用程序需要始终准备好接受新的音频命令。 尽管在某些情况下这确实是合理的,但它导致的代码比仅在用户按下按钮后才进行记录和识别的代码要复杂得多,例如 Apple 的 Siri 的工作方式。 在本部分中,我们将向您展示如何创建新的 Android 应用并添加尽可能少的代码来记录用户的语音命令并显示识别结果。 这应该可以帮助您更轻松地将模型集成到自己的 Android 应用中。 但是,如果您需要处理语音命令应始终自动记录和识别的情况,则应查看 TensorFlow 示例 Android 应用。 +位于`tensorflow/example/android`的用于简单语音命令识别的 TensorFlow Android 示例应用具有在`SpeechActivity.java`文件中进行音频记录和识别的代码,假定该应用需要始终准备好接受新的音频命令。 尽管在某些情况下这确实是合理的,但它导致的代码比仅在用户按下按钮后才进行记录和识别的代码要复杂得多,例如 Apple 的 Siri 的工作方式。 在本部分中,我们将向您展示如何创建新的 Android 应用并添加尽可能少的代码来记录用户的语音命令并显示识别结果。 这应该可以帮助您更轻松地将模型集成到自己的 Android 应用中。 但是,如果您需要处理语音命令应始终自动记录和识别的情况,则应查看 TensorFlow 示例 Android 应用。 @@ -194,7 +194,7 @@ Out[5]: 执行以下步骤来构建一个完整的新 Android 应用,该应用使用我们在上一节中构建的`speech_commands_graph.pb`模型: 1. 通过接受前面几章中的所有默认设置,创建一个名为`AudioRecognition`的新 Android 应用,然后将`compile 'org.tensorflow:tensorflow-android:+'`行添加到应用`build.gradle`文件依赖项的末尾。 -2. 将``添加到应用程序的`AndroidManifest.xml`文件中,以便可以允许该应用程序记录音频。 +2. 将``添加到应用的`AndroidManifest.xml`文件中,以便可以允许该应用记录音频。 3. 创建一个新的资产文件夹,然后将在上一节的步骤 2 和 3 中生成的`speech_commands_graph.pb`和`conv_actions_labels.txt`文件拖放到`assets`文件夹中。 4. 更改`activity_main.xml`文件以容纳三个 UI 元素。 第一个是用于识别结果显示的`TextView`: @@ -289,7 +289,7 @@ if (record.getState() != AudioRecord.STATE_INITIALIZED) return; record.startRecording(); ``` -Android 中有两个用于记录音频的类:`MediaRecorder`和`AudioRecord`。 `MediaRecorder`比`AudioRecord`更易于使用,但是它会保存压缩的音频文件,直到 Android API Level 24(Android 7.0)为止,该 API 支持录制未经处理的原始音频。 根据[这里](https://developer.android.com/about/dashboards/index.html),截至 2018 年 1 月,市场上有 70% 以上的 Android 设备仍在运行 7.0 或更早的 Android 版本。 您可能不希望将应用程序定位到 Android 7.0 或更高版本。 另外,要解码由`MediaRecorder`录制的压缩音频,您必须使用`MediaCodec`,使用起来非常复杂。 `AudioRecord`尽管是一个低级的 API,但实际上非常适合记录未处理的原始数据,然后将其发送到语音命令识别模型进行处理。 +Android 中有两个用于记录音频的类:`MediaRecorder`和`AudioRecord`。 `MediaRecorder`比`AudioRecord`更易于使用,但是它会保存压缩的音频文件,直到 Android API Level 24(Android 7.0)为止,该 API 支持录制未经处理的原始音频。 根据[这里](https://developer.android.com/about/dashboards/index.html),截至 2018 年 1 月,市场上有 70% 以上的 Android 设备仍在运行 7.0 或更早的 Android 版本。 您可能不希望将应用定位到 Android 7.0 或更高版本。 另外,要解码由`MediaRecorder`录制的压缩音频,您必须使用`MediaCodec`,使用起来非常复杂。 `AudioRecord`尽管是一个低级的 API,但实际上非常适合记录未处理的原始数据,然后将其发送到语音命令识别模型进行处理。 9. 创建两个由 16 位短整数组成的数组`audioBuffer`和`recordingBuffer`,对于 1 秒记录,每次`AudioRecord`对象读取并填充`audioBuffer`数组后,实际读取的数据都会附加到 `recordingBuffer`: @@ -406,17 +406,17 @@ runOnUiThread(new Runnable() { 诚然,此处的应用屏幕截图并不像上一章中那样生动有趣(一张图片价值一千个单词),但是语音识别当然可以做艺术家不能做的事情,例如发出语音命令来控制机器人的运动。 -该应用程序的完整源代码位于 Github 上该书的源代码存储库的`Ch5/android`文件夹中。 现在让我们看看如何使用该模型构建 iOS 应用程序,其中涉及一些复杂的 TensorFlow iOS 库构建和音频数据准备步骤,以使模型正确运行。 +该应用的完整源代码位于 Github 上该书的源代码存储库的`Ch5/android`文件夹中。 现在让我们看看如何使用该模型构建 iOS 应用,其中涉及一些复杂的 TensorFlow iOS 库构建和音频数据准备步骤,以使模型正确运行。 -# 在带有 Objective-C 的 iOS 中使用简单的语音识别模型 +# 通过 Objective-C 在 iOS 中使用简单的语音识别模型 -如果您已经阅读了前三章中的 iOS 应用程序,那么您可能更喜欢使用手动构建的 TensorFlow iOS 库而不是 TensorFlow 实验窗格,就像使用手动库方法一样,您可以更好地控制可以添加哪些 TensorFlow 操作来使您的模型满意,这也是我们决定专注于 TensorFlow Mobile 而不是第 1 章,“移动 TensorFlow”的 TensorFlow Lite 的原因之一。 +如果您已经阅读了前三章中的 iOS 应用,那么您可能更喜欢使用手动构建的 TensorFlow iOS 库而不是 TensorFlow 实验窗格,就像使用手动库方法一样,您可以更好地控制可以添加哪些 TensorFlow 操作来使您的模型满意,这也是我们决定专注于 TensorFlow Mobile 而不是第 1 章,“移动 TensorFlow”的 TensorFlow Lite 的原因之一。 因此,尽管您可以在阅读本书时尝试使用 TensorFlow Pod,以查看Pod是否已更新以支持模型中使用的所有操作,但从现在开始,我们将始终使用手动构建的 TensorFlow 库( 请参见 iOS 应用中第 3 章,“检测对象及其位置”的“在 iOS 中使用对象检测模型的”部分的步骤 1 和 2)。 @@ -603,9 +603,9 @@ for (int i = 1; i < count; i++) { return commands[idx]; ``` -在应用程序可以录制任何音频之前,您需要做的另一件事是在应用程序的`Info.plist`文件中创建一个新的*隐私-麦克风使用说明*属性,并将该属性的值设置为诸如“听到并识别” 您的语音命令”。 +在应用可以录制任何音频之前,您需要做的另一件事是在应用的`Info.plist`文件中创建一个新的*隐私-麦克风使用说明*属性,并将该属性的值设置为诸如“听到并识别” 您的语音命令”。 -现在,在 iOS 模拟器上运行该应用程序(如果您的 Xcode 版本早于 9.2,而 iOS 模拟器版本早于 10.0,则您可能必须在实际的 iOS 设备上运行该应用程序,因为您可能无法在 iOS 或 iPhone 模拟器(10.0 之前的版本)中录制音频,您将首先看到带有 Start 按钮位于中间的初始屏幕,然后点击该按钮并说出 10 个命令之一,识别结果应出现在顶部 ,如图 5.4 所示: +现在,在 iOS 模拟器上运行该应用(如果您的 Xcode 版本早于 9.2,而 iOS 模拟器版本早于 10.0,则您可能必须在实际的 iOS 设备上运行该应用,因为您可能无法在 iOS 或 iPhone 模拟器(10.0 之前的版本)中录制音频,您将首先看到带有 Start 按钮位于中间的初始屏幕,然后点击该按钮并说出 10 个命令之一,识别结果应出现在顶部 ,如图 5.4 所示: ![](img/71ef1770-f7c0-4152-bb72-ea7993f5b728.png) @@ -621,7 +621,7 @@ Could not create TensorFlow Graph: Not found: Op type not registered 'DecodeWav' -# 使用 tf_op_files.txt 修复模型加载错误 +# 使用`tf_op_files.txt`修复模型加载错误 @@ -649,10 +649,10 @@ tensorflow/core/kernels/decode_wav_op.cc:REGISTER_KERNEL_BUILDER(Name("DecodeWav -我们在第 2 章中使用 TensorFlow 窗格创建了一个基于 Swift 的 iOS 应用。 现在让我们创建一个新的 Swift 应用程序,该应用程序使用我们在上一节中手动构建的 TensorFlow iOS 库,并在我们的 Swift 应用程序中使用语音命令模型: +我们在第 2 章中使用 TensorFlow 窗格创建了一个基于 Swift 的 iOS 应用。 现在让我们创建一个新的 Swift 应用,该应用使用我们在上一节中手动构建的 TensorFlow iOS 库,并在我们的 Swift 应用中使用语音命令模型: 1. 通过 Xcode 创建一个新的“Single View iOS”项目,并按照与上一节中的步骤 1 和 2 相同的方式设置该项目,除了将语言设置为 Swift。 -2. 选择 Xcode “文件 | 新增 | 文件 ...”,然后选择 Objective-C 文件。 输入名称`RunInference`。 您将看到一个消息框,询问您“您是否要配置一个 Objective-C 桥接头?” 单击创建桥接标题。 将文件`RunInference.m`重命名为`RunInfence.mm`,因为我们将混合使用 C,C++ 和 Objective-C 代码来进行后期录音音频处理和识别。 我们仍在 Swift 应用程序中使用 Objective-C,因为要从 Swift 调用 TensorFlow C++ 代码,我们需要一个 Objective-C 类作为 C++ 代码的包装。 +2. 选择 Xcode “文件 | 新增 | 文件 ...”,然后选择 Objective-C 文件。 输入名称`RunInference`。 您将看到一个消息框,询问您“您是否要配置一个 Objective-C 桥接头?” 单击创建桥接标题。 将文件`RunInference.m`重命名为`RunInfence.mm`,因为我们将混合使用 C,C++ 和 Objective-C 代码来进行后期录音音频处理和识别。 我们仍在 Swift 应用中使用 Objective-C,因为要从 Swift 调用 TensorFlow C++ 代码,我们需要一个 Objective-C 类作为 C++ 代码的包装。 3. 创建一个名为`RunInference.h`的头文件,并添加以下代码: ```py @@ -661,7 +661,7 @@ tensorflow/core/kernels/decode_wav_op.cc:REGISTER_KERNEL_BUILDER(Name("DecodeWav @end ``` -现在,您在 Xcode 中的应用程序应类似于图 5.5: +现在,您在 Xcode 中的应用应类似于图 5.5: ![](img/3febd651-7749-4a23-ba86-ae458ef8cfea.png) @@ -773,7 +773,7 @@ func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully f 在`AudioRecognition_Swift-Bridging-Header.h`文件中,添加`#include "RunInference.h"`,以便前面的 Swift 代码`RunInference_Wrapper().run_inference_wrapper(_recorderFilePath)`起作用。 -7. 在`run_inference_wrapper`方法内的`RunInference.mm`中,从 Objective-C `AudioRecognition`应用程序中的`ViewController.mm`复制代码,如上一节的步骤 5-8 所述,该代码将保存的录制音频转换为格式 TensorFlow 模型接受模型,然后将其与采样率一起发送给模型以获取识别结果: +7. 在`run_inference_wrapper`方法内的`RunInference.mm`中,从 Objective-C `AudioRecognition`应用中的`ViewController.mm`复制代码,如上一节的步骤 5-8 所述,该代码将保存的录制音频转换为格式 TensorFlow 模型接受模型,然后将其与采样率一起发送给模型以获取识别结果: ```py @implementation RunInference_Wrapper @@ -796,6 +796,6 @@ func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully f 在本章中,我们首先快速概述了语音识别以及如何使用端到端深度学习方法构建现代 ASR 系统。 然后,我们介绍了如何训练 TensorFlow 模型以识别简单的语音命令,并介绍了如何在 Android 应用以及基于 Objective-C 和 Swift 的 iOS 应用中使用该模型的分步教程。 我们还讨论了如何通过找出丢失的 TensorFlow 操作或内核文件,添加它并重建 TensorFlow iOS 库来修复 iOS 中常见的模型加载错误。 -ASR 用于将语音转换为文本。 在下一章中,我们将探讨另一个将文本作为输出的模型,并且文本中将包含完整的自然语言句子,而不是本章中的简单命令。 我们将介绍如何构建模型以将图像,我们的老朋友转换为文本,以及如何在移动应用程序中使用该模型。 观察和描述您在自然语言中看到的内容需要真正的人类智慧。 福尔摩斯是完成这项任务的最佳人选之一。 我们当然还不如福尔摩斯,但是让我们看看如何开始。 +ASR 用于将语音转换为文本。 在下一章中,我们将探讨另一个将文本作为输出的模型,并且文本中将包含完整的自然语言句子,而不是本章中的简单命令。 我们将介绍如何构建模型以将图像,我们的老朋友转换为文本,以及如何在移动应用中使用该模型。 观察和描述您在自然语言中看到的内容需要真正的人类智慧。 福尔摩斯是完成这项任务的最佳人选之一。 我们当然还不如福尔摩斯,但是让我们看看如何开始。 diff --git a/new/intel-mobi-proj-tf/06.md b/new/intel-mobi-proj-tf/06.md index e064056670537ba39858859ed0379e7bf11e8339..7fa3996e8a78ccad6023579db20470ef7445417f 100644 --- a/new/intel-mobi-proj-tf/06.md +++ b/new/intel-mobi-proj-tf/06.md @@ -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 的单词。 还保存特殊词,例如句子的开头和结尾(分别表示为``和 `` )。 稍后,您将看到我们如何在 iOS 和 Android 应用程序中专门使用和解析文件来生成字幕。 +在`$MSCOCO_DIR`文件夹中还生成了一个名为`word_counts.txt` 的文件。 它总共有 11,518 个单词,每行包含一个单词,一个空格以及该单词出现在数据集中的次数。 文件中仅保存计数等于或大于 4 的单词。 还保存特殊词,例如句子的开头和结尾(分别表示为``和 `` )。 稍后,您将看到我们如何在 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; iinputs()[0]`而不是特定的输入节点名称。 -6. 在以与在`HelloTensorFlow`应用程序中相同的方式加载`labels.txt`文件后,也以相同的方式加载要分类的图像,但是使用 TensorFlow Lite 的`Interpreter`的`typed_tensor`方法而不是 TensorFlow Mobile 的`Tensor`类及其`tensor`方法。 图 11.2 比较了用于加载和处理图像文件数据的 TensorFlow Mobile 和 Lite 代码: +6. 在以与在`HelloTensorFlow`应用中相同的方式加载`labels.txt`文件后,也以相同的方式加载要分类的图像,但是使用 TensorFlow Lite 的`Interpreter`的`typed_tensor`方法而不是 TensorFlow Mobile 的`Tensor`类及其`tensor`方法。 图 11.2 比较了用于加载和处理图像文件数据的 TensorFlow Mobile 和 Lite 代码: ![](img/8df9836e-fbf9-4caf-97af-7d415b6dc5bb.png) @@ -202,7 +202,7 @@ NSString* RunInferenceOnImage() { 图 11.5:测试图像和模型推断结果 -这就是您可以在新的 iOS 应用程序中使用预构建的 MobileNet TensorFlow Lite 模型的方式。 现在让我们看看如何使用经过重新训练的 TensorFlow 模型。 +这就是您可以在新的 iOS 应用中使用预构建的 MobileNet TensorFlow Lite 模型的方式。 现在让我们看看如何使用经过重新训练的 TensorFlow 模型。 @@ -302,12 +302,12 @@ bazel-bin/tensorflow/contrib/lite/toco/toco \ -为简单起见,我们将仅演示如何在新的 Android 应用程序中将 TensorFlow Lite 与预构建的 TensorFlow Lite MobileNet 模型一起添加,并在此过程中发现一些有用的技巧。 有一个使用 TensorFlow Lite 的示例 Android 应用程序,[您可能希望首先在具有 API 级别的 Android 设备上与 Android Studio 一起运行](https://www.tensorflow.org/mobile/tflite/demo_android)。在执行以下步骤在新的 Android 应用中使用 TensorFlow Lite 之前,至少需要 15 个(版本至少为 4.0.3)。 如果您成功构建并运行了演示应用程序,则在 Android 设备上移动时,应该能够通过设备摄像头和 TensorFlow Lite MobileNet 模型看到识别出的对象。 +为简单起见,我们将仅演示如何在新的 Android 应用中将 TensorFlow Lite 与预构建的 TensorFlow Lite MobileNet 模型一起添加,并在此过程中发现一些有用的技巧。 有一个使用 TensorFlow Lite 的示例 Android 应用,[您可能希望首先在具有 API 级别的 Android 设备上与 Android Studio 一起运行](https://www.tensorflow.org/mobile/tflite/demo_android)。在执行以下步骤在新的 Android 应用中使用 TensorFlow Lite 之前,至少需要 15 个(版本至少为 4.0.3)。 如果您成功构建并运行了演示应用,则在 Android 设备上移动时,应该能够通过设备摄像头和 TensorFlow Lite MobileNet 模型看到识别出的对象。 -现在执行以下步骤来创建一个新的 Android 应用程序,并添加 TensorFlow Lite 支持以对图像进行分类,就像我们在第 2 章,“通过迁移学习对图像进行分类”中的 HelloTensorFlow Android 应用程序一样: +现在执行以下步骤来创建一个新的 Android 应用,并添加 TensorFlow Lite 支持以对图像进行分类,就像我们在第 2 章,“通过迁移学习对图像进行分类”中的 HelloTensorFlow Android 应用一样: 1. 创建一个新的 Android Studio 项目,并将应用命名为`HelloTFLite`。 将最低 SDK 设置为 API 15:Android 4.0.3,并接受所有其他默认设置。 -2. 创建一个新的`assets`文件夹,从演示应用程序`tensorflow/contrib/lite/java/demo/app/src/main/assets`文件夹中拖放`mobilenet_quant_v1_224.tflite` TensorFlow Lite 文件和`labels.txt`文件,以及测试图像到 HelloTFLite 应用程序的`assets`文件夹中。 +2. 创建一个新的`assets`文件夹,从演示应用`tensorflow/contrib/lite/java/demo/app/src/main/assets`文件夹中拖放`mobilenet_quant_v1_224.tflite` TensorFlow Lite 文件和`labels.txt`文件,以及测试图像到 HelloTFLite 应用的`assets`文件夹中。 3. 将`ImageClassifier.java`文件从`tensorflow/contrib/lite/java/demo/app/src/main/java/com/example/android/tflitecamerademo`文件夹拖放到 Android Studio 中的 HelloTFLite 应用。 `ImageClassifier.java`包含使用 TensorFlow Lite Java API 加载和运行 TensorFlow Lite 模型的所有代码,我们将在稍后详细介绍。 4. 打开应用的`build.gradle`文件,在 `dependencies` 部分的末尾添加`compile 'org.tensorflow:tensorflow-lite:0.1'` ,然后在 `buildTypes` 部分的以下三行中添加[ `android` : @@ -318,7 +318,7 @@ bazel-bin/tensorflow/contrib/lite/toco/toco \ } ``` -这是必需的,以避免在运行应用程序时出现以下错误: +这是必需的,以避免在运行应用时出现以下错误: ```py 10185-10185/com.ailabby.hellotflite W/System.err: java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed @@ -327,7 +327,7 @@ bazel-bin/tensorflow/contrib/lite/toco/toco \ 03-20 00:32:28.806 10185-10185/com.ailabby.hellotflite W/System.err: at com.ailabby.hellotflite.ImageClassifier.loadModelFile(ImageClassifier.java:173) ``` -现在,Android Studio 中的 HelloTFLite 应用程序应类似于图 11.6: +现在,Android Studio 中的 HelloTFLite 应用应类似于图 11.6: ![](img/9df4ffa8-cd63-4b4c-a728-47cba1394711.png) @@ -369,7 +369,7 @@ runOnUiThread( }); ``` -如果立即运行该应用程序,您将看到测试图像和一个标题为“TF Lite 分类”的按钮。 轻按它,您将看到分类结果,例如“拉布拉多犬:0.86 哈巴狗:0.05 达尔马提亚狗:0.04”。 +如果立即运行该应用,您将看到测试图像和一个标题为“TF Lite 分类”的按钮。 轻按它,您将看到分类结果,例如“拉布拉多犬:0.86 哈巴狗:0.05 达尔马提亚狗:0.04”。 `ImageClassifier`中与 TensorFlow Lite 相关的代码使用核心`org.tensorflow.lite.Interpreter`类及其`run`方法来运行模型,如下所示: @@ -413,7 +413,7 @@ private MappedByteBuffer loadModelFile(Activity activity) throws IOException { 回想一下,在步骤 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 重量级主题。 +这就是在新的 Android 应用中加载并运行预构建的 TensorFlow Lite 模型所需的一切。 如果您有兴趣使用经过重新训练和转换的 TensorFlow Lite 模型(如我们在 iOS 应用,Android 应用中所做的那样),或者自定义 TensorFlow Lite 模型(如果您成功获得了转换后的模型),则可以在 HelloTFLite 应用。 我们将暂时保留最先进的 TensorFlow Lite,并继续为 iOS 开发人员介绍另一个非常酷的 WWDC 重量级主题。 @@ -423,15 +423,15 @@ private MappedByteBuffer loadModelFile(Activity activity) throws IOException { -苹果的 [Core ML 框架](https://developer.apple.com/documentation/coreml)使 iOS 开发人员可以轻松地在运行 iOS 11 或更高版本的 iOS 应用中使用经过训练的机器学习模型,并构建 Xcode 9 或更高版本。 您可以下载并使用 Apple 已在[这里](https://developer.apple.com/machine-learning)提供的 Core ML 格式的经过预先训练的模型,也可以使用称为 coremltools 的 Python 工具,[Core ML 社区工具](https://apple.github.io/coremltools)来将其他机器学习和深度学习模型转换为 Core ML 格式。 +苹果的 [Core ML 框架](https://developer.apple.com/documentation/coreml)使 iOS 开发人员可以轻松地在运行 iOS 11 或更高版本的 iOS 应用中使用经过训练的机器学习模型,并构建 Xcode 9 或更高版本。 您可以下载并使用 Apple 已在[这里](https://developer.apple.com/machine-learning)提供的 Core ML 格式的经过预训练的模型,也可以使用称为 coremltools 的 Python 工具,[Core ML 社区工具](https://apple.github.io/coremltools)来将其他机器学习和深度学习模型转换为 Core ML 格式。 Core ML 格式的预训练模型包括流行的 MobileNet 和 Inception V3 模型,以及更新的 ResNet50 模型(我们在第 10 章中简要讨论了残差网络)。 可以转换为 Core ML 格式的模型包括使用 Caffe 或 Keras 构建的深度学习模型,以及传统的机器学习模型,例如线性回归,支持向量机和通过 [Scikit Learn](http://scikit-learn.org) 构建的决策树,这是一个非常流行的 Python 机器学习库。 -因此,如果您想在 iOS 中使用传统的机器学习模型,那么 Scikit Learn 和 Core ML 绝对是必经之路。 尽管这是一本有关移动 TensorFlow 的书,但构建智能应用程序有时不需要深度学习。 在某些用例中,经典机器学习完全有意义。 此外,Core ML 对 Scikit Learn 模型的支持是如此流畅,以至于我们不能拒绝快速浏览,因此您将在必要时知道何时短暂使用移动 TensorFlow 技能。 +因此,如果您想在 iOS 中使用传统的机器学习模型,那么 Scikit Learn 和 Core ML 绝对是必经之路。 尽管这是一本有关移动 TensorFlow 的书,但构建智能应用有时不需要深度学习。 在某些用例中,经典机器学习完全有意义。 此外,Core ML 对 Scikit Learn 模型的支持是如此流畅,以至于我们不能拒绝快速浏览,因此您将在必要时知道何时短暂使用移动 TensorFlow 技能。 -如果要使用 Apple 预先训练的 MobileNet Core ML 模型,请在[这个页面](https://developer.apple.com/documentation/vision/classifying_images_with_vision_and_core_ml)上查看 Apple 不错的示例代码项目,它使用 Vision 和 Core ML 对图像进行分类,还观看[这个页面](https://developer.apple.com/machine-learning)上列出的有关核心 ML 的 WWDC 2017 视频。 +如果要使用 Apple 预训练的 MobileNet Core ML 模型,请在[这个页面](https://developer.apple.com/documentation/vision/classifying_images_with_vision_and_core_ml)上查看 Apple 不错的示例代码项目,它使用 Vision 和 Core ML 对图像进行分类,还观看[这个页面](https://developer.apple.com/machine-learning)上列出的有关核心 ML 的 WWDC 2017 视频。 -在接下来的两个部分中,我们将向您展示两个教程,该教程以 TensorFlow 为后端,在 Keras 中如何转换和使用 Scikit Learn 模型和股票预测 RNN 模型,它们是在第 8 章, “使用 RNN 预测股票价格”。 您将在 Objective-C 和 Swift 中看到使用源代码从头开始构建的完整 iOS 应用程序,以使用转换后的 Core ML 模型。 如果短语“从头开始”使您兴奋并使您想起 AlphaZero,则您可能喜欢上一章第 10 章,“构建类似 AlphaZero 的移动游戏应用程序”。 +在接下来的两个部分中,我们将向您展示两个教程,该教程以 TensorFlow 为后端,在 Keras 中如何转换和使用 Scikit Learn 模型和股票预测 RNN 模型,它们是在第 8 章, “使用 RNN 预测股票价格”。 您将在 Objective-C 和 Swift 中看到使用源代码从头开始构建的完整 iOS 应用,以使用转换后的 Core ML 模型。 如果短语“从头开始”使您兴奋并使您想起 AlphaZero,则您可能喜欢上一章第 10 章,“构建类似 AlphaZero 的移动游戏应用”。 @@ -512,7 +512,7 @@ print(svm.predict(X_new)) 这将使用支持向量机模型作为`[298014.41462535 320991.94354092 404822.78465954]`输出预测的房价。 我们不会讨论哪种模型更好,如何使线性回归或支持向量机模型更好地工作,或者如何在 Scikit Learn 支持的所有算法中选择更好的模型-有很多不错的书籍和在线资源介绍了这些内容。 话题。 -要将两个 Scikit Learn 模型`lr`和`svm`转换为可在您的 iOS 应用中使用的 Core ML 格式,您需要首先安装 [Core ML 工具](https://github.com/apple/coremltools)。 我们建议您在我们在第 8 章,“用 RNN 预测股价”和第 10 章“构建支持 AlphaZero 的手机游戏应用程序”中创建的 TensorFlow 和 Keras 虚拟环境中使用`pip install -U coremltools`安装这些软件,因为我们还将在下一部分中使用它来转换 Keras 模型。 +要将两个 Scikit Learn 模型`lr`和`svm`转换为可在您的 iOS 应用中使用的 Core ML 格式,您需要首先安装 [Core ML 工具](https://github.com/apple/coremltools)。 我们建议您在我们在第 8 章,“用 RNN 预测股价”和第 10 章“构建支持 AlphaZero 的手机游戏应用”中创建的 TensorFlow 和 Keras 虚拟环境中使用`pip install -U coremltools`安装这些软件,因为我们还将在下一部分中使用它来转换 Keras 模型。 现在,只需运行以下代码即可将两个 Scikit Learn 模型转换为 Core ML 格式: @@ -525,7 +525,7 @@ coreml_model = coremltools.converters.sklearn.convert(svm, ["Bedrooms", "Bathroo coreml_model.save("HouseSVM.mlmodel") ``` -有关转换器工具的更多详细信息,请参见其[在线文档](https://apple.github.io/coremltools/coremltools.converters.html)。 现在,我们可以将这两个模型添加到 Objective-C 或 Swift iOS 应用程序中,但是我们仅在此处显示 Swift 示例。 您将在下一节中看到使用从 Keras 和 TensorFlow 模型转换而来的股票预测 Core ML 模型得到的 Objective-C 和 Swift 示例。 +有关转换器工具的更多详细信息,请参见其[在线文档](https://apple.github.io/coremltools/coremltools.converters.html)。 现在,我们可以将这两个模型添加到 Objective-C 或 Swift iOS 应用中,但是我们仅在此处显示 Swift 示例。 您将在下一节中看到使用从 Keras 和 TensorFlow 模型转换而来的股票预测 Core ML 模型得到的 Objective-C 和 Swift 示例。 @@ -567,7 +567,7 @@ override func viewDidLoad() { } ``` -这应该非常简单。 运行该应用程序将打印: +这应该非常简单。 运行该应用将打印: ```py 319289.955227601 298014.414625352 @@ -608,7 +608,7 @@ coreml_model.save("Stock.mlmodel") 图 11.8:在 Objective-C 应用中显示从 Keras 和 TensorFlow 转换而来的股票预测 Core ML 模型 -使用 coremltools 生成模型的 Core ML 格式的另一种方法是,首先将 Keras 构建的模型保存为 Keras HDF5 模型格式,这是我们在第 10 章,“构建类似 AlphaZero 的移动游戏应用程序”中,在转换为 AlphaZero TensorFlow 检查点文件之前使用的格式。 为此,只需运行`model.save('stock.h5')`。 +使用 coremltools 生成模型的 Core ML 格式的另一种方法是,首先将 Keras 构建的模型保存为 Keras HDF5 模型格式,这是我们在第 10 章,“构建类似 AlphaZero 的移动游戏应用”中,在转换为 AlphaZero TensorFlow 检查点文件之前使用的格式。 为此,只需运行`model.save('stock.h5')`。 然后,您可以使用以下代码片段将 Keras `.h5`模型转换为 Core ML 模型: @@ -676,7 +676,7 @@ coreml_model.save('Stock.mlmodel') } ``` -我们在这里使用了硬编码的规范化输入和 NSLog 只是为了演示如何使用 Core ML 模型。 如果立即运行该应用程序,您将看到 0.4486984312534332 的输出值,该值在非规范化后显示了预测的第二天股价。 +我们在这里使用了硬编码的规范化输入和 NSLog 只是为了演示如何使用 Core ML 模型。 如果立即运行该应用,您将看到 0.4486984312534332 的输出值,该值在非规范化后显示了预测的第二天股价。 前面代码的 Swift 版本如下: @@ -712,9 +712,9 @@ class ViewController: UIViewController { } ``` -请注意,就像使用 TensorFlow Mobile iOS 应用程序一样,我们使用`bidirectional_1_input`和`activation_1_Identity`来设置输入并获取输出。 +请注意,就像使用 TensorFlow Mobile iOS 应用一样,我们使用`bidirectional_1_input`和`activation_1_Identity`来设置输入并获取输出。 -如果尝试转换在第 10 章,“构建类似 AlphaZero 的移动游戏应用程序”中在 Keras 中构建和训练的 AlphaZero 模型,则会收到错误消息`ValueError: Unknown loss function:softmax_cross_entropy_with_logits`。 如果您尝试转换我们在本书中构建的其他 TensorFlow 模型,则可以使用的最佳非官方工具是`https://github.com/tf-coreml/tf-coreml`上的 TensorFlow 到核心 ML 转换器。 不幸的是,类似于 TensorFlow Lite,它仅支持有限的 TensorFlow 操作集,其中一些原因是 Core ML 的限制,另一些原因是 tf-coreml 转换器的限制。 我们不会详细介绍将 TensorFlow 模型转换为 Core ML 模型的细节。 但是至少您已经了解了如何转换和使用 Scikit Learn 构建的传统机器学习模型以及基于 Keras 的 RNN 模型,该模型有望为您提供构建和使用 Core ML 模型的良好基础。 当然,如果您喜欢 Core ML,则应留意其将来的改进版本,以及 coremltools 和 tf-coreml 转换器的将来版本。 关于 Core ML,我们还没有涉及很多内容-要了解其确切功能,请参阅[完整的 API 文档](https://developer.apple.com/documentation/coreml/core_ml_api)。 +如果尝试转换在第 10 章,“构建类似 AlphaZero 的移动游戏应用”中在 Keras 中构建和训练的 AlphaZero 模型,则会收到错误消息`ValueError: Unknown loss function:softmax_cross_entropy_with_logits`。 如果您尝试转换我们在本书中构建的其他 TensorFlow 模型,则可以使用的最佳非官方工具是`https://github.com/tf-coreml/tf-coreml`上的 TensorFlow 到核心 ML 转换器。 不幸的是,类似于 TensorFlow Lite,它仅支持有限的 TensorFlow 操作集,其中一些原因是 Core ML 的限制,另一些原因是 tf-coreml 转换器的限制。 我们不会详细介绍将 TensorFlow 模型转换为 Core ML 模型的细节。 但是至少您已经了解了如何转换和使用 Scikit Learn 构建的传统机器学习模型以及基于 Keras 的 RNN 模型,该模型有望为您提供构建和使用 Core ML 模型的良好基础。 当然,如果您喜欢 Core ML,则应留意其将来的改进版本,以及 coremltools 和 tf-coreml 转换器的将来版本。 关于 Core ML,我们还没有涉及很多内容-要了解其确切功能,请参阅[完整的 API 文档](https://developer.apple.com/documentation/coreml/core_ml_api)。 @@ -724,7 +724,7 @@ class ViewController: UIViewController { -在本章中,我们介绍了在移动和嵌入式设备上使用机器学习和深度学习模型的两个前沿工具:TensorFlow Lite 和 Core ML。 尽管 TensorFlow Lite 仍在开发人员预览版中,但对 TensorFlow 操作的支持有限,但其未来版本将支持越来越多的 TensorFlow 功能,同时保持较低的延迟和较小的应用程序大小。 我们提供了有关如何开发 TensorFlow Lite iOS 和 Android 应用程序以从头开始对图像进行分类的分步教程。 Core ML 是 Apple 为移动开发人员提供的将机器学习集成到 iOS 应用程序中的框架,它对转换和使用 Scikit Learn 构建的经典机器学习模型提供了强大的支持,并为基于 Keras 的模型提供了良好的支持。 我们还展示了如何将 Scikit Learn 和 Keras 模型转换为 Core ML 模型,以及如何在 Objective-C 和 Swift 应用程序中使用它们。 TensorFlow Lite 和 Core ML 现在都有一些严重的限制,导致它们无法转换我们在书中构建的复杂的 TensorFlow 和 Keras 模型。 但是他们今天已经有了用例,他们的未来会变得更好。 我们能做的最好的事情就是了解它们的用途,局限性和潜力,因此我们可以为现在或将来选择最合适的工具来完成不同的任务。 毕竟,我们不仅拥有锤子,而且并非所有东西都看起来像钉子。 +在本章中,我们介绍了在移动和嵌入式设备上使用机器学习和深度学习模型的两个前沿工具:TensorFlow Lite 和 Core ML。 尽管 TensorFlow Lite 仍在开发人员预览版中,但对 TensorFlow 操作的支持有限,但其未来版本将支持越来越多的 TensorFlow 功能,同时保持较低的延迟和较小的应用大小。 我们提供了有关如何开发 TensorFlow Lite iOS 和 Android 应用以从头开始对图像进行分类的分步教程。 Core ML 是 Apple 为移动开发人员提供的将机器学习集成到 iOS 应用中的框架,它对转换和使用 Scikit Learn 构建的经典机器学习模型提供了强大的支持,并为基于 Keras 的模型提供了良好的支持。 我们还展示了如何将 Scikit Learn 和 Keras 模型转换为 Core ML 模型,以及如何在 Objective-C 和 Swift 应用中使用它们。 TensorFlow Lite 和 Core ML 现在都有一些严重的限制,导致它们无法转换我们在书中构建的复杂的 TensorFlow 和 Keras 模型。 但是他们今天已经有了用例,他们的未来会变得更好。 我们能做的最好的事情就是了解它们的用途,局限性和潜力,因此我们可以为现在或将来选择最合适的工具来完成不同的任务。 毕竟,我们不仅拥有锤子,而且并非所有东西都看起来像钉子。 在本书的下一章,最后一章中,我们将选择一些以前构建的模型,并添加强化学习的力量-强化学习的成功背后的关键技术,以及 2017 年 10 项突破性技术之一。 麻省理工学院评论–很酷的 Raspberry Pi 平台,一个小巧,价格合理但功能强大的计算机–谁不喜欢这三个的组合? 我们将看到有多少智能-,聆听,步行,平衡,当然还有学习,我们可以在一章中添加到小型 Raspberry-Pi 驱动的机器人中。 如果自动驾驶汽车是当今最热门的 AI 技术之一,那么自动行走机器人可能是我们家里最酷的玩具之一。 diff --git a/new/intel-mobi-proj-tf/12.md b/new/intel-mobi-proj-tf/12.md index 16bea7091dbf45a133441bcbf7d9d1251a0addb5..92218d93156b8793e4da38c920cbdecc99e9e9e2 100644 --- a/new/intel-mobi-proj-tf/12.md +++ b/new/intel-mobi-proj-tf/12.md @@ -1,12 +1,12 @@ -# 在 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 构建自己的出色模型,实现最令您兴奋的算法和网络,则需要在本书结束后继续学习,因为我们没有详细介绍如何做到这一点, 但希望我们能激发您足够的动力来开始这一旅程,并从书中获得保证,一旦您构建并训练了模型,便知道如何快速,随时随地在移动设备上部署和运行它们。