提交 943002c8 编写于 作者: W wizardforcel

2020-12-06 15:56:44

上级 dd174970
......@@ -545,7 +545,7 @@ AI Hub 是 Google Cloud Platform 中可用的服务之一。 AI Hub 是即插即
除了 AI Hub 的(可以与 Amazon SageMaker 和 Azure 机器学习 Studio 相比)之外,Google Cloud 在完全托管服务方面还提供了与 AWS 和 Azure 类似的产品,这些服务简化了机器学习在文本中的应用, 语言,图像和视频。 Google 在 *Google Cloud AI 构件*框架下组织了许多此类托管服务。 对于许多此类托管服务,有两种与之交互的方式– AutoML 和 API。 AutoML 用于自定义模型,API 用于预训练模型。 AutoML 和 API 可以单独使用,也可以一起使用。
**Google Cloud AutoML 自定义模型** – AutoML 服务使用 Google 的最新移学习和神经体系结构搜索技术,允许用户为各种用例创建特定于领域的自定义模型。
**Google Cloud AutoML 自定义模型** – AutoML 服务使用 Google 的最新移学习和神经体系结构搜索技术,允许用户为各种用例创建特定于领域的自定义模型。
**Google Cloud 预训练的 API** –在处理常见用例时,使用预先训练的 API 的 Google 服务用户可以立即变得富有成效,而无需事先训练模型。 预训练的 API 不断透明地升级,以提高这些模型的速度和准确性。
......
......@@ -19,7 +19,7 @@
# 循环神经网络的基础
RNN 是另一种流行的模型,目前正在获得很大的关注。 正如我们在第 1 章,*人工智能导论*中讨论的那样,对一般神经网络(尤其是 RNN)的研究是*联系主义者*部落( 在 Pedro Domingos 的 AI 分类中进行了介绍)。 RNN 通常用于解决自然语言处理(**NLP**)和**自然语言理解****NLU**)问题 。
RNN 是另一种流行的模型,目前正在获得很大的关注。 正如我们在第 1 章,“人工智能导论”中讨论的那样,对一般神经网络(尤其是 RNN)的研究是*联系主义者*部落( 在 Pedro Domingos 的 AI 分类中进行了介绍)。 RNN 通常用于解决自然语言处理(**NLP**)和**自然语言理解****NLU**)问题 。
RNN 背后的数学有时可能会令人不知所措。 在深入研究 RNN 之前,请牢记以下思想:赛车手不需要完全了解其赛车的机械原理即可使其快速行驶并赢得比赛。 同样,我们不一定需要完全了解 RNN 在幕后的工作方式,以使其对我们有用,有时甚至是令人印象深刻的工作。 Keras 库的创建者 Francois Chollet 描述了**长短期记忆****LSTM**)网络,这是 RNN 的一种形式,如下所示:
......
......@@ -41,11 +41,11 @@ RL 是指学习操作方法并将情况映射到某些动作以最大化回报
**游戏性** –让我们考虑一下棋类游戏,例如 Go 或 Chess。 为了确定最佳动作,玩家需要考虑各种因素。 可能性的数量如此之大,以至于无法进行暴力搜索。 如果我们要使用传统技术制造一台可以玩这种游戏的机器,则需要指定许多规则来涵盖所有这些可能性。 RL 完全绕过了这个问题。 我们不需要手动指定任何逻辑规则。 学习代理仅通过示例学习并与自己玩游戏。
有关此主题的更详尽讨论,请参阅第 2 章,*人工智能基本用例*中的*游戏*部分。
有关此主题的更详尽讨论,请参阅第 2 章,“人工智能基本用例”中的“游戏”部分。
**机器人技术** –让我们考虑一个机器人的工作,该机器人的工作是探索新建筑物。 它应确保它有足够的功率返回基站。 该机器人必须通过考虑所收集的信息量与安全返回基站的能力之间的权衡来决定是否应该做出决定。
有关此主题的更多信息,请跳至第 2 章,*人工智能基本用例*中的*装运和仓库管理*部分。
有关此主题的更多信息,请跳至第 2 章,“人工智能基本用例”中的“装运和仓库管理”部分。
**工业控制器** –考虑调度电梯的情况。 一个好的调度程序将花费最少的电量,并为最多的人员服务。 对于此类问题,RL 代理可以学习如何在模拟环境中执行此操作。 然后,他们可以利用这些知识来制定最佳计划。
......
......@@ -30,23 +30,23 @@
第 1 章,*生成对抗网络* 的介绍始于 GAN 的概念。 读者将学习什么是判别器,什么是生成器以及什么是博弈论。 接下来的几个主题将涵盖生成器的结构,鉴别器的结构,生成器和鉴别器的目标函数,GAN 的训练算法,Kullback-Leibler 和 Jensen-Shannon 发散,GAN 的评估矩阵,GAN 的不同问题, GAN 中梯度消失和爆炸,纳什均衡,批量归一化和正则化的问题。
第 1 章,“生成对抗网络”的介绍始于 GAN 的概念。 读者将学习什么是判别器,什么是生成器以及什么是博弈论。 接下来的几个主题将涵盖生成器的结构,鉴别器的结构,生成器和鉴别器的目标函数,GAN 的训练算法,Kullback-Leibler 和 Jensen-Shannon 发散,GAN 的评估矩阵,GAN 的不同问题, GAN 中梯度消失和爆炸,纳什均衡,批量归一化和正则化的问题。
第 2 章, *3D-GAN –使用 GAN 生成形状* 首先简要介绍 3D-GAN 和各种架构细节。 在本章中,我们将训练 3D-GAN 生成真实世界的 3D 形状。 我们编写代码来收集 3D Shapenet 数据集,对其进行清理并使其经过培训。 然后,我们将使用 Keras 深度学习库为 3D-GAN 编写代码。
第 3 章,*使用条件 GAN 进行人脸老化* ,向读者介绍了条件生成对抗网络(cGAN)和 Age-cGAN。 我们将学习数据准备中的不同步骤,例如下载,清理和格式化数据。 我们将使用 IMDb Wiki 图像数据集。 我们将使用 Keras 框架为 Age-cGAN 编写代码。 接下来,我们将在 IMDb Wiki 图像数据集上训练网络。 最后,我们将使用年龄作为条件参数的训练模型来生成图像,而训练后的模型将针对不同年龄的人的脸部生成图像。
第 3 章,“使用条件 GAN 进行人脸老化”,向读者介绍了条件生成对抗网络(cGAN)和 Age-cGAN。 我们将学习数据准备中的不同步骤,例如下载,清理和格式化数据。 我们将使用 IMDb Wiki 图像数据集。 我们将使用 Keras 框架为 Age-cGAN 编写代码。 接下来,我们将在 IMDb Wiki 图像数据集上训练网络。 最后,我们将使用年龄作为条件参数的训练模型来生成图像,而训练后的模型将针对不同年龄的人的脸部生成图像。
第 4 章,*使用 DCGAN 生成动漫角色* 从 DCGAN 的介绍开始。 我们将学习数据准备中的不同步骤,例如收集动漫角色数据集,清理数据集并准备进行训练。 我们将在 Jupyter Notebook 中介绍 DCGAN 的 Keras 实现。 接下来,我们将学习训练 DCGAN 的不同方法,并为其选择不同的超参数。 最后,我们将使用训练有素的模型生成动漫角色。 另外,我们将讨论 DCGAN 的实际应用。
第 4 章,“使用 DCGAN 生成动漫角色”从 DCGAN 的介绍开始。 我们将学习数据准备中的不同步骤,例如收集动漫角色数据集,清理数据集并准备进行训练。 我们将在 Jupyter Notebook 中介绍 DCGAN 的 Keras 实现。 接下来,我们将学习训练 DCGAN 的不同方法,并为其选择不同的超参数。 最后,我们将使用训练有素的模型生成动漫角色。 另外,我们将讨论 DCGAN 的实际应用。
第 5 章,*使用 SRGAN 生成逼真的图像* 解释了如何训练 SRGAN 生成逼真的图像。 训练过程的第一步是收集数据集,然后清理它并格式化以进行训练。 读者将学习从何处收集数据集,如何清理数据集以及如何将其转换为可用于培训的格式。
第 5 章,“使用 SRGAN 生成逼真的图像”解释了如何训练 SRGAN 生成逼真的图像。 训练过程的第一步是收集数据集,然后清理它并格式化以进行训练。 读者将学习从何处收集数据集,如何清理数据集以及如何将其转换为可用于培训的格式。
第 6 章, *StackGAN –文本到逼真的图像合成* ,本章将首先介绍 StackGAN。 数据收集和数据准备是重要的步骤,我们将学习收集数据集,清理数据集并格式化以进行培训的过程。 我们将在 Jupyter Notebook 内的 Keras 中为 StackGAN 编写代码。 接下来,我们将在 CUB 数据集上训练网络。 最后,在完成模型训练后,我们将从文本描述中生成逼真的图像。 我们将讨论 StackGAN 的不同行业应用以及如何在生产中部署它们。
第 6 章, “StackGAN – 逼真的文本到图像合成”,本章将首先介绍 StackGAN。 数据收集和数据准备是重要的步骤,我们将学习收集数据集,清理数据集并格式化以进行培训的过程。 我们将在 Jupyter Notebook 内的 Keras 中为 StackGAN 编写代码。 接下来,我们将在 CUB 数据集上训练网络。 最后,在完成模型训练后,我们将从文本描述中生成逼真的图像。 我们将讨论 StackGAN 的不同行业应用以及如何在生产中部署它们。
第 7 章, *CycleGAN –将绘画变成照片* ,介绍了如何训练 CycleGAN 以 将画作变成照片。 我们将首先介绍 CycleGAN,并研究它们的不同应用。 我们将介绍不同的数据收集,数据清理和数据格式化技术。 接下来,我们将编写 CycleGAN 的 Keras 实现,并在 Jupyter Notebook 中获得有关代码的详细说明。 我们将在准备好的数据集上训练 CycleGAN。 我们将测试我们训练有素的模型,以将绘画转换为照片。 最后,我们看一下 CycleGAN 的实际应用。
第 7 章, “CycleGAN – 将绘画变成照片”,介绍了如何训练 CycleGAN 以 将画作变成照片。 我们将首先介绍 CycleGAN,并研究它们的不同应用。 我们将介绍不同的数据收集,数据清理和数据格式化技术。 接下来,我们将编写 CycleGAN 的 Keras 实现,并在 Jupyter Notebook 中获得有关代码的详细说明。 我们将在准备好的数据集上训练 CycleGAN。 我们将测试我们训练有素的模型,以将绘画转换为照片。 最后,我们看一下 CycleGAN 的实际应用。
第 8 章,*条件 GAN –使用条件对抗网络* 进行图像到图像的翻译,介绍了如何训练条件 GAN 进行图像到图像的翻译。 我们将首先介绍条件 GAN 和不同的数据准备技术,例如数据收集,数据清理和数据格式化。 接下来,我们将在 Jupyter Notebook 的 Keras 中编写条件 GAN 的代码。 接下来,我们学习如何在已经准备好的数据集上训练条件 GAN。 我们将探索不同的超参数进行训练。 最后,我们将测试条件 GAN,并讨论实际应用中图像到图像转换的不同用例。
第 8 章,“条件 GAN – 使用条件对抗网络进行图像到图像的翻译”,介绍了如何训练条件 GAN 进行图像到图像的翻译。 我们将首先介绍条件 GAN 和不同的数据准备技术,例如数据收集,数据清理和数据格式化。 接下来,我们将在 Jupyter Notebook 的 Keras 中编写条件 GAN 的代码。 接下来,我们学习如何在已经准备好的数据集上训练条件 GAN。 我们将探索不同的超参数进行训练。 最后,我们将测试条件 GAN,并讨论实际应用中图像到图像转换的不同用例。
第 9 章,*预测 GAN 的未来*,是最后一章。 在介绍了 GAN 的基础知识并完成了六个项目之后,本章将使读者了解 GAN 的未来。 在这里,我们将研究在过去的 3-4 年中,GAN 的采用取得了惊人的成就,以及该行业对它的接受程度。 我还将讨论我对 GAN 未来的个人看法。
第 9 章,“预测 GAN 的未来”,是最后一章。 在介绍了 GAN 的基础知识并完成了六个项目之后,本章将使读者了解 GAN 的未来。 在这里,我们将研究在过去的 3-4 年中,GAN 的采用取得了惊人的成就,以及该行业对它的接受程度。 我还将讨论我对 GAN 未来的个人看法。
......
......@@ -305,7 +305,7 @@ There are more scoring algorithms available that have been recently proposed by
Alec Radford,Luke Metz 和 Soumith Chintala 在名为*深度卷积生成对抗网络*的无监督表示学习*中提出了**深层卷积 GAN**(**DCGAN**),[可通过以下链接获得](https://arxiv.org/pdf/1511.06434.pdf) 。 香草 GAN 通常在其网络中没有**卷积神经网络**(**CNN**)。 这是在 DCGAN 的引入下首次提出的。 我们将在第 3 章,*使用条件 GAN* **进行面部老化,以学习如何使用 DCGAN 生成**动漫 ch 动漫面孔
Alec Radford,Luke Metz 和 Soumith Chintala 在名为*深度卷积生成对抗网络*的无监督表示学习*中提出了**深层卷积 GAN**(**DCGAN**),[可通过以下链接获得](https://arxiv.org/pdf/1511.06434.pdf) 。 香草 GAN 通常在其网络中没有**卷积神经网络**(**CNN**)。 这是在 DCGAN 的引入下首次提出的。 我们将在第 3 章,“使用条件 GAN 进行面部老化”中,学习如何使用 DCGAN 生成动漫人脸
......
......@@ -1571,7 +1571,7 @@ tensorboard.set_model(embedding_compressor_model)
训练模型需要几个步骤:
1. 用真实和假标签创建两个张量。 在训练生成器和鉴别器时将需要这些。 使用标签平滑处理,该内容在第 1 章,*生成对抗网络*中介绍:
1. 用真实和假标签创建两个张量。 在训练生成器和鉴别器时将需要这些。 使用标签平滑处理,该内容在第 1 章,“生成对抗网络”中介绍:
```py
real_labels = np.ones((batch_size, 1), dtype=float) * 0.9 fake_labels = np.zeros((batch_size, 1), dtype=float) * 0.1
......@@ -1816,7 +1816,7 @@ tensorboard.set_model(stage2_gen)
tensorboard.set_model(stage2_dis)
```
2. 然后,创建两个张量分别为`real``fake`的张量。 在训练生成器和鉴别器时将需要这些。 使用标签平滑处理,第 1 章,*生成对抗网络* 对此进行了介绍:
2. 然后,创建两个张量分别为`real``fake`的张量。 在训练生成器和鉴别器时将需要这些。 使用标签平滑处理,第 1 章,“生成对抗网络”对此进行了介绍:
```py
real_labels = np.ones((batch_size, 1), dtype=float) * 0.9 fake_labels = np.zeros((batch_size, 1), dtype=float) * 0.1
......
......@@ -25,7 +25,7 @@ Pix2pix 是一种**生成对抗网络**(**GAN**),用于图像到图像的
Pix2pix 是条件 GAN 的变体。 我们已经在 第 3 章,*中使用条件 GAN(cGAN)*进行面部老化处理。 在继续之前,请确保您了解什么是 cGAN。 一旦熟悉了 cGAN,就可以继续本章。 Pix2pix 是一种 GAN,能够使用**机器学习****ML**)的无监督方法执行图像到图像的翻译。 经过训练后,pix2pix 可以将图像从域 A 转换为域 B。香草 CNN 也可以用于图像到图像的转换,但是它们不会生成逼真的图像。 另一方面,pix2pix 显示出巨大的潜力,能够生成逼真的图像。 我们将训练 pix2pix 将立面的标签转换为立面的图像。 让我们从了解 pix2pix 的体系结构开始。
Pix2pix 是条件 GAN 的变体。 我们已经在第 3 章,“使用条件 GAN(cGAN)进行面部老化处理”中介绍。 在继续之前,请确保您了解什么是 cGAN。 一旦熟悉了 cGAN,就可以继续本章。 Pix2pix 是一种 GAN,能够使用**机器学习****ML**)的无监督方法执行图像到图像的翻译。 经过训练后,pix2pix 可以将图像从域 A 转换为域 B。香草 CNN 也可以用于图像到图像的转换,但是它们不会生成逼真的图像。 另一方面,pix2pix 显示出巨大的潜力,能够生成逼真的图像。 我们将训练 pix2pix 将立面的标签转换为立面的图像。 让我们从了解 pix2pix 的体系结构开始。
......
......@@ -45,7 +45,7 @@
如我们在第 1 章,*无监督学习*入门中所述,聚类分析的主要目标是根据相似性度量或接近性标准对数据集的元素进行分组。 在本章的第一部分中,我们将专注于前一种方法,而在第二部分和下一章中,我们将分析利用数据集其他几何特征的更多通用方法。
如我们在第 1 章,“无监督学习入门”中所述,聚类分析的主要目标是根据相似性度量或接近性标准对数据集的元素进行分组。 在本章的第一部分中,我们将专注于前一种方法,而在第二部分和下一章中,我们将分析利用数据集其他几何特征的更多通用方法。
让我们进行一个数据生成过程 *p <sub class="calibre20">数据</sub>(x)*,并从中抽取`N`个样本:
......
......@@ -145,7 +145,7 @@ Original dataset (left). Spectral clustering result (center). K-means result (ri
让我们考虑一个数据集 *X∈ <sup class="calibre27">M×N</sup>**MN* 维样本)是从多元数据生成过程 *p <sub class="calibre20">数据中得出的</sub>***均值漂移**算法应用于聚类问题的目的是找到 *p <sub class="calibre20">数据</sub>* 最大的区域,并将周围子区域中包含的样本与 同一集群。 由于 *p <sub class="calibre20">数据</sub>* 是 P **鲁棒性密度函数****PDF**),因此将其表示为 以一小部分参数(例如均值和方差)为特征的常规 PDF(例如,高斯)的总和。 以这种方式,可以认为 PDF 由样本生成的概率最高。 我们还将在第 5 章,*软聚类和高斯混合模型,*和第 6 章,“异常检测”中讨论该过程。 出于我们的目的,将问题重构为一个迭代过程,可以更新均值矢量(质心)的位置,直到达到最大值为止。 当质心到达其最终位置时,将使用标准邻域函数将样本分配给每个聚类。
让我们考虑一个数据集 *X∈ <sup class="calibre27">M×N</sup>**MN* 维样本)是从多元数据生成过程 *p <sub class="calibre20">数据中得出的</sub>***均值漂移**算法应用于聚类问题的目的是找到 *p <sub class="calibre20">数据</sub>* 最大的区域,并将周围子区域中包含的样本与 同一集群。 由于 *p <sub class="calibre20">数据</sub>* 是 P **鲁棒性密度函数****PDF**),因此将其表示为 以一小部分参数(例如均值和方差)为特征的常规 PDF(例如,高斯)的总和。 以这种方式,可以认为 PDF 由样本生成的概率最高。 我们还将在第 5 章,“软聚类和高斯混合模型”,和第 6 章,“异常检测”中讨论该过程。 出于我们的目的,将问题重构为一个迭代过程,可以更新均值矢量(质心)的位置,直到达到最大值为止。 当质心到达其最终位置时,将使用标准邻域函数将样本分配给每个聚类。
该算法的第一步是确定近似 p <sub class="calibre20">数据</sub>的合适方法。 一种经典方法(将在 **Parzen 的使用上(将在[第 6](https://cdp.packtpub.com/hands_on_unsupervised_learning_with_python/wp-admin/post.php?post=26&action=edit#post_29) , “异常检测”中进行讨论)。 Windows** 。 就目前而言,可以说 Parzen 窗口是一个非负内核函数 *f(•)*,其特征是称为**带宽**的参数(有关更多详细信息,请参阅原始论文) *关于概率密度函数和模式的估计,Parzen E。, 《数理统计年鉴》 33,* 1962)。 顾名思义,此参数的作用是加宽或限制 Parzen 窗口接近其最大值的区域。 考虑到与高斯分布的类比,带宽具有与方差相同的作用。 因此,较小的带宽将产生在均值附近非常峰值的函数,而较大的值与较平坦的函数关联。 不难理解,在这种特定情况下,群集的数量由带宽和相反的方式隐式确定。 因此,大多数实现(例如 scikit-learn)仅采用一个参数,然后计算另一个参数。 考虑到该算法已设计为适用于概率分布,自然的选择是指定所需带宽或让实现检测最佳带宽。 这个过程看起来比施加特定数量的群集更为复杂,但是,在许多实际情况下,尤其是当至少部分地了解了基本事实时,测试不同带宽的结果会更容易。
......@@ -527,7 +527,7 @@ Example of centroid selection (left) and medoid selection (right)
此外,K 质体趋向于*聚集*高度重叠的斑点,斑点的密度具有两个峰值,而 K-means 通常根据手段的位置将整个区域分为两部分。 如果凸几何的假设成立,则通常会接受此行为,但是在其他情况下这可能是一个限制(我们将在示例中展示这种效果)。
最后一个基本差异是公制距离。 由于没有限制,所以 K 型药物或多或少具有攻击性。 正如我们在第 2 章,*聚类基本原理中讨论的那样,*最长的距离由 Manhattan 度量标准提供(以相同的方式评估每个组件),而当`p`增加(以通用的 Minkowski 度量),组件之间的最大差异成为主导。 K 均值基于最常见的折衷(欧几里德距离),但是在某些特殊情况下,较大的`p`可以带来更好的性能(比较 *p = 1**p > 1* )。 例如,如果 *c <sub class="calibre20">1</sub> =(0,0)**c <sub class="calibre20">2</sub> =(2,1)**x =(0.55,1.25)*,曼哈顿距离 *d <sub class="calibre20">1</sub> (x,c <sub class="calibre20">1</sub> )**d <sub class="calibre20">1</sub> (x,c <sub class="calibre20">2</sub> )*分别为 1.8 和 1.7,而欧几里得距离为 1.37 和 1.47。 因此,在 *p = 1* 的情况下,该点被分配给第二个簇,而在 *p = 2* 的情况下,该点被分配给第一个簇。
最后一个基本差异是公制距离。 由于没有限制,所以 K 型药物或多或少具有攻击性。 正如我们在第 2 章,“聚类基本原理”中讨论的那样,最长的距离由 Manhattan 度量标准提供(以相同的方式评估每个组件),而当`p`增加(以通用的 Minkowski 度量),组件之间的最大差异成为主导。 K 均值基于最常见的折衷(欧几里德距离),但是在某些特殊情况下,较大的`p`可以带来更好的性能(比较 *p = 1**p > 1* )。 例如,如果 *c <sub class="calibre20">1</sub> =(0,0)**c <sub class="calibre20">2</sub> =(2,1)**x =(0.55,1.25)*,曼哈顿距离 *d <sub class="calibre20">1</sub> (x,c <sub class="calibre20">1</sub> )**d <sub class="calibre20">1</sub> (x,c <sub class="calibre20">2</sub> )*分别为 1.8 和 1.7,而欧几里得距离为 1.37 和 1.47。 因此,在 *p = 1* 的情况下,该点被分配给第二个簇,而在 *p = 2* 的情况下,该点被分配给第一个簇。
通常,预测正确的`p`值并不容易,但始终可以使用轮廓和调整后的 Rand 得分等方法测试几种配置,并选择产生更好分割效果的方法(即 ,最大内聚力和分离度或更高的调整后的 Rand 得分)。 在我们的示例中,我们将生成一个也包含基本事实的数据集,因此我们可以使用后一个选项轻松评估性能。 因此,我们将使用函数`make_blobs`生成`1000`样本,这些样本在由`[-5.0, 5.0]` 界定的框中分成`8`个 blob,如下所示:
......@@ -650,7 +650,7 @@ Ground truth (left), K-means (center), and K-medoids (right)
该算法(其名称代表**使用层次结构**的平衡迭代约简和聚类)具有比小批量 K 均值稍微复杂的动态特性,最后一部分采用了一种方法(**层次聚类**) 我们将在第 4 章,*层次结构聚类*中进行介绍。 然而,出于我们的目的,最重要的部分涉及数据准备阶段,该阶段基于称为 **聚类****特征特征树**的特定树结构( **CF 树**)。 给定数据集`X`,树的每个节点都由三个元素的元组组成:
该算法(其名称代表**使用层次结构**的平衡迭代约简和聚类)具有比小批量 K 均值稍微复杂的动态特性,最后一部分采用了一种方法(**层次聚类**) 我们将在第 4 章,“层次结构聚类”中进行介绍。 然而,出于我们的目的,最重要的部分涉及数据准备阶段,该阶段基于称为 **聚类****特征特征树**的特定树结构( **CF 树**)。 给定数据集`X`,树的每个节点都由三个元素的元组组成:
![](img/704067e3-6d6d-4dc0-89b4-a834109a4585.png)
......
......@@ -44,7 +44,7 @@
在第 4 章,*分层活动聚类*中分析的所有算法均属于硬聚类方法家族。 这意味着给定的样本始终分配给单个群集。 另一方面,软聚类旨在将每个样本 *x <sub class="calibre20">i</sub>* 与一个向量相关联,该向量通常表示 *x <sub class="calibre20">的概率 i</sub>* 属于每个群集:
在第 4 章,“分层活动聚类”中分析的所有算法均属于硬聚类方法家族。 这意味着给定的样本始终分配给单个群集。 另一方面,软聚类旨在将每个样本 *x <sub class="calibre20">i</sub>* 与一个向量相关联,该向量通常表示 *x <sub class="calibre20">的概率 i</sub>* 属于每个群集:
![](img/48b059fe-49bc-493e-bcfb-7be6d9ac7576.png)
......@@ -315,7 +315,7 @@ Weights:
[0.39683899 0.60316101]
```
因此,MLE 产生两个成分,其中一个成分占主导地位(即 *w <sub class="calibre20">2</sub> = 0.6* )。 为了知道高斯轴的方向,我们需要计算协方差矩阵的归一化特征向量(这一概念将在第 7 章,*降维和分量分析*):
因此,MLE 产生两个成分,其中一个成分占主导地位(即 *w <sub class="calibre20">2</sub> = 0.6* )。 为了知道高斯轴的方向,我们需要计算协方差矩阵的归一化特征向量(这一概念将在第 7 章,“降维和成分分析”中):
```py
import numpy as np
......@@ -584,7 +584,7 @@ Y[unlabeled_idx] = -1
![](img/65b86f60-db08-4f11-9cf4-8a820dd6e0ff.png)
此外,所有特征值都是非负的,特征向量生成正交的基础(当在第 7 章,*降维和分量分析*中讨论 PCA 时,此概念将非常有用)。
此外,所有特征值都是非负的,特征向量生成正交的基础(当在第 7 章,“降维和成分分析”中讨论 PCA 时,此概念将非常有用)。
如果协方差矩阵是随机选择的,则为了使其为正半定值,有必要将它们的每一个乘以其转置):
......
......@@ -395,7 +395,7 @@ Noisy samples (upper row); denoised images (lower row)
标准自动编码器生成的代码通常很密集; 但是,如第 7 章,*降维和分量分析*中所讨论的,有时,最好使用字典过于完整和稀疏编码。 实现此目标的主要策略是简单地在成本函数上添加 *L <sub class="calibre20">1</sub>* 罚款(在代码层上):
标准自动编码器生成的代码通常很密集; 但是,如第 7 章,“降维和成分分析”中所讨论的,有时,最好使用字典过于完整和稀疏编码。 实现此目标的主要策略是简单地在成本函数上添加 *L <sub class="calibre20">1</sub>* 罚款(在代码层上):
![](img/ec6a414d-389c-457f-9944-ba198988bf14.png)
......
......@@ -36,7 +36,7 @@ TensorFlow 是 Google 的开放源代码框架,用于构建机器学习 AI 应
第 1 章, “移动 TensorFlow 入门”,讨论如何在 Mac 和 Ubuntu 上设置 TensorFlow 以及在 Ubuntu 上设置 NVIDIA GPU,以及如何设置 Xcode 和 Android 工作室。 我们还将讨论 TensorFlow Mobile 和 TensorFlow Lite 之间的区别以及何时使用它们。 最后,我们将向您展示如何运行示例 TensorFlow iOS 和 Android 应用程序。
第 2 章, “通过迁移学习对图像进行分类” ,介绍了什么是转移学习以及为什么要使用转移学习,如何使用它 重新训练 Inception v3 和 MobileNet 模型,以更准确,更快地识别犬种,以及如何在示例 iOS 和 Android 应用程序中使用经过重新训练的模型。 然后,我们将向您展示如何在 Tensor-C 和 Swift 中将 TensorFlow 添加到自己的 iOS 应用中,以及如何将自己的 Android 应用添加到狗品种识别中。
第 2 章, “通过迁移学习对图像进行分类” ,介绍了什么是迁移学习以及为什么要使用迁移学习,如何使用它 重新训练 Inception v3 和 MobileNet 模型,以更准确,更快地识别犬种,以及如何在示例 iOS 和 Android 应用程序中使用经过重新训练的模型。 然后,我们将向您展示如何在 Tensor-C 和 Swift 中将 TensorFlow 添加到自己的 iOS 应用中,以及如何将自己的 Android 应用添加到狗品种识别中。
第 3 章,, “检测对象及其位置”,快速概述了对象检测,然后向您展示如何设置 TensorFlow 对象检测 API 并使用 它可以重新训练 SSD-MobileNet 和 Faster RCNN 模型。 我们还将通过手动构建 TensorFlow iOS 库以支持非默认 TensorFlow 操作的方式,向您展示如何在 iOS 应用中使用示例 TensorFlow Android 应用 中使用的模型。 最后,我们将向您展示如何训练 YOLO2(另一个流行的对象检测模型),该模型也在示例 TensorFlow Android 应用程序中使用,以及如何在 iOS 应用程序中使用它。
......@@ -70,7 +70,7 @@ TensorFlow 是 Google 的开放源代码框架,用于构建机器学习 AI 应
然后,如果您需要构建自定义的 TensorFlow Android 库,请转到第 7 章,“使用 CNN 和 LSTM 识别图形”,以及如果您想学习如何在 您的移动应用程序,请查看第 8 章, *使用 RNN 预测股价* , 和第 10 章, “构建类似 AlphaZero 的手机游戏应用程序” 。
如果您对 TensorFlow Lite 或 Core ML 更感兴趣,请阅读第 11 章,*在移动设备*上使用 TensorFlow Lite 和 Core ML,以及您对 Raspberry Pi 上的 TensorFlow 最感兴趣 或 TensorFlow 中的强化学习,请跳至第 12 章,*在 Raspberry Pi* 上开发 TensorFlow 应用程序
如果您对 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 应用程序时可能会遇到一些陷阱,同时也避免了重复自己。
......
......@@ -8,7 +8,7 @@
如果您已经安装了 TensorFlow,Xcode 和 Android Studio,并且可以运行和测试示例 TensorFlow iOS 和 Android 应用程序,并且如果您已经安装了 NVIDIA GPU 以进行更快的深度学习模型训练,则可以跳过本章。 或者,您可以直接跳到您不熟悉的部分。
我们将在本章涵盖以下主题(如何设置 Raspberry Pi 开发环境将在第 12 章,*在 Raspberry Pi* 上开发 TensorFlow 应用程序中进行讨论):
我们将在本章涵盖以下主题(如何设置 Raspberry Pi 开发环境将在第 12 章,“在 Raspberry Pi 上开发 TensorFlow 应用程序”中进行讨论):
* 设置 TensorFlow
* 设置 Xcode
......
# 通过移学习对图像进行分类
# 通过移学习对图像进行分类
......@@ -8,11 +8,11 @@
如果我们想提高准确性并在使用改进模型的智能手机上构建移动应用程序怎么办,那么当我们四处走走并看到一只有趣的狗时,我们可以使用该应用程序告诉我们它是哪种狗。
在本章中,我们将首先讨论为什么对于这样的图像分类任务,转移学习或重新训练经过预训练的深度学习模型是完成任务的最经济有效的方法。 然后,我们将向您展示如何使用良好的狗数据集对一些最佳图像分类模型进行再训练,以及如何在第 1 章,*移动 TensorFlow* 入门。 此外,我们还将分步说明如何将 TensorFlow 添加到基于 Objective-C 或 Swift 的 iOS 和 Android 应用中。
在本章中,我们将首先讨论为什么对于这样的图像分类任务,迁移学习或重新训练经过预训练的深度学习模型是完成任务的最经济有效的方法。 然后,我们将向您展示如何使用良好的狗数据集对一些最佳图像分类模型进行再训练,以及在第 1 章,“移动 TensorFlow 入门”。 此外,我们还将分步说明如何将 TensorFlow 添加到基于 Objective-C 或 Swift 的 iOS 和 Android 应用中。
总而言之,我们将在本章中介绍以下主题:
* 移学习-什么和为什么
* 移学习-什么和为什么
* 使用 Inception v3 模型进行再培训
* 使用 MobileNet 模型进行再培训
* 在示例 iOS 应用中使用经过重新训练的模型
......@@ -24,15 +24,15 @@
# 移学习-什么和为什么
# 移学习-什么和为什么
我们人类不会从头开始学习新事物。 取而代之的是,无论是否有意识地,我们都充分利用所学到的知识。 人工智能中的转移学习试图做同样的事情-这种技术通常只需要训练的大型模型中的一小块,然后将其重新用于相关任务的新模型中,而无需访问大型训练数据和计算资源 训练原始模型。 总体而言,迁移学习仍然是 AI 中的一个开放问题,因为在许多情况下,仅需人类反复尝试几个例子,然后再学习掌握新事物,就会花很多时间来训练和学习 AI。 但是,在图像识别领域,转移学习已被证明是非常有效的。
我们人类不会从头开始学习新事物。 取而代之的是,无论是否有意识地,我们都充分利用所学到的知识。 人工智能中的迁移学习试图做同样的事情-这种技术通常只需要训练的大型模型中的一小块,然后将其重新用于相关任务的新模型中,而无需访问大型训练数据和计算资源 训练原始模型。 总体而言,迁移学习仍然是 AI 中的一个开放问题,因为在许多情况下,仅需人类反复尝试几个例子,然后再学习掌握新事物,就会花很多时间来训练和学习 AI。 但是,在图像识别领域,迁移学习已被证明是非常有效的。
用于图像识别的现代深度学习模型通常是深度神经网络,或更具体地说,是具有许多层的深度**卷积神经网络****CNN**)。 这种 CNN 的较低层负责学习和识别较低层的功能,例如图像的边缘,轮廓和零件,而最后一层则确定图像的类别。 对于不同类型的对象,例如犬种或花朵类型,我们不需要重新学习网络较低层的参数或权重。 实际上,从头开始需要花费数周的培训来学习用于图像识别的现代 CNN 的所有权重,通常是数百万甚至更多。 传输 在图像分类的情况下,学习使我们能够使用特定的图像集重新训练此类 CNN 的最后一层,通常不到一小时,而 所有其他层都保持不变,并且达到了几乎相同的精度,就像我们从头开始训练整个网络数周一样。
移学习的第二个主要好处是,我们只需要少量的训练数据就可以重新训练 CNN 的最后一层。 如果必须从头开始训练深层 CNN 的数百万个参数,则需要大量的训练数据。 例如,对于我们的狗品种再训练,我们只需要为每个狗品种提供 100 幅以上的图像,即可建立一个比原始图像分类模型更好的狗品种分类模型。
移学习的第二个主要好处是,我们只需要少量的训练数据就可以重新训练 CNN 的最后一层。 如果必须从头开始训练深层 CNN 的数百万个参数,则需要大量的训练数据。 例如,对于我们的狗品种再训练,我们只需要为每个狗品种提供 100 幅以上的图像,即可建立一个比原始图像分类模型更好的狗品种分类模型。
If you're unfamiliar with CNN, check out the videos and notes of one of the best resources on it, the Stanford CS231n course *CNN for Visual Recognition* ([http://cs231n.stanford.edu](http://cs231n.stanford.edu)). Another good resource on CNN is Chapter 6 of *Michael Nielsen's* online book, *Neural Networks and Deep Learning*: [http://neuralnetworksanddeeplearning.com/chap6.html#introducing_convolutional_networks](http://neuralnetworksanddeeplearning.com/chap6.html#introducing_convolutional_networks).
......@@ -339,7 +339,7 @@ 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`图像文件,然后拖放到项目的数据文件夹中,并确保同时复制两个项目 选中和添加到目标,如以下屏幕截图所示:
......
......@@ -66,7 +66,7 @@ TensorFlow 对象检测 API 在其[官方网站](https://github.com/tensorflow/m
执行以下步骤来安装和运行对象检测推断:
1. 在第 1 章,*移动 TensorFlow* 入门中创建的 TensorFlow 源根中,获取 TensorFlow 模型存储库,其中包含 TensorFlow 对象检测 API 作为其研究模型之一:
1. 在第 1 章,“移动 TensorFlow 入门”中创建的 TensorFlow 源根中,获取 TensorFlow 模型存储库,其中包含 TensorFlow 对象检测 API 作为其研究模型之一:
```py
git clone https://github.com/tensorflow/models
......@@ -433,7 +433,7 @@ python object_detection/export_inference_graph.py \
Could not create TensorFlow Graph: Not found: Op type not registered 'NonMaxSuppressionV2'
```
除非将 TensorFlow 实验 Pod 更新为包括未在此处注册的 **op** ,否则解决这些问题的唯一方法是通过从 TensorFlow 源构建自定义 TensorFlow iOS 库,这就是我们向您展示的原因 第 1 章,*移动入门* *TensorFlow* 中的内容,如何从源代码获取和设置 TensorFlow。 让我们看一下构建自己的 TensorFlow iOS 库并使用它来创建具有 TensorFlow 支持的新 iOS 应用的步骤。
除非将 TensorFlow 实验 Pod 更新为包括未在此处注册的 **op** ,否则解决这些问题的唯一方法是通过从 TensorFlow 源构建自定义 TensorFlow iOS 库,这就是我们为什么向您展示第 1 章,“移动 TensorFlow 入门”中的内容,“如何从源代码获取和设置 TensorFlow”。 让我们看一下构建自己的 TensorFlow iOS 库并使用它来创建具有 TensorFlow 支持的新 iOS 应用的步骤。
......@@ -533,7 +533,7 @@ cd <TENSORFLOW_ROOT>/models/research/object_detection/protos
```
5. protoc 编译器命令完成后,您将在项目的源目录中看到两个文件:`string_int_label_map.pb.cc``string_int_label_map.pb.h`。 将两个文件添加到 Xcode 项目中。
6. 在 Xcode 中,像在上一章中一样,将`ViewController.m`重命名为`ViewController.mm`,然后类似于第 2 章,*通过转移学习对图像进行分类的`HelloTensorFlow`应用的`ViewController.mm` [* ,在分接的处理程序中为我们添加到项目中并将要测试的三个对象检测模型添加三个 UIAlertAction。 现在,完整的项目文件应如图 3.7 所示:
6. 在 Xcode 中,像在上一章中一样,将`ViewController.m`重命名为`ViewController.mm`,然后类似于第 2 章,“通过迁移学习对图像进行分类”的`HelloTensorFlow`应用的`ViewController.mm`,在点击的处理程序中为三个对象检测模型添加三个`UIAlertAction`,我们已将模型添加到项目中并将要测试。 现在,完整的项目文件应如图 3.7 所示:
![](img/7023289e-ae57-4518-920e-140985314d13.png)Figure 3.7 The TFObjectDetection API project files
......@@ -566,7 +566,7 @@ LoadGraph 尝试加载三个用户选择的模型文件之一,并返回加载
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}));
......
......@@ -83,7 +83,7 @@ python evaluate.py --checkpoint checkpoints \
python freeze.py --model_folder=checkpoints_ios --output_graph fst_frozen.pb
```
7. 假设您具有`/tf_files`目录,将生成的`fst_frozen.pb`文件复制到`/tf_files``cd`直接复制到 TensorFlow 源根目录(可能是`~/tensorflow-1.4.0`),然后运行以下命令以生成`.pb`的量化模型 ]文件(我们在第 2 章,*通过转移学习*对图像进行分类中介绍了量化):
7. 假设您具有`/tf_files`目录,将生成的`fst_frozen.pb`文件复制到`/tf_files``cd`直接复制到 TensorFlow 源根目录(可能是`~/tensorflow-1.4.0`),然后运行以下命令以生成`.pb`的量化模型 ]文件(我们在第 2 章,“通过迁移学习对图像进行分类”中介绍了量化):
```py
bazel-bin/tensorflow/tools/quantization/quantize_graph \
......@@ -107,7 +107,7 @@ bazel-bin/tensorflow/tools/quantization/quantize_graph \
事实证明,在由 TensorFlow 实验性容器构建的 iOS 应用中,使用在步骤 7 中生成的`fst_frozen_quantized.pb`模型文件没有问题,如第 2 章,*分类 具有 Transfer Learning* 的图像,但 TensorFlow Magenta 项目中的预训练多样式模型文件(我们将在本章的后续部分中使用)将不会随 TensorFlow pod 一起加载(截至 2018 年 1 月 )—尝试加载多样式模型文件时将引发以下错误:
事实证明,在由 TensorFlow 实验性容器构建的 iOS 应用中,使用在步骤 7 中生成的`fst_frozen_quantized.pb`模型文件没有问题,如第 2 章,“通过迁移学习对图像分类”,但 TensorFlow Magenta 项目中的预训练多样式模型文件(我们将在本章的后续部分中使用)将不会随 TensorFlow pod 一起加载(截至 2018 年 1 月 )—尝试加载多样式模型文件时将引发以下错误:
```py
Could not create TensorFlow Graph: Invalid argument: No OpKernel was registered to support Op 'Mul' with these attrs. Registered devices: [CPU], Registered kernels:
......@@ -234,7 +234,7 @@ return imgScaled;
在第 2 章,*通过转移学习*对图像进行分类中,我们描述了如何将 TensorFlow 添加到您自己的 Android 应用中,但没有任何 UI。 让我们创建一个新的 Android 应用程序,以使用我们之前训练并在 iOS 中使用的快速样式传输模型。
在第 2 章,“通过迁移学习对图像进行分类”中,我们描述了如何将 TensorFlow 添加到您自己的 Android 应用中,但没有任何 UI。 让我们创建一个新的 Android 应用程序,以使用我们之前训练并在 iOS 中使用的快速样式传输模型。
由于此 Android 应用程序提供了一个很好的机会来使用最少的 TensorFlow 相关代码,Android UI 和线程化代码来运行完整的 TensorFlow 模型驱动的应用程序,因此,我们将从头开始添加每行代码,以帮助您进一步了解 从头开始开发 Android TensorFlow 应用需要什么:
......
......@@ -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 Speech,专门定义了那些 输入名称和输出名称。 在本书后面的几章中,您将看到如何在需要时借助或不借助我们的三种方法来查找模型训练的源代码,以找出关键的输入和输出节点名称。 或者希望,当您阅读本书时,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 Speech,专门定义了那些 输入名称和输出名称。 在本书后面的几章中,您将看到如何在需要时借助或不借助我们的三种方法来查找模型训练的源代码,以找出关键的输入和输出节点名称。 或者希望,当您阅读本书时,TensorFlow `summarize_graph`工具将得到改进,以为我们提供准确的输入和输出节点名称。
现在是时候在移动应用中使用我们的热门新模型了。
......@@ -627,7 +627,7 @@ $ grep 'REGISTER.*"DecodeWav"' tensorflow/core/kernels/*.cc
tensorflow/core/kernels/decode_wav_op.cc:REGISTER_KERNEL_BUILDER(Name("DecodeWav").Device(DEVICE_CPU), DecodeWavOp);
```
在 TensorFlow 1.4 的 `tf_op_files.txt`文件中,已经有一行文本`tensorflow/core/kernels/decode_wav_op.cc`,但可以肯定的是`tensorflow/core/ops/audio_ops.cc`丢失了。 我们需要做的就是在`tf_op_files.txt`文件中的任意位置添加一行`tensorflow/core/ops/audio_ops.cc`,并像在第 3 章,*检测对象及其位置中一样运行`tensorflow/contrib/makefile/build_all_ios.sh`* ,以重建 TensorFlow iOS 库。 然后再次运行 iOS 应用,并继续轻按启动按钮,然后说出语音命令以识别或误解,直到您无聊为止。
在 TensorFlow 1.4 的 `tf_op_files.txt`文件中,已经有一行文本`tensorflow/core/kernels/decode_wav_op.cc`,但可以肯定的是`tensorflow/core/ops/audio_ops.cc`丢失了。 我们需要做的就是在`tf_op_files.txt`文件中的任意位置添加一行`tensorflow/core/ops/audio_ops.cc`,并像在第 3 章,“检测对象及其位置”中一样运行`tensorflow/contrib/makefile/build_all_ios.sh`* ,以重建 TensorFlow iOS 库。 然后再次运行 iOS 应用,并继续轻按启动按钮,然后说出语音命令以识别或误解,直到您无聊为止。
The process on how to fix the "Not found: Op type not registered" error is a big takeaway from this chapter, as it can possibly save you a lot of time when working on other TensorFlow models in the future.
......@@ -641,7 +641,7 @@ The process on how to fix the "Not found: Op type not registered" error is a big
我们在第 2 章*中使用 TensorFlow 窗格创建了一个基于 Swift 的 iOS 应用,并通过 Transfer Learning* 对图像进行了分类。 现在让我们创建一个新的 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 ++代码的包装。
......
......@@ -26,7 +26,7 @@
获奖的 Show and Tell 模型是使用端到端方法进行训练的,类似于我们在上一章中简要介绍的最新的基于深度学习的语音识别模型。 它使用 MSCOCO 图像字幕 2014 数据集,可从[这里](http://cocodataset.org/#download)下载,该数据集包含超过 82,000 个训练图像,并以描述它们的自然语言句子为目标。 训练模型以使为每个输入图像输出目标自然语言句子的可能性最大化。 与使用多个子系统的其他更复杂的训练方法不同,端到端方法优雅,简单,并且可以实现最新的结果。
为了处理和表示输入图像,Show and Tell 模型使用预训练的 Inception v3 模型,该模型与我们在 第 2 章 ,*通过移学习*对图像进行分类。 Inception v3 CNN 网络的最后一个隐藏层用作输入图像的表示。 由于 CNN 模型的性质,较早的层捕获更多的基本图像信息,而较后的层捕获更高级的图像概念。 因此,通过使用输入图像的最后一个隐藏层来表示图像,我们可以更好地准备具有高级概念的自然语言输出。 毕竟,我们通常会开始用诸如“人”或“火车”之类的词来描述图片,而不是“带有尖锐边缘的东西”。
为了处理和表示输入图像,Show and Tell 模型使用预训练的 Inception v3 模型,该模型与我们在 第 2 章 ,*通过移学习*对图像进行分类。 Inception v3 CNN 网络的最后一个隐藏层用作输入图像的表示。 由于 CNN 模型的性质,较早的层捕获更多的基本图像信息,而较后的层捕获更高级的图像概念。 因此,通过使用输入图像的最后一个隐藏层来表示图像,我们可以更好地准备具有高级概念的自然语言输出。 毕竟,我们通常会开始用诸如“人”或“火车”之类的词来描述图片,而不是“带有尖锐边缘的东西”。
为了表示目标自然语言输出中的每个单词,使用了单词嵌入方法。 词嵌入只是词的向量表示。 [TensorFlow 网站上有一个不错的教程](https://www.tensorflow.org/tutorials/word2vec),介绍如何构建模型来获取单词的矢量表示。
......@@ -172,7 +172,7 @@ Captions for image COCO_val2014_000000224477.jpg:
在第 4 章,*转换具有惊人艺术风格的图片,*和第 5 章,“了解简单语音命令”中,我们使用了两个略有不同的版本 一个名为`freeze.py`的脚本将受过训练的网络权重与网络图定义合并到一个自足的模型文件中,这是我们可以在移动设备上使用的好处。 TensorFlow 还带有`freeze`脚本的更通用版本,称为`freeze_graph.py`,位于`tensorflow/python/tools`文件夹中,可用于构建模型文件。 要使其正常运行,您需要为其提供至少四个参数(要查看所有可用参数,请查看 `tensorflow/python/tools/freeze_graph.py`):
在第 4 章,“转换具有惊人艺术风格的图片”,和第 5 章,“了解简单语音命令”中,我们使用了两个略有不同的版本 一个名为`freeze.py`的脚本将受过训练的网络权重与网络图定义合并到一个自足的模型文件中,这是我们可以在移动设备上使用的好处。 TensorFlow 还带有`freeze`脚本的更通用版本,称为`freeze_graph.py`,位于`tensorflow/python/tools`文件夹中,可用于构建模型文件。 要使其正常运行,您需要为其提供至少四个参数(要查看所有可用参数,请查看 `tensorflow/python/tools/freeze_graph.py`):
* `--input_graph``--input_meta_graph`:模型的图形定义文件。 例如,在上一节的第 4 步的命令`ls -lt $MODEL_DIR/train`的输出中,`model.ckpt-109587.meta`是一个元图文件,其中包含模型的图定义和其他与检查点相关的元数据,而`graph.pbtxt`只是模型的图 定义。
* `--input_checkpoint` :特定的检查点文件,例如 `model.ckpt-109587` 。 注意,您没有指定大型检查点文件 `model.ckpt-109587.data-00000-of-00001` 的完整文件名。
......@@ -444,9 +444,9 @@ bazel-bin/tensorflow/contrib/util/convert_graphdef_memmapped_format \
由于该模型的 CNN 部分基于 Inception v3,因此我们在第 2 章,*通过转移学习*对图像进行分类时使用的模型相同,因此我们可以并且将使用更简单的 TensorFlow pod 进行以下操作: 创建我们的 Objective-C iOS 应用。 请按照此处的步骤查看如何在新的 iOS 应用中同时使用`image2text_frozen_transformed.pb``image2text_frozen_transformed_memmapped.pb`模型文件:
由于该模型的 CNN 部分基于 Inception v3,因此我们在第 2 章,“通过迁移学习对图像进行分类”时使用的模型相同,因此我们可以并且将使用更简单的 TensorFlow pod 进行以下操作: 创建我们的 Objective-C iOS 应用。 请按照此处的步骤查看如何在新的 iOS 应用中同时使用`image2text_frozen_transformed.pb``image2text_frozen_transformed_memmapped.pb`模型文件:
1. 类似于第 2 章,*通过传输学习对图像进行分类,*中的*将 TensorFlow 添加到 Objective-C iOS 应用*部分中的前四个步骤类似, 名为`Image2Text`的 iOS 项目,添加具有以下内容的名为`Podfile`的新文件:
1. 类似于第 2 章,“通过传输学习对图像进行分类”,“将 TensorFlow 添加到 Objective-C iOS 应用”部分中的前四个步骤, 名为`Image2Text`的 iOS 项目,添加具有以下内容的名为`Podfile`的新文件:
```py
target 'Image2Text'
......@@ -514,7 +514,7 @@ UILabel *_lbl;
NSString* generateCaption(bool memmapped);
```
此简单的与 UI 相关的代码类似于第 2 章,*通过 Transfer Learning* 对图像进行分类的 iOS 应用程序的代码。 基本上,您可以在应用启动后点击任意位置,然后选择两个模型之一,图像描述结果将显示在顶部。 当用户在`alert`操作中选择了映射模型时,将运行以下代码:
此简单的与 UI 相关的代码类似于第 2 章,“通过迁移学习对图像进行分类”的 iOS 应用程序的代码。 基本上,您可以在应用启动后点击任意位置,然后选择两个模型之一,图像描述结果将显示在顶部。 当用户在`alert`操作中选择了映射模型时,将运行以下代码:
```py
dispatch_async(dispatch_get_global_queue(0, 0), ^{
......
......@@ -271,7 +271,7 @@ bazel-bin/tensorflow/contrib/util/convert_graphdef_memmapped_format \
要解决以前的 RefSwitch 错误,无论您是否像在第 2 章,*通过传递学习*[第 6 章[](../Text/06.html) ,“用自然语言描述图像”或手动构建的 TensorFlow 库,就像在其他章节中一样,我们必须使用一些新技巧。 发生错误的原因是`RefSwitch`操作需要 INT64 数据类型,但它不是 TensorFlow 库中内置的已注册数据类型之一,因为默认情况下,要使该库尽可能小,仅适用于 每个操作都包括在内。 我们可能会从 Python 的模型构建端修复此问题,但是在这里,我们仅向您展示如何从 iOS 端修复此问题,当您无权访问源代码来构建模型时,这很有用。
要解决以前的 RefSwitch 错误,无论您是否像在第 2 章,“通过迁移学习对图像分类”和第 6 章,“用自然语言描述图像”或手动构建的 TensorFlow 库,就像在其他章节中一样,我们必须使用一些新技巧。 发生错误的原因是`RefSwitch`操作需要 INT64 数据类型,但它不是 TensorFlow 库中内置的已注册数据类型之一,因为默认情况下,要使该库尽可能小,仅适用于 每个操作都包括在内。 我们可能会从 Python 的模型构建端修复此问题,但是在这里,我们仅向您展示如何从 iOS 端修复此问题,当您无权访问源代码来构建模型时,这很有用。
......
......@@ -39,7 +39,7 @@ If you're interested in knowing more about the Nash Equilibrium, Google *"khan a
* 从劣质图像生成高质量图像
* 图像修复(修复丢失或损坏的图像)
* 翻译图像(例如,从边缘草图到照片,或者在人脸上添加或移除诸如眼镜之类的对象)
* 从文本生成图像(在第 6 章,*中以自然语言*描述图像的 Text2Image 相反)
* 从文本生成图像(和第 6 章,“使用自然语言描述图像”的 Text2Image 相反)
* 撰写看起来像真实新闻的新闻文章
* 生成与训练集中的音频相似的音频波形
......@@ -164,7 +164,7 @@ git clone https://github.com/jeffxtang/pix2pix-tensorflow
cd pix2pix-tensorflow
```
2. 创建一个新目录`photos/original`并复制一些图像文件-例如,我们[斯坦福狗数据集](http://vision.stanford.edu/aditya86/ImageNetDogs),在第 2 章,*中将带有转移学习*的图像分类`photos/original`目录
2. 创建一个新目录`photos/original`并复制一些图像文件-例如,我们将所有拉布拉多犬的图片从[斯坦福狗数据集](http://vision.stanford.edu/aditya86/ImageNetDogs)(在第 2 章,“使用迁移学习的图像分类”中使用)复制`photos/original`目录
3. 运行脚本`python tools/process.py --input_dir photos/original --operation resize --output_dir photos/resized`调整`photo/original`目录中图像的大小并将调整后的图像保存到`photos/resized`目录中
4. 运行`mkdir photos/blurry`,然后运行`python tools/convert.py`,以使用流行的 ImageMagick 的`convert`命令将调整大小的图像转换为模糊的图像。 `convert.py`的代码如下:
......@@ -264,7 +264,7 @@ python tensorflow/python/tools/freeze_graph.py \
--input_binary=true
```
11. 生成的`pix2pix.pb`模型文件很大,约为 217 MB,将其加载到 iOS 或 Android 设备上时会崩溃或导致**内存不足****OOM**)错误。 我们必须像在第 6 章,*以自然语言*描述图像的复杂 im2txt 模型中所做的那样,将其转换为 iOS 的映射格式。
11. 生成的`pix2pix.pb`模型文件很大,约为 217 MB,将其加载到 iOS 或 Android 设备上时会崩溃或导致**内存不足****OOM**)错误。 我们必须像在第 6 章,“使用自然语言描述图像”的复杂 im2txt 模型中所做的那样,将其转换为 iOS 的映射格式。
```py
bazel-bin/tensorflow/tools/graph_transforms/transform_graph \
......@@ -324,7 +324,7 @@ No OpKernel was registered to support Op 'FIFOQueueV2' with these attrs. Registe
您需要将`tensorflow/core/kernels/fifo_queue_op.cc`添加到`tf_op_files.txt`并重建 iOS 库。 但是,如果您使用 TensorFlow 1.5 或 1.6,则`tensorflow/core/kernels/fifo_queue_op.cc`文件已经添加到`tf_op_files.txt`文件中。 在每个新版本的 TensorFlow 中,默认情况下,越来越多的内核被添加到`tf_op_files.txt`
借助为模型构建的 TensorFlow iOS 库,让我们在 Xcode 中创建一个名为 GAN 的新项目,并像在第 8 章,*中使用 RNN 预测股价*一样在该项目中设置 TensorFlow。 以及其他不使用 TensorFlow 窗格的章节。 然后将两个模型文件`gan_mnist.pb``pix2pix_transformed_memmapped.pb`以及一个测试图像拖放到项目中。 另外,将第 6 章,*以自然语言*描述图像的 iOS 项目中的`tensorflow_utils.h``tensorflow_utils.mm``ios_image_load.h``ios_image_load.mm`文件复制到 GAN 项目。 将`ViewController.m`重命名为`ViewController.mm`
借助为模型构建的 TensorFlow iOS 库,让我们在 Xcode 中创建一个名为 GAN 的新项目,并像在第 8 章,“使用 RNN 预测股价”一样在该项目中设置 TensorFlow。 以及其他不使用 TensorFlow 窗格的章节。 然后将两个模型文件`gan_mnist.pb``pix2pix_transformed_memmapped.pb`以及一个测试图像拖放到项目中。 另外,将第 6 章,“使用自然语言描述图像”的 iOS 项目中的`tensorflow_utils.h``tensorflow_utils.mm``ios_image_load.h``ios_image_load.mm`文件复制到 GAN 项目。 将`ViewController.m`重命名为`ViewController.mm`
现在,您的 Xcode 应该类似于图 9.2:
......@@ -428,7 +428,7 @@ No OpKernel was registered to support Op 'FIFOQueueV2' with these attrs. Registe
}
```
`createMNISTImageInRect`的定义如下-我们在第 7 章,*中使用 CNN 和 LSTM* 识别图形使用了类似的技术:
`createMNISTImageInRect`的定义如下-我们在第 7 章,“使用 CNN 和 LSTM 识别图形”中使用了类似的技术:
```py
- (UIImage *)createMNISTImageInRect:(CGRect)rect values:(NSArray*)greyscaleValues
......@@ -557,7 +557,7 @@ No OpKernel was registered to support Op 'FIFOQueueV2' with these attrs. Registe
事实证明,我们不需要使用自定义的 TensorFlow Android 库,就像我们在第 7 章,*通过 CNN 和 LSTM 识别图纸*中所做的那样,即可在 Android 中运行 GAN 模型。 只需创建一个具有所有默认设置的名为 GAN 的新 Android Studio 应用程序,将`compile 'org.tensorflow:tensorflow-android:+'`添加到应用程序的`build.gradle`文件,创建一个新的 Assets 文件夹,然后复制两个 GAN 模型文件和一个测试模糊图像。
事实证明,我们不需要使用自定义的 TensorFlow Android 库,就像我们在第 7 章,“通过 CNN 和 LSTM 识别图纸”中所做的那样,即可在 Android 中运行 GAN 模型。 只需创建一个具有所有默认设置的名为 GAN 的新 Android Studio 应用程序,将`compile 'org.tensorflow:tensorflow-android:+'`添加到应用程序的`build.gradle`文件,创建一个新的 Assets 文件夹,然后复制两个 GAN 模型文件和一个测试模糊图像。
现在,您在 Android Studio 中的项目应如图 9.5 所示:
......
......@@ -10,7 +10,7 @@
事实证明,这只是朝着 Google 更雄心勃勃的目标迈出的一步,该目标是将 AlphaGo 背后的 AI 技术应用和改进到其他领域。 2017 年 12 月,DeepMind 发表了另一篇论文,[即使用通用强化学习算法通过自学掌握国际象棋和将棋](https://arxiv.org/pdf/1712.01815.pdf),对 AlphaGo 进行了概括。 将零程序归类为一个称为 AlphaZero 的算法,并使用该算法从头开始快速学习如何玩象棋和将棋的游戏,从除了游戏规则之外没有任何领域知识的随机游戏开始,并在 24 小时内实现了超人级别并击败世界冠军。
在本章中,我们将带您浏览 AlphaZero 的最新最酷的部分,向您展示如何构建和训练类似 AlphaZero 的模型来玩一个简单而有趣的游戏,称为 [Connect 4](https://en.wikipedia.org/wiki/Connect_Four),在 TensorFlow 和 Keras 中使用,这是我们在第 8 章,*中使用 RNN* 预测股价的流行的高级深度学习库。 我们还将介绍如何使用训练有素的 AlphaZero 模型来获得训练有素的专家策略,以指导移动游戏的玩法,以及使用该模型玩 Connect 4 游戏的完整 iOS 和 Android 应用程序的源代码。
在本章中,我们将带您浏览 AlphaZero 的最新最酷的部分,向您展示如何构建和训练类似 AlphaZero 的模型来玩一个简单而有趣的游戏,称为 [Connect 4](https://en.wikipedia.org/wiki/Connect_Four),在 TensorFlow 和 Keras 中使用,这是我们在第 8 章,“使用 RNN 预测股价”的流行的高级深度学习库。 我们还将介绍如何使用训练有素的 AlphaZero 模型来获得训练有素的专家策略,以指导移动游戏的玩法,以及使用该模型玩 Connect 4 游戏的完整 iOS 和 Android 应用程序的源代码。
总之,本章将涵盖以下主题:
......
......@@ -118,7 +118,7 @@ target 'HelloTFLite'
![](img/b4b1750b-cc97-42f8-a032-226b595d7e46.png)Figure 11.1 A new Xcode iOS project using the TensorFlow Lite podWe're only showing you how to use the TensorFlow Lite pod in your iOS apps. There's another way to add TensorFlow Lite to iOS, similar to building the custom TensorFlow Mobile iOS library that we've done many times in the previous chapters. For more information on how to build your own custom TensorFlow Lite iOS library, see the documentation at [https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/g3doc/ios.md](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/g3doc/ios.md).
4. 将第 2 章,*通过移学习*对图像进行分类的[UIG4] iOS 应用中的类似 UI 代码复制到`ViewController.mm`,后者使用`UITapGestureRecognizer`捕获用户的手势 屏幕上,然后调用`RunInferenceOnImage`方法,该方法将加载 TensorFlow Lite 模型文件:
4. 将第 2 章,*通过移学习*对图像进行分类的[UIG4] iOS 应用中的类似 UI 代码复制到`ViewController.mm`,后者使用`UITapGestureRecognizer`捕获用户的手势 屏幕上,然后调用`RunInferenceOnImage`方法,该方法将加载 TensorFlow Lite 模型文件:
```py
NSString* RunInferenceOnImage() {
......@@ -200,7 +200,7 @@ NSString* RunInferenceOnImage() {
在第 2 章,*通过移学习*对图像进行分类中,我们重新训练了 MobileNet TensorFlow 模型来进行狗的品种识别任务,并且要在 TensorFlow Lite 中使用这种模型,我们首先需要进行转换 使用 TensorFlow Lite 转换工具将其转换为 TensorFlow Lite 格式:
在第 2 章,*通过移学习*对图像进行分类中,我们重新训练了 MobileNet TensorFlow 模型来进行狗的品种识别任务,并且要在 TensorFlow Lite 中使用这种模型,我们首先需要进行转换 使用 TensorFlow Lite 转换工具将其转换为 TensorFlow Lite 格式:
```py
bazel build tensorflow/contrib/lite/toco:toco
......@@ -227,7 +227,7 @@ bazel-bin/tensorflow/contrib/lite/toco/toco \
在前面的章节中,我们已经训练了许多定制的 TensorFlow 模型,并将其冻结以供移动使用。 不幸的是,如果您尝试使用上一节中内置的`bazel-bin/tensorflow/contrib/lite/toco/toco` TensorFlow Lite 转换工具 将模型从 TensorFlow 格式转换为 TensorFlow Lite 格式,则它们都会失败,除了 第 2 章, *通过移学习* 对图像进行分类的再训练模型; 大多数错误属于“转换不受支持的操作”类型。 例如,以下命令尝试将第 3 章, “检测对象及其位置” 中的 TensorFlow 对象检测模型转换为 TensorFlow Lite 格式:
在前面的章节中,我们已经训练了许多定制的 TensorFlow 模型,并将其冻结以供移动使用。 不幸的是,如果您尝试使用上一节中内置的`bazel-bin/tensorflow/contrib/lite/toco/toco` TensorFlow Lite 转换工具 将模型从 TensorFlow 格式转换为 TensorFlow Lite 格式,则它们都会失败,除了 第 2 章, *通过移学习* 对图像进行分类的再训练模型; 大多数错误属于“转换不受支持的操作”类型。 例如,以下命令尝试将第 3 章, “检测对象及其位置” 中的 TensorFlow 对象检测模型转换为 TensorFlow Lite 格式:
```py
bazel-bin/tensorflow/contrib/lite/toco/toco \
......
......@@ -6,7 +6,7 @@
根据 Wikipedia 的说法,“ Raspberry Pi 是 Raspberry Pi 基金会在英国开发的一系列小型单板计算机,旨在促进学校和发展中国家的基础计算机科学教学。” [Raspberry Pi 的官方网站](https://www.raspberrypi.org)将其描述为“一种小型且价格合理的计算机,可以用来学习编程。” 如果您以前从未听说过或使用过 Raspberry Pi,请访问其网站,然后您很快就会爱上这个很棒的小东西。 几乎没有什么功能-实际上,TensorFlow 的开发人员从 2016 年中期开始在早期版本的 Raspberry Pi 上提供了 TensorFlow,因此我们可以在微型计算机上运行复杂的 TensorFlow 模型,您只需花费 35 美元即可购买到。 这可能超出了“基础计算机科学的教学”或“学习编程”的范围,但另一方面,如果我们考虑过去几年中移动设备的所有飞速发展,那么看到这一点我们就不会感到惊讶 如何在越来越小的设备中实现越来越多的功能。
在本章中,我们将进入 Raspberry Pi 的有趣世界,Raspberry Pi 是 TensorFlow 正式支持的最小设备。 我们将首先介绍如何获取和设置新的 Raspberry Pi 3 B 板,包括本章中使用的所有必要配件,以使其能够看,听和说。 然后,我们将介绍如何使用 [GoPiGo 机器人基础套件](https://www.dexterindustries.com/shop/gopigo3-robot-base-kit),将 Raspberry Pi 板变成一个可以移动的机器人。 之后,我们将提供最简单的工作步骤,以便在 Raspberry Pi 上设置 TensorFlow 1.6 并构建其示例 Raspberry Pi 应用程序。 我们还将讨论如何集成图像分类,这是我们在第 2 章,*通过移学习*对图像进行分类时使用的模型,并通过文字转语音功能使机器人告诉我们它可以识别的内容 以及如何集成音频识别,这是我们在第 5 章,“了解简单语音命令”中使用的模型以及 GoPiGo API,可让您使用语音命令来控制机器人的运动 。
在本章中,我们将进入 Raspberry Pi 的有趣世界,Raspberry Pi 是 TensorFlow 正式支持的最小设备。 我们将首先介绍如何获取和设置新的 Raspberry Pi 3 B 板,包括本章中使用的所有必要配件,以使其能够看,听和说。 然后,我们将介绍如何使用 [GoPiGo 机器人基础套件](https://www.dexterindustries.com/shop/gopigo3-robot-base-kit),将 Raspberry Pi 板变成一个可以移动的机器人。 之后,我们将提供最简单的工作步骤,以便在 Raspberry Pi 上设置 TensorFlow 1.6 并构建其示例 Raspberry Pi 应用程序。 我们还将讨论如何集成图像分类,这是我们在第 2 章,*通过移学习*对图像进行分类时使用的模型,并通过文字转语音功能使机器人告诉我们它可以识别的内容 以及如何集成音频识别,这是我们在第 5 章,“了解简单语音命令”中使用的模型以及 GoPiGo API,可让您使用语音命令来控制机器人的运动 。
最后,我们将向您展示如何使用 TensorFlow 和 OpenAI Gym,这是一个用于开发和比较强化学习算法的 Python 工具包,如何在模拟环境中实现强大的强化学习算法,以使我们的机器人能够在真实的身体中移动和平衡 环境。
......@@ -344,7 +344,7 @@ 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 章,*使用*通过转移学习对图像进行分类一样,提供通过转移学习重新训练的模型。 ]参数在运行两个示例应用程序时。
默认情况下,摄像机示例还使用`label_image/data`文件夹中解压缩的预构建 Inception 模型。 但是对于您自己的特定图像分类任务,您可以像通过第 2 章,*使用*通过迁移学习对图像进行分类一样,提供通过迁移学习重新训练的模型。 ]参数在运行两个示例应用程序时。
通常,语音是 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 源并进行构建。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册