提交 1bcba9e2 编写于 作者: W wizardforcel

2020-12-06 13:13:23

上级 481076e7
......@@ -684,7 +684,7 @@ for i, (action, state) in enumerate(result.path()):
图 12:迷宫问题的示例
**#**符号表示障碍物。 *`o`* 代表起点, *`x`* 代表目标。 目的是找到从起点到终点的最短路径。 让我们看看如何在 Python 中做到这一点。 以下解决方案是`simpleai`库中提供的解决方案的变体。 创建一个新的 Python 文件并导入以下软件包:
**#**符号表示障碍物。`o`代表起点,`x`代表目标。 目的是找到从起点到终点的最短路径。 让我们看看如何在 Python 中做到这一点。 以下解决方案是`simpleai`库中提供的解决方案的变体。 创建一个新的 Python 文件并导入以下软件包:
```py
import math
......@@ -894,7 +894,7 @@ if __name__ == "__main__":
图 13:迷宫问题的解决方案
如您所见,算法留下了一点点的痕迹,并找到了从起点 *`o`* 到终点 *`x`* 的解。 至此,本章最后部分总结了 A *算法 ithm 的恶魔处理。
如您所见,算法留下了一点点的痕迹,并找到了从起点`o`到终点`x`的解。 至此,本章最后部分总结了 A *算法 ithm 的恶魔处理。
# 摘要
......
......@@ -1071,11 +1071,11 @@ if __name__ == '__main__':
图 13:ABCD 区域
如果要计算此图像中矩形 **ABCD** 的总和,则无需遍历该矩形区域中的每个像素。 假设 **OC** 表示由矩形的左上角 *`O`* 和矩形的对角相对角点 *`C`* 形成的矩形区域。 要计算矩形 **ABCD** 的面积,我们可以使用以下公式:
如果要计算此图像中矩形 **ABCD** 的总和,则无需遍历该矩形区域中的每个像素。 假设 **OC** 表示由矩形的左上角`O`和矩形的对角相对角点`C`形成的矩形区域。 要计算矩形 **ABCD** 的面积,我们可以使用以下公式:
*矩形 ABCD 的面积= OC –(OB + OD – OA)*
这个公式有何特别之处? 如果您注意到了,我们不必进行任何迭代或重新计算任何矩形区域。 等式右侧的所有值均已可用,因为它们是在较早的循环中计算的。 我们直接使用它们来计算此矩形的面积。 我们有效地做的是考虑一个较大的矩形,其中 *`O`**`C`* 代表相对的对角线,然后我们“切出”白色部分以仅留下蓝色区域。 考虑到这一点,让我们看看如何构建一个面部检测器。
这个公式有何特别之处? 如果您注意到了,我们不必进行任何迭代或重新计算任何矩形区域。 等式右侧的所有值均已可用,因为它们是在较早的循环中计算的。 我们直接使用它们来计算此矩形的面积。 我们有效地做的是考虑一个较大的矩形,其中`O``C`代表相对的对角线,然后我们“切出”白色部分以仅留下蓝色区域。 考虑到这一点,让我们看看如何构建一个面部检测器。
创建一个新的 Python 文件并导入以下软件包:
......
......@@ -160,7 +160,7 @@ plt.show()
图 3:训练误差图
我们可以从前面的屏幕截图中观察到,在第四个时期结束时,错误降至 *`0`* ,这正是我们想要发生的情况。 如果错误为 *`0`* ,则无法进一步改善。 在下一部分中,我们将增强模型并创建单层神经 网络。
我们可以从前面的屏幕截图中观察到,在第四个时期结束时,错误降至`0`,这正是我们想要发生的情况。 如果错误为`0`,则无法进一步改善。 在下一部分中,我们将增强模型并创建单层神经 网络。
# 构建单层神经网络
......
......@@ -398,4 +398,4 @@ Neo4j 用 Java 实现,并通过交易 HTTP 端点或二进制“螺栓”协
对于当今机器学习中存在的所有令人惊奇和令人兴奋的应用程序,我们坚信,我们只是在探索一切可能的事物。 我们衷心希望您能更好地掌握机器学习中涉及的概念,但更重要的是,我们希望您的好奇心得到激发,这本书激发您毕生对这种美丽事物的兴趣。 话题。
我们很高兴看到您使用本章和本书中所包含的知识做什么。 希望您发现这本书引人入胜,有趣并且有用。 我们希望您阅读和阅读时一样开心。 我们希望您在所有努力中继续取得成功。
\ No newline at end of file
我们很高兴看到您使用本章,本书中所包含的知识做什么。 希望您发现这本书引人入胜,有趣并且有用。 我们希望您阅读和阅读时一样开心。 我们希望您在所有努力中继续取得成功。
\ No newline at end of file
......@@ -30,23 +30,23 @@
[第 1 章](../Text/1.html)*生成对抗网络* 的介绍始于 GAN 的概念。 读者将学习什么是判别器,什么是生成器以及什么是博弈论。 接下来的几个主题将涵盖生成器的结构,鉴别器的结构,生成器和鉴别器的目标函数,GAN 的训练算法,Kullback-Leibler 和 Jensen-Shannon 发散,GAN 的评估矩阵,GAN 的不同问题, GAN 中梯度消失和爆炸,纳什均衡,批量归一化和正则化的问题。
第 1 章,*生成对抗网络* 的介绍始于 GAN 的概念。 读者将学习什么是判别器,什么是生成器以及什么是博弈论。 接下来的几个主题将涵盖生成器的结构,鉴别器的结构,生成器和鉴别器的目标函数,GAN 的训练算法,Kullback-Leibler 和 Jensen-Shannon 发散,GAN 的评估矩阵,GAN 的不同问题, GAN 中梯度消失和爆炸,纳什均衡,批量归一化和正则化的问题。
[第 2 章](../Text/2.html) *3D-GAN –使用 GAN 生成形状* 首先简要介绍 3D-GAN 和各种架构细节。 在本章中,我们将训练 3D-GAN 生成真实世界的 3D 形状。 我们编写代码来收集 3D Shapenet 数据集,对其进行清理并使其经过培训。 然后,我们将使用 Keras 深度学习库为 3D-GAN 编写代码。
第 2 章, *3D-GAN –使用 GAN 生成形状* 首先简要介绍 3D-GAN 和各种架构细节。 在本章中,我们将训练 3D-GAN 生成真实世界的 3D 形状。 我们编写代码来收集 3D Shapenet 数据集,对其进行清理并使其经过培训。 然后,我们将使用 Keras 深度学习库为 3D-GAN 编写代码。
[第 3 章](../Text/3.html)*使用条件 GAN 进行人脸老化* ,向读者介绍了条件生成对抗网络(cGAN)和 Age-cGAN。 我们将学习数据准备中的不同步骤,例如下载,清理和格式化数据。 我们将使用 IMDb Wiki 图像数据集。 我们将使用 Keras 框架为 Age-cGAN 编写代码。 接下来,我们将在 IMDb Wiki 图像数据集上训练网络。 最后,我们将使用年龄作为条件参数的训练模型来生成图像,而训练后的模型将针对不同年龄的人的脸部生成图像。
第 3 章,*使用条件 GAN 进行人脸老化* ,向读者介绍了条件生成对抗网络(cGAN)和 Age-cGAN。 我们将学习数据准备中的不同步骤,例如下载,清理和格式化数据。 我们将使用 IMDb Wiki 图像数据集。 我们将使用 Keras 框架为 Age-cGAN 编写代码。 接下来,我们将在 IMDb Wiki 图像数据集上训练网络。 最后,我们将使用年龄作为条件参数的训练模型来生成图像,而训练后的模型将针对不同年龄的人的脸部生成图像。
[第 4 章](../Text/4.html)*使用 DCGAN 生成动漫角色* 从 DCGAN 的介绍开始。 我们将学习数据准备中的不同步骤,例如收集动漫角色数据集,清理数据集并准备进行训练。 我们将在 Jupyter Notebook 中介绍 DCGAN 的 Keras 实现。 接下来,我们将学习训练 DCGAN 的不同方法,并为其选择不同的超参数。 最后,我们将使用训练有素的模型生成动漫角色。 另外,我们将讨论 DCGAN 的实际应用。
第 4 章,*使用 DCGAN 生成动漫角色* 从 DCGAN 的介绍开始。 我们将学习数据准备中的不同步骤,例如收集动漫角色数据集,清理数据集并准备进行训练。 我们将在 Jupyter Notebook 中介绍 DCGAN 的 Keras 实现。 接下来,我们将学习训练 DCGAN 的不同方法,并为其选择不同的超参数。 最后,我们将使用训练有素的模型生成动漫角色。 另外,我们将讨论 DCGAN 的实际应用。
[第 5 章](../Text/5.html)*使用 SRGAN 生成逼真的图像* 解释了如何训练 SRGAN 生成逼真的图像。 训练过程的第一步是收集数据集,然后清理它并格式化以进行训练。 读者将学习从何处收集数据集,如何清理数据集以及如何将其转换为可用于培训的格式。
第 5 章,*使用 SRGAN 生成逼真的图像* 解释了如何训练 SRGAN 生成逼真的图像。 训练过程的第一步是收集数据集,然后清理它并格式化以进行训练。 读者将学习从何处收集数据集,如何清理数据集以及如何将其转换为可用于培训的格式。
[第 6 章](../Text/6.html)*StackGAN –文本到逼真的图像合成* ,本章将首先介绍 StackGAN。 数据收集和数据准备是重要的步骤,我们将学习收集数据集,清理数据集并格式化以进行培训的过程。 我们将在 Jupyter Notebook 内的 Keras 中为 StackGAN 编写代码。 接下来,我们将在 CUB 数据集上训练网络。 最后,在完成模型训练后,我们将从文本描述中生成逼真的图像。 我们将讨论 StackGAN 的不同行业应用以及如何在生产中部署它们。
第 6 章*StackGAN –文本到逼真的图像合成* ,本章将首先介绍 StackGAN。 数据收集和数据准备是重要的步骤,我们将学习收集数据集,清理数据集并格式化以进行培训的过程。 我们将在 Jupyter Notebook 内的 Keras 中为 StackGAN 编写代码。 接下来,我们将在 CUB 数据集上训练网络。 最后,在完成模型训练后,我们将从文本描述中生成逼真的图像。 我们将讨论 StackGAN 的不同行业应用以及如何在生产中部署它们。
[第 7 章](../Text/7.html)*CycleGAN –将绘画变成照片* ,介绍了如何训练 CycleGAN 以 将画作变成照片。 我们将首先介绍 CycleGAN,并研究它们的不同应用。 我们将介绍不同的数据收集,数据清理和数据格式化技术。 接下来,我们将编写 CycleGAN 的 Keras 实现,并在 Jupyter Notebook 中获得有关代码的详细说明。 我们将在准备好的数据集上训练 CycleGAN。 我们将测试我们训练有素的模型,以将绘画转换为照片。 最后,我们看一下 CycleGAN 的实际应用。
第 7 章*CycleGAN –将绘画变成照片* ,介绍了如何训练 CycleGAN 以 将画作变成照片。 我们将首先介绍 CycleGAN,并研究它们的不同应用。 我们将介绍不同的数据收集,数据清理和数据格式化技术。 接下来,我们将编写 CycleGAN 的 Keras 实现,并在 Jupyter Notebook 中获得有关代码的详细说明。 我们将在准备好的数据集上训练 CycleGAN。 我们将测试我们训练有素的模型,以将绘画转换为照片。 最后,我们看一下 CycleGAN 的实际应用。
[第 8 章](../Text/8.html)*条件 GAN –使用条件对抗网络* 进行图像到图像的翻译,介绍了如何训练条件 GAN 进行图像到图像的翻译。 我们将首先介绍条件 GAN 和不同的数据准备技术,例如数据收集,数据清理和数据格式化。 接下来,我们将在 Jupyter Notebook 的 Keras 中编写条件 GAN 的代码。 接下来,我们学习如何在已经准备好的数据集上训练条件 GAN。 我们将探索不同的超参数进行训练。 最后,我们将测试条件 GAN,并讨论实际应用中图像到图像转换的不同用例。
第 8 章*条件 GAN –使用条件对抗网络* 进行图像到图像的翻译,介绍了如何训练条件 GAN 进行图像到图像的翻译。 我们将首先介绍条件 GAN 和不同的数据准备技术,例如数据收集,数据清理和数据格式化。 接下来,我们将在 Jupyter Notebook 的 Keras 中编写条件 GAN 的代码。 接下来,我们学习如何在已经准备好的数据集上训练条件 GAN。 我们将探索不同的超参数进行训练。 最后,我们将测试条件 GAN,并讨论实际应用中图像到图像转换的不同用例。
[第 9 章](../Text/9.html)*预测 GAN 的未来*,是最后一章。 在介绍了 GAN 的基础知识并完成了六个项目之后,本章将使读者了解 GAN 的未来。 在这里,我们将研究在过去的 3-4 年中,GAN 的采用取得了惊人的成就,以及该行业对它的接受程度。 我还将讨论我对 GAN 未来的个人看法。
第 9 章*预测 GAN 的未来*,是最后一章。 在介绍了 GAN 的基础知识并完成了六个项目之后,本章将使读者了解 GAN 的未来。 在这里,我们将研究在过去的 3-4 年中,GAN 的采用取得了惊人的成就,以及该行业对它的接受程度。 我还将讨论我对 GAN 未来的个人看法。
......
......@@ -229,7 +229,7 @@ The architecture of the discriminator network
在前面的等式中,![](img/a86a4cb0-47d0-4123-8c40-207579ac79c4.png)是鉴别器模型,![](img/692e8b22-1448-49a9-8d2e-6ccfcba6e5b3.png)是生成器模型,![](img/1cf58b02-f255-4082-8b3a-1db3bf0ac832.png)是实际数据分布,![](img/8cdff081-d911-4e9a-80c3-fa21211eb3bb.png)是生成器生成的数据的分布,![](img/39400e6f-0df8-46a1-b80c-17516e3c6adf.png)是 预期的输出。
在训练期间, *`D`***鉴别器**)想要使整个输出最大化,而 G(生成器)希望使整个输出最小化,从而训练 GAN 达到平衡 生成器和鉴别器网络。 当它达到平衡时,我们说模型已经收敛。 这个平衡就是纳什平衡。 训练完成后,我们将获得一个生成器模型,该模型能够生成逼真的图像。
在训练期间,`D`**鉴别器**)想要使整个输出最大化,而 G(生成器)希望使整个输出最小化,从而训练 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 章](../Text/3.html)和*使用条件 GAN* **进行面部老化,以学习如何使用 DCGAN 生成**动漫 ch 动漫面孔。
Alec Radford,Luke Metz 和 Soumith Chintala 在名为*深度卷积生成对抗网络*的无监督表示学习*中提出了**深层卷积 GAN**(**DCGAN**),[可通过以下链接获得](https://arxiv.org/pdf/1511.06434.pdf) 。 香草 GAN 通常在其网络中没有**卷积神经网络**(**CNN**)。 这是在 DCGAN 的引入下首次提出的。 我们将在第 3 章,*使用条件 GAN* **进行面部老化,以学习如何使用 DCGAN 生成**动漫 ch 动漫面孔。
......@@ -315,7 +315,7 @@ Alec Radford,Luke Metz 和 Soumith Chintala 在名为*深度卷积生成对抗
StackGAN 由 Han Zhang,Tao Xu,Li Hongsheng Li 等人在其题为*的论文中提出。StackGAN:使用堆叠式生成对抗网络*进行文本到照片般逼真的图像合成,[可从以下链接获得](https://arxiv.org/pdf/1612.03242.pdf)。 他们使用 StackGAN 来探索文本到图像的合成,并获得了令人印象深刻的结果。 StackGAN 是一对网络,当提供文本描述时,它们会生成逼真的图像。 我们将在[第 6 章](../Text/6.html)*StackGAN –文本到真实图像的图像合成中,学习如何使用 StackGAN 从文本描述生成逼真的图像。*
StackGAN 由 Han Zhang,Tao Xu,Li Hongsheng Li 等人在其题为*的论文中提出。StackGAN:使用堆叠式生成对抗网络*进行文本到照片般逼真的图像合成,[可从以下链接获得](https://arxiv.org/pdf/1612.03242.pdf)。 他们使用 StackGAN 来探索文本到图像的合成,并获得了令人印象深刻的结果。 StackGAN 是一对网络,当提供文本描述时,它们会生成逼真的图像。 我们将在第 6 章*StackGAN –文本到真实图像的图像合成中,学习如何使用 StackGAN 从文本描述生成逼真的图像。*
......@@ -325,7 +325,7 @@ StackGAN 由 Han Zhang,Tao Xu,Li Hongsheng Li 等人在其题为*的论文
CycleGAN 由朱俊彦,Taesung Park,Phillip Isola 和 Alexei A. Efros 在题为*使用循环一致对抗网络*的不成对图像到图像翻译的论文中提出。 [在以下链接中](https://arxiv.org/pdf/1703.10593)。 CycleGAN 具有一些非常有趣的潜在用途,例如将照片转换为绘画,反之亦然,将夏天拍摄的照片转换为冬天,反之亦然,或者将马的图像转换为斑马的图像,反之亦然。 我们将在[第 7 章](../Text/7.html)*CycleGAN-将绘画变成照片*中学习如何使用 CycleGAN 将绘画变成照片。
CycleGAN 由朱俊彦,Taesung Park,Phillip Isola 和 Alexei A. Efros 在题为*使用循环一致对抗网络*的不成对图像到图像翻译的论文中提出。 [在以下链接中](https://arxiv.org/pdf/1703.10593)。 CycleGAN 具有一些非常有趣的潜在用途,例如将照片转换为绘画,反之亦然,将夏天拍摄的照片转换为冬天,反之亦然,或者将马的图像转换为斑马的图像,反之亦然。 我们将在第 7 章*CycleGAN-将绘画变成照片*中学习如何使用 CycleGAN 将绘画变成照片。
......@@ -335,7 +335,7 @@ CycleGAN 由朱俊彦,Taesung Park,Phillip Isola 和 Alexei A. Efros 在题
3D-GAN 由 Wu Jiajun Wu,Zhengkai Zhang,薛天凡,William T. Freeman 和 Joshua B. Tenenbaum 在其名为*的论文中提出,该论文通过 3D 生成-专家对模型学习概率形状的对象形状*[可通过以下链接获得](https://arxiv.org/pdf/1610.07584)。 在制造业和 3D 建模行业中,生成对象的 3D 模型具有许多用例。 一旦在对象的 3D 模型上进行训练,3D-GAN 网络便能够生成不同对象的新 3D 模型。 我们将在[第 2 章](../Text/2.html) *3D-GAN-使用* GAN 生成形状中学习如何使用 3D-GAN 生成对象的 3D 模型。
3D-GAN 由 Wu Jiajun Wu,Zhengkai Zhang,薛天凡,William T. Freeman 和 Joshua B. Tenenbaum 在其名为*的论文中提出,该论文通过 3D 生成-专家对模型学习概率形状的对象形状*[可通过以下链接获得](https://arxiv.org/pdf/1610.07584)。 在制造业和 3D 建模行业中,生成对象的 3D 模型具有许多用例。 一旦在对象的 3D 模型上进行训练,3D-GAN 网络便能够生成不同对象的新 3D 模型。 我们将在第 2 章, *3D-GAN-使用* GAN 生成形状中学习如何使用 3D-GAN 生成对象的 3D 模型。
......@@ -345,7 +345,7 @@ CycleGAN 由朱俊彦,Taesung Park,Phillip Isola 和 Alexei A. Efros 在题
有条件 GAN 的面部老化由 Grigory Antipov,Moez Baccouche 和 Jean-Luc Dugelay 在他们的题为*有条件的通用对抗网络*的面部老化的论文中提出,[可通过以下链接获得](https://arxiv.org/pdf/1702.01983.pdf)。 面部老化具有许多行业用例,包括跨年龄的面部识别,寻找迷路的孩子以及娱乐。 我们将在[第 3 章](../Text/3.html)*使用条件 GAN* 进行面部衰老中,学习如何训练条件 GAN 生成给定目标年龄的人脸。
有条件 GAN 的面部老化由 Grigory Antipov,Moez Baccouche 和 Jean-Luc Dugelay 在他们的题为*有条件的通用对抗网络*的面部老化的论文中提出,[可通过以下链接获得](https://arxiv.org/pdf/1702.01983.pdf)。 面部老化具有许多行业用例,包括跨年龄的面部识别,寻找迷路的孩子以及娱乐。 我们将在第 3 章*使用条件 GAN* 进行面部衰老中,学习如何训练条件 GAN 生成给定目标年龄的人脸。
......
......@@ -24,7 +24,7 @@
**3D 生成对抗网络****3D-GAN**)是 GAN 的变体,就像 StackGAN,CycleGAN 和 *`S`* **上层分辨率一样 生成对抗网络****SRGAN**)。 与香草 GAN 相似,它具有生成器和鉴别器模型。 这两个网络都使用 3D 卷积层,而不是使用 2D 卷积。 如果提供足够的数据,它可以学习生成具有良好视觉质量的 3D 形状。
**3D 生成对抗网络****3D-GAN**)是 GAN 的变体,就像 StackGAN,CycleGAN 和`S`**上层分辨率一样 生成对抗网络****SRGAN**)。 与香草 GAN 相似,它具有生成器和鉴别器模型。 这两个网络都使用 3D 卷积层,而不是使用 2D 卷积。 如果提供足够的数据,它可以学习生成具有良好视觉质量的 3D 形状。
在仔细查看 3D-GAN 网络之前,让我们了解 3D 卷积。
......
......@@ -1571,7 +1571,7 @@ tensorboard.set_model(embedding_compressor_model)
训练模型需要几个步骤:
1. 用真实和假标签创建两个张量。 在训练生成器和鉴别器时将需要这些。 使用标签平滑处理,该内容在[第 1 章](../Text/1.html)*生成对抗网络*中介绍:
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 章](../Text/1.html)*生成对抗网络* 对此进行了介绍:
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
......
......@@ -75,7 +75,7 @@ CycleGAN 总体上由两种体系结构组成:生成器和鉴别器。 生成
让我们逐一介绍每个组件:
* **卷积块**:卷积块包含 2D 卷积层,然后是实例规范化层和 relu 作为激活函数。 请参阅[第 1 章](../Text/1.html)*生成对抗网络简介* ,以了解有关*实例规范化*的更多信息。
* **卷积块**:卷积块包含 2D 卷积层,然后是实例规范化层和 relu 作为激活函数。 请参阅第 1 章*生成对抗网络简介* ,以了解有关*实例规范化*的更多信息。
生成器网络包含三个卷积块,其配置如下:
......
......@@ -25,7 +25,7 @@ Pix2pix 是一种**生成对抗网络**(**GAN**),用于图像到图像的
Pix2pix 是条件 GAN 的变体。 我们已经在 [第 3 章](../Text/3.html)*中使用条件 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 的体系结构开始。
......
......@@ -24,23 +24,23 @@
[第 1 章](../Text/01.html)*无监督学习入门* 从非常务实的角度介绍了机器学习和数据科学。 讨论了主要概念,并显示了一些简单的示例,特别关注了无监督问题结构。
第 1 章,*无监督学习入门* 从非常务实的角度介绍了机器学习和数据科学。 讨论了主要概念,并显示了一些简单的示例,特别关注了无监督问题结构。
[第 2 章](../Text/02.html)*聚类基础知识* 开始研究聚类算法。 分析了最常见的方法和评估指标,并给出了具体示例,这些示例演示了如何从不同的角度调整超参数和评估性能。
第 2 章*聚类基础知识* 开始研究聚类算法。 分析了最常见的方法和评估指标,并给出了具体示例,这些示例演示了如何从不同的角度调整超参数和评估性能。
[第 3 章](../Text/03.html)*高级聚类* *和*讨论了一些更复杂的算法。 [第 2 章](../Text/02.html)*聚类基础知识*中分析的许多问题都使用更强大,更灵活的方法进行了重新评估,只要基本算法的性能不符合要求,就可以轻松采用这些方法。 。
第 3 章,*高级聚类* *和*讨论了一些更复杂的算法。 第 2 章*聚类基础知识*中分析的许多问题都使用更强大,更灵活的方法进行了重新评估,只要基本算法的性能不符合要求,就可以轻松采用这些方法。 。
[第 4 章](../Text/04.html)*分层聚类在起作用* 完全致力于可以根据特定标准计算完整聚类层次的一系列算法。 分析了最常见的策略,以及可以提高方法有效性的特定性能指标和算法变体。
第 4 章*分层聚类在起作用* 完全致力于可以根据特定标准计算完整聚类层次的一系列算法。 分析了最常见的策略,以及可以提高方法有效性的特定性能指标和算法变体。
[第 5 章](../Text/05.html)*软聚类和高斯混合模型* 着重介绍了几种著名的软聚类算法,特别着重于高斯混合,这允许定义生成式 模型在相当合理的假设下。
第 5 章*软聚类和高斯混合模型* 着重介绍了几种著名的软聚类算法,特别着重于高斯混合,这允许定义生成式 模型在相当合理的假设下。
[第 6 章](../Text/06.html)*异常检测* 讨论了无监督学习的一种特殊应用:新颖性和异常检测。 目的是分析一些可以有效使用的常用方法,以了解新样本是否可以被视为有效样本,还是需要特别注意的异常样本。
第 6 章,*异常检测* 讨论了无监督学习的一种特殊应用:新颖性和异常检测。 目的是分析一些可以有效使用的常用方法,以了解新样本是否可以被视为有效样本,还是需要特别注意的异常样本。
[第 7 章](../Text/07.html)*降维和成分分析,*涵盖了降维,成分分析和字典学习的最常用和最有效的方法。 这些示例说明了如何在不同的特定情况下有效地执行此类操作。
第 7 章*降维和成分分析,*涵盖了降维,成分分析和字典学习的最常用和最有效的方法。 这些示例说明了如何在不同的特定情况下有效地执行此类操作。
[第 8 章](../Text/08.html)*无监督神经网络模型* 讨论了一些非常重要的无监督神经模型。 特别地,焦点既针对可以学习通用数据生成过程的结构的网络,又针对执行降维。
第 8 章*无监督神经网络模型* 讨论了一些非常重要的无监督神经模型。 特别地,焦点既针对可以学习通用数据生成过程的结构的网络,又针对执行降维。
[第 9 章](../Text/09.html)*生成对抗网络和 SOM* 继续分析一些深层神经网络,这些神经网络可以学习数据生成过程的结构并输出从这些过程中提取的新样本。 此外,讨论了一种特殊的网络(SOM),并显示了一些实际示例。
第 9 章*生成对抗网络和 SOM* 继续分析一些深层神经网络,这些神经网络可以学习数据生成过程的结构并输出从这些过程中提取的新样本。 此外,讨论了一种特殊的网络(SOM),并显示了一些实际示例。
......
......@@ -45,13 +45,13 @@
如我们在[第 1 章](../Text/01.html)*无监督学习*入门中所述,聚类分析的主要目标是根据相似性度量或接近性标准对数据集的元素进行分组。 在本章的第一部分中,我们将专注于前一种方法,而在第二部分和下一章中,我们将分析利用数据集其他几何特征的更多通用方法。
如我们在第 1 章,*无监督学习*入门中所述,聚类分析的主要目标是根据相似性度量或接近性标准对数据集的元素进行分组。 在本章的第一部分中,我们将专注于前一种方法,而在第二部分和下一章中,我们将分析利用数据集其他几何特征的更多通用方法。
让我们进行一个数据生成过程 *p <sub class="calibre20">数据</sub>(x)*,并从中抽取`N`个样本:
![](img/165e5351-6d27-4a0d-be73-bf40c3d8df31.png)
可以假设 *p <sub class="calibre20">数据</sub>(x)*的概率空间可划分为包含`K`的(可能无限)配置(对于 *K = 1 ,2,...,*区域,这样 *p <sub class="calibre20">数据</sub>(x; k)*表示样本属于簇`k`的概率。 以这种方式,我们指出,当确定 *p <sub class="calibre20">数据</sub>(x)*时,每个可能的聚类结构已经存在。 可以对聚类概率分布做出进一步的假设,以更好地近似 *p <sub class="calibre20">数据</sub>(x)*(我们将在[第 5 章](../Text/05.html)[HTG24 软聚类和高斯混合模型)。 但是,当我们尝试将概率空间(和相应的样本)划分为内聚组时,我们可以假设两种可能的策略:
可以假设 *p <sub class="calibre20">数据</sub>(x)*的概率空间可划分为包含`K`的(可能无限)配置(对于 *K = 1 ,2,...,*区域,这样 *p <sub class="calibre20">数据</sub>(x; k)*表示样本属于簇`k`的概率。 以这种方式,我们指出,当确定 *p <sub class="calibre20">数据</sub>(x)*时,每个可能的聚类结构已经存在。 可以对聚类概率分布做出进一步的假设,以更好地近似 *p <sub class="calibre20">数据</sub>(x)*(我们将在第 5 章,[HTG24 软聚类和高斯混合模型)。 但是,当我们尝试将概率空间(和相应的样本)划分为内聚组时,我们可以假设两种可能的策略:
* **硬聚类**:在这种情况下,每个样本 *x <sub class="calibre20">p</sub> ∈X* 被分配给一个聚类 *K <sub class="calibre20">i</sub>* 对于 *i≠j* , *K <sub class="calibre20">i</sub> ∩K <sub class="calibre20">j</sub> =∅*。 我们将要讨论的大多数算法都属于这一类。 在这种情况下,问题可以表示为将聚类分配给每个输入样本的参数化函数:
......@@ -507,7 +507,7 @@ print('Completeness: {}'.format(completeness_score(kmdff['diagnosis'], kmdff['pr
Completeness: 0.5168089972809706
```
该结果证实,对于 *K = 2* ,K-均值不能完美地分离聚类,因为如我们所见,因为某些恶性样本被错误地分配给包含大量 大多数良性样本。 但是,由于`c`并不是非常小,因此我们可以确保将这两个类别的大多数样本分配给了不同的群集。 邀请读者使用其他方法(在[第 3 章](../Text/03.html)*高级聚类*中讨论)检查该值,并提供不同结果的简要说明。
该结果证实,对于 *K = 2* ,K-均值不能完美地分离聚类,因为如我们所见,因为某些恶性样本被错误地分配给包含大量 大多数良性样本。 但是,由于`c`并不是非常小,因此我们可以确保将这两个类别的大多数样本分配给了不同的群集。 邀请读者使用其他方法(在第 3 章*高级聚类*中讨论)检查该值,并提供不同结果的简要说明。
......@@ -612,8 +612,8 @@ Adj. Mutual info: 0.42151741598216214
**调整后的兰德评分**是真实标签分布与预测标签之间差异的量度。 为了对其进行计算,必须按以下方式定义数量:
* *`a`* :用相同的真实标签*表示样本对的数量( *x <sub class="calibre20">i</sub> ,x <sub class="calibre20">j</sub>* )(y <sub class="calibre20">i</sub> ,y <sub class="calibre20">j</sub> ):y <sub class="calibre20">i</sub> = y <sub class="calibre20">j</sub>* 并分配给同一集群 *K <sub class="calibre20">c</sub>*
* *`b`* :R 代表样本对的数量(`x`*<sub class="calibre20">i</sub> ,x <sub class="calibre20">j</sub>* ),带有不同的真实标签*(y* *<sub class="calibre20">i</sub> ,y <sub class="calibre20">j</sub> ):y <sub class="calibre20">i</sub> ≠y <sub class="calibre20">j</sub>* 并分配给不同的集群`K`*<sub class="calibre20">c</sub>**K <sub class="calibre20">d</sub>**c≠d*
* `a`:用相同的真实标签*表示样本对的数量( *x <sub class="calibre20">i</sub> ,x <sub class="calibre20">j</sub>* )(y <sub class="calibre20">i</sub> ,y <sub class="calibre20">j</sub> ):y <sub class="calibre20">i</sub> = y <sub class="calibre20">j</sub>* 并分配给同一集群 *K <sub class="calibre20">c</sub>*
* `b`:R 代表样本对的数量(`x`*<sub class="calibre20">i</sub> ,x <sub class="calibre20">j</sub>* ),带有不同的真实标签*(y* *<sub class="calibre20">i</sub> ,y <sub class="calibre20">j</sub> ):y <sub class="calibre20">i</sub> ≠y <sub class="calibre20">j</sub>* 并分配给不同的集群`K`*<sub class="calibre20">c</sub>**K <sub class="calibre20">d</sub>**c≠d*
如果存在 *M 个*值,则使用具有 *k = 2* 的二项式系数获得二进制组合的总数,因此,差异的初始度量为:
......@@ -673,7 +673,7 @@ Graphical representation of the contingency matrix
**K 最近邻居** *`K`* NN)是属于称为**基于实例的学习**类别的方法。 在这种情况下,没有参数化模型,而是样本的重新排列以加快特定查询的速度。 在最简单的情况下(也称为蛮力搜索),假设我们有一个`X`数据集,其中包含`M`个样本 *x <sub class="calibre20">i</sub> ∈ℜ[ <sup class="calibre27">N</sup>* 。 给定距离函数 *d(x <sub class="calibre20">i</sub> ,x <sub class="calibre20">j</sub> )*,则可以定义测试样品的半径邻域 *x <sub class="calibre20">i</sub>* 如下:
**K 最近邻居**`K`NN)是属于称为**基于实例的学习**类别的方法。 在这种情况下,没有参数化模型,而是样本的重新排列以加快特定查询的速度。 在最简单的情况下(也称为蛮力搜索),假设我们有一个`X`数据集,其中包含`M`个样本 *x <sub class="calibre20">i</sub> ∈ℜ[ <sup class="calibre27">N</sup>* 。 给定距离函数 *d(x <sub class="calibre20">i</sub> ,x <sub class="calibre20">j</sub> )*,则可以定义测试样品的半径邻域 *x <sub class="calibre20">i</sub>* 如下:
![](img/539ec0a2-ed36-460b-818d-07dd652d1fc2.png)
......@@ -834,7 +834,7 @@ Y_qv = np.argmin(distances, axis=1)
Final configuration of the quantization vectors (left). Influence area of each quantization vector (right)
正如预期的那样,量化矢量已达到最终配置,其中每个量化矢量都代表数据集的一小部分(如右图所示)。 在这一点上,给定一个点,最接近的向量将代表它。 有趣的是,全局方差并未受到影响,但是,选择任何子集后,内部方差会大大降低。 向量的相对位置反映了数据集的密度,因为区域中的*更多样本吸引了更多向量*。 这样,通过构建距离矩阵,可以获得粗略的密度估计(例如,当向量与向量的近邻的平均距离较高时,意味着底层区域的密度较小)。 我们将在[第 6 章](../Text/06.html)*异常检测*中更详细地讨论此主题。
正如预期的那样,量化矢量已达到最终配置,其中每个量化矢量都代表数据集的一小部分(如右图所示)。 在这一点上,给定一个点,最接近的向量将代表它。 有趣的是,全局方差并未受到影响,但是,选择任何子集后,内部方差会大大降低。 向量的相对位置反映了数据集的密度,因为区域中的*更多样本吸引了更多向量*。 这样,通过构建距离矩阵,可以获得粗略的密度估计(例如,当向量与向量的近邻的平均距离较高时,意味着底层区域的密度较小)。 我们将在第 6 章*异常检测*中更详细地讨论此主题。
现在让我们考虑一个示例,该示例具有一个代表浣熊图片的单个样本。 由于过程可能很长,因此第一步是加载示例 RGB 图像(由 SciPy 提供)并将其大小调整为 192×256,如下所示:
......
......@@ -70,7 +70,7 @@ Example of a graph: Point x<sub class="calibre26">0</sub> is the only one that i
Bidimensional RBFs as functions of the distance between x and 0 computed for γ = 0.1, 1.0, and 5.0
*γ= 0.1* 时, *x = 1* (相对于 0.0)的权重约为 0.9。 对于*γ= 1.0* ,该值约为 0.5;对于*γ= 5.0* ,该值几乎为零。 因此,在调整频谱聚类模型时,考虑*γ*的不同值并选择产生最佳性能的值(例如,使用[第 2 章](../Text/02.html)*聚类基础知识*)。 一旦创建了图,就可以使用对称**亲和矩阵** *W = {w <sub class="calibre20">ij</sub> }* 来表示。 对于 KNN *,W* 通常比较稀疏,可以使用专门的库进行有效地存储和操作。 相反,对于 RBF,它始终是密集的,并且如果 *X∈ <sup class="calibre27">N×M</sup>* ,则它需要存储 *N <sup class="calibre27">2</sup>* 值 。
*γ= 0.1* 时, *x = 1* (相对于 0.0)的权重约为 0.9。 对于*γ= 1.0* ,该值约为 0.5;对于*γ= 5.0* ,该值几乎为零。 因此,在调整频谱聚类模型时,考虑*γ*的不同值并选择产生最佳性能的值(例如,使用第 2 章*聚类基础知识*)。 一旦创建了图,就可以使用对称**亲和矩阵** *W = {w <sub class="calibre20">ij</sub> }* 来表示。 对于 KNN *,W* 通常比较稀疏,可以使用专门的库进行有效地存储和操作。 相反,对于 RBF,它始终是密集的,并且如果 *X∈ <sup class="calibre27">N×M</sup>* ,则它需要存储 *N <sup class="calibre27">2</sup>* 值 。
不难证明到目前为止我们分析过的程序等同于将`X`分割为多个内聚区域。 实际上,让我们考虑例如具有通过 KNN 获得的亲和度矩阵的图`G`。 连接的组件 *C <sub class="calibre20">i</sub>* 是一个子图,其中每对顶点 *x <sub class="calibre20">a</sub>**x <sub class="calibre20">b</sub> ∈C <sub class="calibre20">i</sub>* 通过属于`C`<sub class="calibre20">`i`</sub> 的顶点的路径连接,并且没有连接任何顶点的边 *C <sub class="calibre20">i</sub>* 的顶点具有不属于 *C <sub class="calibre20">i</sub>* 的顶点。 换句话说,连接的组件是一个内聚子集 *C <sub class="calibre20">i</sub> ![](img/055b1708-309e-409f-ab58-e4017eae690d.png) G* ,它代表群集选择的最佳候选者。 在下图中,有一个从图中提取的连接组件的示例:
......@@ -78,7 +78,7 @@ Bidimensional RBFs as functions of the distance between x and 0 computed for γ
Example of a connected component extracted from a graph
在原始空间中,点 **x <sub class="calibre20">0</sub>****x <sub class="calibre20">2</sub>****x <sub class="calibre20">3</sub> [** 连接到 **x <sub class="calibre20">n</sub>** *`x`* **<sub class="calibre20">m</sub> [***`x`* **<sub class="calibre20">q</sub>****x <sub class="calibre20">1</sub>** 。 这可以表示非常简单的非凸几何,例如半月形。 实际上,在这种情况下,凸度假设对于最佳分离不再是必需的,因为,正如我们将要看到的那样,这些分量被提取并投影到具有平坦几何形状的子空间中(可通过诸如此类的算法轻松管理) 以 K 均值表示)。
在原始空间中,点 **x <sub class="calibre20">0</sub>****x <sub class="calibre20">2</sub>****x <sub class="calibre20">3</sub> [** 连接到 **x <sub class="calibre20">n</sub>**`x`**<sub class="calibre20">m</sub> [**`x`**<sub class="calibre20">q</sub>****x <sub class="calibre20">1</sub>** 。 这可以表示非常简单的非凸几何,例如半月形。 实际上,在这种情况下,凸度假设对于最佳分离不再是必需的,因为,正如我们将要看到的那样,这些分量被提取并投影到具有平坦几何形状的子空间中(可通过诸如此类的算法轻松管理) 以 K 均值表示)。
当使用 KNN 时,此过程更加明显,但是,通常,我们可以说,当区域间距离(例如,两个最近点之间的距离)与平均内部区域相当时,可以合并两个区域 距离。 Shi 和 Malik(在*归一化剪切和图像分割中,J。Shi 和 J. Malik, IEEE Transactions on Pattern Analysis and Machine Intelligence)中提出了解决此问题的最常用方法之一。 ,第 22 卷,* 08/2000),这称为归一化剪切。 整个证明超出了本书的范围,但是我们可以讨论主要概念。 给定一个图,可以构建归一化的图拉普拉斯算子,定义为:
......@@ -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 章](../Text/05.html)*软聚类和高斯混合模型,*[第 6 章](../Text/06.html)*异常检测*中讨论该过程。 出于我们的目的,将问题重构为一个迭代过程,可以更新均值矢量(质心)的位置,直到达到最大值为止。 当质心到达其最终位置时,将使用标准邻域函数将样本分配给每个聚类。
让我们考虑一个数据集 *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)仅采用一个参数,然后计算另一个参数。 考虑到该算法已设计为适用于概率分布,自然的选择是指定所需带宽或让实现检测最佳带宽。 这个过程看起来比施加特定数量的群集更为复杂,但是,在许多实际情况下,尤其是当至少部分地了解了基本事实时,测试不同带宽的结果会更容易。
......@@ -212,7 +212,7 @@ for b in bandwidths:
Mean shift clustering results for different bandwidths
如您所见,带宽的微小差异会导致群集数量不同。 在我们的情况下,最佳值为`h=1.2`,它产生的结果是确定了三个不同的区域(以及一个包含潜在异常值的额外聚类)。 最大聚类的质心大致对应于实际均值,但是聚类的形状与任何高斯分布都不相似。 这是可以通过采用其他方法解决的缺陷(在[第 5 章](https://cdp.packtpub.com/hands_on_unsupervised_learning_with_python/wp-admin/post.php?post=26&action=edit#post_28)*软聚类和高斯混合模型*中进行了讨论)。 实际上,均值偏移适用于局部邻域,并且 *p <sub class="calibre20">数据</sub>* 不被认为属于特定分布。 因此,最终结果是将数据集非常准确地分割为高度密集的区域(注意不再需要最大分隔),这也可以从多个标准分布的叠加中得出。 没有任何先前的假设,我们不能期望结果非常规则,但是,将该算法与 VQ 进行比较,很容易注意到分配是基于找到每个密集 Blob 的最佳代表的想法。 因此,由高斯 *N(μ,Σ)*产生的一些点以低概​​率分配给质心比 *更具代表性的另一个聚类。 μ*
如您所见,带宽的微小差异会导致群集数量不同。 在我们的情况下,最佳值为`h=1.2`,它产生的结果是确定了三个不同的区域(以及一个包含潜在异常值的额外聚类)。 最大聚类的质心大致对应于实际均值,但是聚类的形状与任何高斯分布都不相似。 这是可以通过采用其他方法解决的缺陷(在第 5 章*软聚类和高斯混合模型*中进行了讨论)。 实际上,均值偏移适用于局部邻域,并且 *p <sub class="calibre20">数据</sub>* 不被认为属于特定分布。 因此,最终结果是将数据集非常准确地分割为高度密集的区域(注意不再需要最大分隔),这也可以从多个标准分布的叠加中得出。 没有任何先前的假设,我们不能期望结果非常规则,但是,将该算法与 VQ 进行比较,很容易注意到分配是基于找到每个密集 Blob 的最佳代表的想法。 因此,由高斯 *N(μ,Σ)*产生的一些点以低概​​率分配给质心比 *更具代表性的另一个聚类。 μ*
......@@ -256,11 +256,11 @@ The point x<sub class="calibre26">2</sub> is density-reachable from x<sub class=
假设将聚类算法应用于包含`M`个样本的数据集`X`,以便将其分割为 *n <sub class="calibre20">c</sub>* 聚类[ 由重心*μ <sub class="calibre20">i</sub> 表示的 HTG8 C <sub class="calibre20">i</sub>* i = 1..n <sub class="calibre20">c</sub> 。 我们可以将 *`W`* **ithin-Cluster Dispersion**(**WCD**)定义如下:
假设将聚类算法应用于包含`M`个样本的数据集`X`,以便将其分割为 *n <sub class="calibre20">c</sub>* 聚类[ 由重心*μ <sub class="calibre20">i</sub> 表示的 HTG8 C <sub class="calibre20">i</sub>* i = 1..n <sub class="calibre20">c</sub> 。 我们可以将`W`**ithin-Cluster Dispersion**(**WCD**)定义如下:
![](img/741ff380-397d-4cc0-b3e3-e2386ba5783e.png)
如果 *x <sub class="calibre20">i</sub>*`N`维列向量,则 *X <sub class="calibre20">k</sub> ∈ℜ <sup class="calibre27">N×N</sup>* 。 不难理解, *WCD(k)*编码有关群集的*伪方差*的全局信息。 如果满足最大内聚条件,我们预计质心周围的分散性有限。 另一方面,即使 *WCD(k)*也可能受到包含异常值的单个群集的负面影响。 因此,我们的目标是在每种情况下都将 *WCD(k)*最小化。 以类似的方式,我们可以将 *`B`* **集群间色散****BCD**)定义为:
如果 *x <sub class="calibre20">i</sub>*`N`维列向量,则 *X <sub class="calibre20">k</sub> ∈ℜ <sup class="calibre27">N×N</sup>* 。 不难理解, *WCD(k)*编码有关群集的*伪方差*的全局信息。 如果满足最大内聚条件,我们预计质心周围的分散性有限。 另一方面,即使 *WCD(k)*也可能受到包含异常值的单个群集的负面影响。 因此,我们的目标是在每种情况下都将 *WCD(k)*最小化。 以类似的方式,我们可以将`B`**集群间色散****BCD**)定义为:
![](img/35bb2ca3-fcae-4e7b-9943-107c6e61c69d.png)
......@@ -364,7 +364,7 @@ t-SNE bidimensional representation of the Absenteeism at Work dataset
Evaluation metrics as functions of ε
Silhouette 和 Calinski-Harabasz 均基于凸簇的假设(例如,色散显然是一种假设样本围绕质心呈放射状分布的度量),因此在非凸情况下其期望值通常较小 。 但是,我们要最大化两个分数(剪影→1 和 Calinski-Harabasz →∞),同时避免大量聚类。 考虑到我们的最初目标(寻找以一组特定特征为特征的凝聚聚类),我们选择了 ε= 25 和 Minkowski 度量,其中 *p = 12* , 这会产生合理数量的群集(13)和 22 个噪声点。 在 [第 2 章](../Text/02.html)*聚类基本原理中,* 我们证明了,当 *p→∞*时(但效果 对于 *p > 2* 已经可见),距离趋向于最大的特征差异。
Silhouette 和 Calinski-Harabasz 均基于凸簇的假设(例如,色散显然是一种假设样本围绕质心呈放射状分布的度量),因此在非凸情况下其期望值通常较小 。 但是,我们要最大化两个分数(剪影→1 和 Calinski-Harabasz →∞),同时避免大量聚类。 考虑到我们的最初目标(寻找以一组特定特征为特征的凝聚聚类),我们选择了 ε= 25 和 Minkowski 度量,其中 *p = 12* , 这会产生合理数量的群集(13)和 22 个噪声点。 在 第 2 章*聚类基本原理中,* 我们证明了,当 *p→∞*时(但效果 对于 *p > 2* 已经可见),距离趋向于最大的特征差异。
因此,应该始终通过上下文分析来证明这种选择是合理的。 在这种情况下,我们可以假设每个(非)凸斑点代表一个由特定特征(具有所有其他特征的次要贡献)主导的类别,因此 *p = 12* (导致 17 个簇) 对于中等粗粒度的分析(考虑有 20 个属性),这可能是一个很好的权衡。 此外, *ε= 22.5* 与最高的 Calinski-Harabasz 得分之一 129.3 和轮廓得分约等于 0.2 关联。 特别是,后者的值表示总体聚类是合理正确的,但可能存在重叠。 由于基础几何很可能是非凸的,因此考虑到具有相应峰值的 Calinski-Harabasz 分数,这样的结果是可以接受的(通常在凸形场景中不是这样)。 较大的ε值会产生略高的轮廓分数(小于 0.23),但是所得的簇数和 Calinski-Harbasz 分数均不受所得构型的影响。 必须清楚这一选择尚未得到任何外部证据的证实,必须通过对结果的语义分析加以验证。 如果需要进行细粒度的分析,则可以使用具有更多簇和更多噪声点的配置(因此,读者可以 *用这些值播放* 并提供一个 结果的解释)。 但是,此示例的最终目标仍然是相同的:分割数据集,以便每个群集包含特定的(可能是唯一的)属性。
......@@ -527,7 +527,7 @@ Example of centroid selection (left) and medoid selection (right)
此外,K 质体趋向于*聚集*高度重叠的斑点,斑点的密度具有两个峰值,而 K-means 通常根据手段的位置将整个区域分为两部分。 如果凸几何的假设成立,则通常会接受此行为,但是在其他情况下这可能是一个限制(我们将在示例中展示这种效果)。
最后一个基本差异是公制距离。 由于没有限制,所以 K 型药物或多或少具有攻击性。 正如我们在[第 2 章](../Text/02.html)*聚类基本原理中讨论的那样,*最长的距离由 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 章](../Text/04.html)*层次结构聚类*中进行介绍。 然而,出于我们的目的,最重要的部分涉及数据准备阶段,该阶段基于称为 **聚类****特征特征树**的特定树结构( **CF 树**)。 给定数据集`X`,树的每个节点都由三个元素的元组组成:
该算法(其名称代表**使用层次结构**的平衡迭代约简和聚类)具有比小批量 K 均值稍微复杂的动态特性,最后一部分采用了一种方法(**层次聚类**) 我们将在第 4 章,*层次结构聚类*中进行介绍。 然而,出于我们的目的,最重要的部分涉及数据准备阶段,该阶段基于称为 **聚类****特征特征树**的特定树结构( **CF 树**)。 给定数据集`X`,树的每个节点都由三个元素的元组组成:
![](img/704067e3-6d6d-4dc0-89b4-a834109a4585.png)
......
......@@ -82,7 +82,7 @@
![](img/d851736e-2e48-4de6-b798-6fd828d24c42.png)
这些距离之间的主要差异在[第 2 章](../Text/02.html)*聚类基础知识*中进行了讨论。 在本章中,介绍**余弦**距离很有用,这不是一个合适的距离度量(从数学角度来看),但是当样本之间的区分必须仅取决于角度时,这将非常有帮助 它们形成:
这些距离之间的主要差异在第 2 章*聚类基础知识*中进行了讨论。 在本章中,介绍**余弦**距离很有用,这不是一个合适的距离度量(从数学角度来看),但是当样本之间的区分必须仅取决于角度时,这将非常有帮助 它们形成:
![](img/f6f3bba1-aaea-4d25-85a7-a5c056ec4320.png)
......@@ -120,7 +120,7 @@
![](img/5630c46a-e57c-4099-bcf2-bc30a9ed942e.png)Example of complete linkage. C<sub class="calibre26">1</sub> and C<sub class="calibre26">3</sub> are selected for merging
该算法选择 **C <sub class="calibre20">1</sub>** *`C`* **<sub class="calibre20">3</sub>** 为了增加内部凝聚力。 实际上,很容易理解,考虑所有可能的组合,完全链接会导致群集密度最大化。 在上图所示的示例中,如果所需的簇数为两个,则合并 **C <sub class="calibre20">1</sub>****C <sub class="calibre20">2</sub>****C <sub class="calibre20">2</sub>****C <sub class="calibre20">3</sub>** 会产生具有较小内聚力的最终构型,这通常是不希望的结果。
该算法选择 **C <sub class="calibre20">1</sub>**`C`**<sub class="calibre20">3</sub>** 为了增加内部凝聚力。 实际上,很容易理解,考虑所有可能的组合,完全链接会导致群集密度最大化。 在上图所示的示例中,如果所需的簇数为两个,则合并 **C <sub class="calibre20">1</sub>****C <sub class="calibre20">2</sub>****C <sub class="calibre20">2</sub>****C <sub class="calibre20">3</sub>** 会产生具有较小内聚力的最终构型,这通常是不希望的结果。
......@@ -272,7 +272,7 @@ plt.show()
前面的方程式基于以下假设:如果 *x <sub class="calibre20">i</sub>**x <sub class="calibre20">j</sub>**x <sub class="calibre20">p</sub>* 的距离,例如 *d(x <sub class="calibre20">i</sub> ,x <sub class="calibre20">j</sub> )< d(x <sub class="calibre20">i</sub> , x <sub class="calibre20">p</sub> )*,可以合理预期 *x <sub class="calibre20">i</sub>**x <sub class="calibre20">j</sub>**x <sub class="calibre20">i</sub>*`x`<sub class="calibre20">`p`</sub> 之前合并在同一群集中(即,对应于 *x <sub class="calibre20">i</sub>*`x`<sub class="calibre20">`j`</sub> 的合并 低于 *x <sub class="calibre20">i</sub>*`x`*<sub class="calibre20">p</sub>* )。 因此, *CPC→1* 表示链接生成了一个最佳层次结构,该层次结构反映了基础几何结构。 另一方面, *CPC* *→-1* 表示完全不同意,并且潜在的聚类结果与几何形状不一致。 毋庸置疑,给定一个问题,我们的目标是找到一个最大化 *CPC* 的指标和链接。
考虑到[第 3 章](../Text/03.html)*高级聚类*中描述的示例,我们可以使用 SciPy 函数`cophenet`计算与不同链接(假设欧几里得距离)相对应的同位矩阵和 CPC 。 此函数需要将链接矩阵作为第一个参数,将接近度矩阵作为第二个参数,并返回同义矩阵和 CPC(`dm` 变量是先前计算出的压缩接近度矩阵):
考虑到第 3 章*高级聚类*中描述的示例,我们可以使用 SciPy 函数`cophenet`计算与不同链接(假设欧几里得距离)相对应的同位矩阵和 CPC 。 此函数需要将链接矩阵作为第一个参数,将接近度矩阵作为第二个参数,并返回同义矩阵和 CPC(`dm` 变量是先前计算出的压缩接近度矩阵):
```py
from scipy.cluster.hierarchy import linkage, cophenet
......
......@@ -44,7 +44,7 @@
[第 4 章](../Text/04.html)*分层活动聚类*中分析的所有算法均属于硬聚类方法家族。 这意味着给定的样本始终分配给单个群集。 另一方面,软聚类旨在将每个样本 *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 章](../Text/07.html)*降维和分量分析*):
因此,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 章](../Text/07.html)*降维和分量分析*中讨论 PCA 时,此概念将非常有用)。
此外,所有特征值都是非负的,特征向量生成正交的基础(当在第 7 章*降维和分量分析*中讨论 PCA 时,此概念将非常有用)。
如果协方差矩阵是随机选择的,则为了使其为正半定值,有必要将它们的每一个乘以其转置):
......
......@@ -292,7 +292,7 @@ Exponential kernel
一旦选择了核函数,就可以使用 k 最近邻方法建立概率密度函数的完全近似值。 实际上,给定数据集`X`(为简单起见, *X∈ <sup class="calibre27">m</sup>* ,所以这些值是实数),例如,创建起来很容易 球形树(如[第 2 章](../Text/02.html)*聚类基础知识*中所述)以有效的方式对数据进行分区。 当数据结构准备就绪时,可以在带宽定义的半径范围内获得查询点`x`<sub class="calibre20">`j`</sub> 的所有邻居。 假设这样的集合是 *X <sub class="calibre20">j</sub> = {x <sub class="calibre20">1</sub> ,...,x <sub class="calibre20">t</sub> }* 和点数 是 *N <sub class="calibre20">j</sub>* 。 概率密度的估算如下:
一旦选择了核函数,就可以使用 k 最近邻方法建立概率密度函数的完全近似值。 实际上,给定数据集`X`(为简单起见, *X∈ <sup class="calibre27">m</sup>* ,所以这些值是实数),例如,创建起来很容易 球形树(如第 2 章*聚类基础知识*中所述)以有效的方式对数据进行分区。 当数据结构准备就绪时,可以在带宽定义的半径范围内获得查询点`x`<sub class="calibre20">`j`</sub> 的所有邻居。 假设这样的集合是 *X <sub class="calibre20">j</sub> = {x <sub class="calibre20">1</sub> ,...,x <sub class="calibre20">t</sub> }* 和点数 是 *N <sub class="calibre20">j</sub>* 。 概率密度的估算如下:
![](img/93a535f7-f555-4e22-b5da-bed6fa8503ba.png)
......@@ -304,7 +304,7 @@ Density estimation of x<sub class="calibre26">j</sub>. The Kernel functions are
在这一点上,自然会问为什么不为每个查询使用整个数据集而不是 k-NN 方法? 答案很简单,它基于这样的假设:可以使用局部行为轻松地插值以 *x <sub class="calibre20">j</sub>* 计算的密度函数的值(即,对于多变量 分布,以 *x <sub class="calibre20">j</sub>* 为中心的球和*远点*对估计没有影响。 因此,我们可以将计算限制为`X`的较小子集,避免包含接近零的贡献。
在讨论如何确定最佳带宽之前,让我们展示一下先前定义的数据集的密度估计(使用 scikit-learn)。 由于我们没有任何特定的先验知识,因此我们将使用具有不同带宽(0.1、0.5 和 1.5)的高斯内核。 所有其他参数均保留为其默认值。 但是,`KernelDensity`类允许设置度量(默认为`metric='euclidean'`),数据结构(默认为`algorithm='auto'`,它根据维度在球树和 kd 树之间执行自动选择),以及 绝对公差和相对公差(分别为 0 和 10 <sup xmlns:epub="http://www.idpf.org/2007/ops" class="calibre27">-8</sup> )。 在许多情况下,无需更改默认值。 但是,对于具有特定功能的超大型数据集,例如,更改`leaf_size`参数以提高性能可能会有所帮助(如 [第 2 章](https://cdp.packtpub.com/hands_on_unsupervised_learning_with_python/wp-admin/post.php?post=29&action=edit#post_25) 中讨论的 , *聚类基础知识*)。 此外,默认度量标准不能满足所有任务的要求(例如:标准文档显示了一个基于 Haversine 距离的示例,在使用纬度和经度时可以使用该示例)。 在其他情况下,最好使用超立方体而不是球(曼哈顿距离的情况就是这样)。
在讨论如何确定最佳带宽之前,让我们展示一下先前定义的数据集的密度估计(使用 scikit-learn)。 由于我们没有任何特定的先验知识,因此我们将使用具有不同带宽(0.1、0.5 和 1.5)的高斯内核。 所有其他参数均保留为其默认值。 但是,`KernelDensity`类允许设置度量(默认为`metric='euclidean'`),数据结构(默认为`algorithm='auto'`,它根据维度在球树和 kd 树之间执行自动选择),以及 绝对公差和相对公差(分别为 0 和 10 <sup xmlns:epub="http://www.idpf.org/2007/ops" class="calibre27">-8</sup> )。 在许多情况下,无需更改默认值。 但是,对于具有特定功能的超大型数据集,例如,更改`leaf_size`参数以提高性能可能会有所帮助(如 第 2 章 中讨论的 , *聚类基础知识*)。 此外,默认度量标准不能满足所有任务的要求(例如:标准文档显示了一个基于 Haversine 距离的示例,在使用纬度和经度时可以使用该示例)。 在其他情况下,最好使用超立方体而不是球(曼哈顿距离的情况就是这样)。
让我们首先实例化类并拟合模型:
......@@ -676,7 +676,7 @@ Linear one-class SVM scenario: the training set is separated from the origin wit
投影函数*φ(•)*的存在保证存在于非常容易获得的条件(称为美世条件)下(即,在实子空间中,内核必须为正半 -定)。 这种选择的原因与解决问题的过程密切相关(更详细的解释可以在*机器学习算法第二版**Bonaccorso G**Packt Publishing* ,2018 年)。 但是,不熟悉 SVM 的读者不必担心,因为我们不会讨论太多的数学细节。 要记住的最重要的一点是,不支持任何内核的通用投影会导致计算复杂性急剧增加(尤其是对于大型数据集)。
*K(•,•)*的最常见选择之一是径向基函数(已经在[第 3 章](../Text/03.html)*高级聚类*中进行了分析):
*K(•,•)*的最常见选择之一是径向基函数(已经在第 3 章,*高级聚类*中进行了分析):
![](img/24030c03-033f-4e35-b840-0349843b16b6.png)
......@@ -698,7 +698,7 @@ Linear one-class SVM scenario: the training set is separated from the origin wit
Decision process in SVM
权向量正交于分离超平面。 样本 *`x`* <sub class="calibre20">*`i`*</sub> 被确定为一个惯常值,因为点积为正且大于阈值*ρ*。 相反, **x <sub class="calibre20">j</sub>** 被标记为异常值,因为决策函数的符号为负。 术语*ξ <sub class="calibre20">i</sub> (ξ <sub class="calibre20">i</sub> ≥0)*被称为松弛变量,它们的引入是为了使异常值和 内线 实际上,如果这些变量都等于零(并且为简单起见, *ρ= 1* ),则优化问题的条件变为:
权向量正交于分离超平面。 样本`x`<sub class="calibre20">`i`</sub> 被确定为一个惯常值,因为点积为正且大于阈值*ρ*。 相反, **x <sub class="calibre20">j</sub>** 被标记为异常值,因为决策函数的符号为负。 术语*ξ <sub class="calibre20">i</sub> (ξ <sub class="calibre20">i</sub> ≥0)*被称为松弛变量,它们的引入是为了使异常值和 内线 实际上,如果这些变量都等于零(并且为简单起见, *ρ= 1* ),则优化问题的条件变为:
![](img/5a35ab70-84af-4bd0-aec6-dc88a81ec8ad.png)
......
......@@ -271,7 +271,7 @@ print(np.sum(pca.explained_variance_ratio_))
有时,数据集不是线性可分离的,并且标准 PCA 无法提取正确的主成分。 当我们面对非凸簇的问题时,该过程与[第 3 章](../Text/03.html)*高级聚类*中讨论的过程没有什么不同。 在那种情况下,由于几何原因,某些算法无法执行成功的分离。 在这种情况下,目标是根据主成分的结构区分不同的类(在纯净,无监督的情况下,我们考虑特定的分组)。 因此,我们要使用转换后的数据集`Z`,并检测可区分阈值的存在。 例如,让我们考虑以下屏幕截图:
有时,数据集不是线性可分离的,并且标准 PCA 无法提取正确的主成分。 当我们面对非凸簇的问题时,该过程与第 3 章*高级聚类*中讨论的过程没有什么不同。 在那种情况下,由于几何原因,某些算法无法执行成功的分离。 在这种情况下,目标是根据主成分的结构区分不同的类(在纯净,无监督的情况下,我们考虑特定的分组)。 因此,我们要使用转换后的数据集`Z`,并检测可区分阈值的存在。 例如,让我们考虑以下屏幕截图:
![](img/1152710f-83cd-449a-9389-5540bb9ad014.png)
......@@ -523,7 +523,7 @@ Deconstruction of the digit X[0], based on three main components
Probability density functions of Gaussian distribution (left) and Laplace distribution (right)
不幸的是,峰度的使用由于其对异常值的缺乏鲁棒性而受到阻碍(也就是说,由于它涉及四次方,因此即使很小的值也可以被放大并改变最终结果;例如,噪声高斯 尾部的离群值可以显示为超高斯)。 因此,作者 Hyvarinen 和 Oja (在*独立组件分析:算法和应用中, Hyvarinen A.和 Oja,E。,神经网络* 13 2000)提出了一种称为**快速独立组件分析** *`F`* **astICA** **)** 基于**负熵**的概念。 我们不会在本书中描述整个模型。 但是,了解基本思想会有所帮助。 可以证明,在具有相同方差的所有分布之间,高斯熵最大。 因此,如果数据集`X`(零中心)已从具有协方差*Σ*的分布中得出,则可以定义`X`作为高斯 *N(0,;Σ* *)*的熵与`X`:的熵之间的差
不幸的是,峰度的使用由于其对异常值的缺乏鲁棒性而受到阻碍(也就是说,由于它涉及四次方,因此即使很小的值也可以被放大并改变最终结果;例如,噪声高斯 尾部的离群值可以显示为超高斯)。 因此,作者 Hyvarinen 和 Oja (在*独立组件分析:算法和应用中, Hyvarinen A.和 Oja,E。,神经网络* 13 2000)提出了一种称为**快速独立组件分析**`F`**astICA** **)** 基于**负熵**的概念。 我们不会在本书中描述整个模型。 但是,了解基本思想会有所帮助。 可以证明,在具有相同方差的所有分布之间,高斯熵最大。 因此,如果数据集`X`(零中心)已从具有协方差*Σ*的分布中得出,则可以定义`X`作为高斯 *N(0,;Σ* *)*的熵与`X`:的熵之间的差
![](img/c69596e4-c1c9-4843-8a54-eaf1e7682f29.png)
......
......@@ -48,7 +48,7 @@
[第 7 章](../Text/07.html)*降维和成分分析*中,我们讨论了一些通用的方法,这些方法可用于降低数据集的维数,因为其具有特殊的统计属性(例如协方差) 矩阵)。 但是,当复杂度增加时,即使**内核主成分分析***`k`* **内核 PCA**)也可能找不到合适的低维表示形式。 换句话说,信息的丢失可以克服一个阈值,该阈值保证了有效重建样本的可能性。 **自动编码器**是利用神经网络的极端非线性特性来查找给定数据集的低维表示的模型。 特别地,假设`X`是从数据生成过程中提取的一组样本, *p <sub class="calibre20">数据</sub>(x)*。 为简单起见,我们将考虑 *x <sub class="calibre20">i</sub> ∈ <sup class="calibre27">n</sup>* ,但对支撑结构没有任何限制(例如,对于 RGB 图像,[ *x <sub class="calibre20">i</sub> ∈ <sup class="calibre27">n×m×3</sup>* )。 自动编码器在形式上分为两个部分:有一个编码器,它将高维输入转换为较短的代码;一个解码器,执行逆运算(如下图所示):
第 7 章,*降维和成分分析*中,我们讨论了一些通用的方法,这些方法可用于降低数据集的维数,因为其具有特殊的统计属性(例如协方差) 矩阵)。 但是,当复杂度增加时,即使**内核主成分分析**`k`**内核 PCA**)也可能找不到合适的低维表示形式。 换句话说,信息的丢失可以克服一个阈值,该阈值保证了有效重建样本的可能性。 **自动编码器**是利用神经网络的极端非线性特性来查找给定数据集的低维表示的模型。 特别地,假设`X`是从数据生成过程中提取的一组样本, *p <sub class="calibre20">数据</sub>(x)*。 为简单起见,我们将考虑 *x <sub class="calibre20">i</sub> ∈ <sup class="calibre27">n</sup>* ,但对支撑结构没有任何限制(例如,对于 RGB 图像,[ *x <sub class="calibre20">i</sub> ∈ <sup class="calibre27">n×m×3</sup>* )。 自动编码器在形式上分为两个部分:有一个编码器,它将高维输入转换为较短的代码;一个解码器,执行逆运算(如下图所示):
![](img/d2603e73-6156-40fe-b0f1-a2a37672819f.png)
......@@ -395,7 +395,7 @@ Noisy samples (upper row); denoised images (lower row)
标准自动编码器生成的代码通常很密集; 但是,如[第 7 章](../Text/07.html)*降维和分量分析*中所讨论的,有时,最好使用字典过于完整和稀疏编码。 实现此目标的主要策略是简单地在成本函数上添加 *L <sub class="calibre20">1</sub>* 罚款(在代码层上):
标准自动编码器生成的代码通常很密集; 但是,如第 7 章,*降维和分量分析*中所讨论的,有时,最好使用字典过于完整和稀疏编码。 实现此目标的主要策略是简单地在成本函数上添加 *L <sub class="calibre20">1</sub>* 罚款(在代码层上):
![](img/ec6a414d-389c-457f-9944-ba198988bf14.png)
......
......@@ -34,29 +34,29 @@ TensorFlow 是 Google 的开放源代码框架,用于构建机器学习 AI 应
[第 1 章](../Text/01.html)*移动 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 章](../Text/02.html)*通过转移学习对图像进行分类* ,介绍了什么是转移学习以及为什么要使用转移学习,如何使用它 重新训练 Inception v3 和 MobileNet 模型,以更准确,更快地识别犬种,以及如何在示例 iOS 和 Android 应用程序中使用经过重新训练的模型。 然后,我们将向您展示如何在 Tensor-C 和 Swift 中将 TensorFlow 添加到自己的 iOS 应用中,以及如何将自己的 Android 应用添加到狗品种识别中。
第 2 章*通过转移学习对图像进行分类* ,介绍了什么是转移学习以及为什么要使用转移学习,如何使用它 重新训练 Inception v3 和 MobileNet 模型,以更准确,更快地识别犬种,以及如何在示例 iOS 和 Android 应用程序中使用经过重新训练的模型。 然后,我们将向您展示如何在 Tensor-C 和 Swift 中将 TensorFlow 添加到自己的 iOS 应用中,以及如何将自己的 Android 应用添加到狗品种识别中。
[第 3 章](../Text/03.html),, *检测对象及其位置*,快速概述了对象检测,然后向您展示如何设置 TensorFlow 对象检测 API 并使用 它可以重新训练 SSD-MobileNet 和 Faster RCNN 模型。 我们还将通过手动构建 TensorFlow iOS 库以支持非默认 TensorFlow 操作的方式,向您展示如何在 iOS 应用中使用示例 TensorFlow Android 应用 中使用的模型。 最后,我们将向您展示如何训练 YOLO2(另一个流行的对象检测模型),该模型也在示例 TensorFlow Android 应用程序中使用,以及如何在 iOS 应用程序中使用它。
第 3 章,, *检测对象及其位置*,快速概述了对象检测,然后向您展示如何设置 TensorFlow 对象检测 API 并使用 它可以重新训练 SSD-MobileNet 和 Faster RCNN 模型。 我们还将通过手动构建 TensorFlow iOS 库以支持非默认 TensorFlow 操作的方式,向您展示如何在 iOS 应用中使用示例 TensorFlow Android 应用 中使用的模型。 最后,我们将向您展示如何训练 YOLO2(另一个流行的对象检测模型),该模型也在示例 TensorFlow Android 应用程序中使用,以及如何在 iOS 应用程序中使用它。
[第 4 章](../Text/04.html)*变换具有惊人艺术风格的图片* 首先概述了神经样式转换在过去几年中的快速发展。 然后,它向您展示了如何训练快速的神经样式转换模型,以及如何在 iOS 和 Android 应用中使用它们。 之后,我们将介绍如何在您自己的 iOS 和 Android 应用程序中使用 TensorFlow Magenta 多样式模型轻松创建令人惊叹的艺术风格。
第 4 章*变换具有惊人艺术风格的图片* 首先概述了神经样式转换在过去几年中的快速发展。 然后,它向您展示了如何训练快速的神经样式转换模型,以及如何在 iOS 和 Android 应用中使用它们。 之后,我们将介绍如何在您自己的 iOS 和 Android 应用程序中使用 TensorFlow Magenta 多样式模型轻松创建令人惊叹的艺术风格。
[第 5 章](../Text/05.html)*了解简单语音命令*概述了语音识别,并向您展示了如何训练简单语音命令识别模型。 然后,我们将向您展示如何使用 Objective-C 和 Swift 在 Android 和 iOS 中使用该模型。 我们还将介绍有关如何解决移动设备上可能出现的模型加载和运行错误的更多提示。
第 5 章,*了解简单语音命令*概述了语音识别,并向您展示了如何训练简单语音命令识别模型。 然后,我们将向您展示如何使用 Objective-C 和 Swift 在 Android 和 iOS 中使用该模型。 我们还将介绍有关如何解决移动设备上可能出现的模型加载和运行错误的更多提示。
[第 6 章](../Text/06.html)*用自然语言描述图像* ,介绍了图像字幕的工作原理,然后介绍了如何训练和冻结图像字幕模型 TensorFlow。 我们将进一步讨论如何转换和优化复杂的模型,以使其可以在移动设备上运行。 最后,我们将使用该模型提供完整的 iOS 和 Android 应用程序,以生成图像的自然语言描述。
第 6 章*用自然语言描述图像* ,介绍了图像字幕的工作原理,然后介绍了如何训练和冻结图像字幕模型 TensorFlow。 我们将进一步讨论如何转换和优化复杂的模型,以使其可以在移动设备上运行。 最后,我们将使用该模型提供完整的 iOS 和 Android 应用程序,以生成图像的自然语言描述。
[第 7 章](../Text/07.html)*使用 CNN 和 LSTM 识别图形* ,解释了图形分类的工作原理,并讨论了如何训练,预测和准备模型。 然后,我们将向您展示如何构建另一个自定义 TensorFlow iOS 库,以在有趣的 iOS 涂鸦应用程序中使用该模型。 最后,我们将向您展示如何构建自定义的 TensorFlow Android 库来修复新的模型加载错误,然后在您自己的 Android 应用中使用该模型。
第 7 章*使用 CNN 和 LSTM 识别图形* ,解释了图形分类的工作原理,并讨论了如何训练,预测和准备模型。 然后,我们将向您展示如何构建另一个自定义 TensorFlow iOS 库,以在有趣的 iOS 涂鸦应用程序中使用该模型。 最后,我们将向您展示如何构建自定义的 TensorFlow Android 库来修复新的模型加载错误,然后在您自己的 Android 应用中使用该模型。
[第 8 章](../Text/08.html)*使用 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 章](../Text/09.html)*使用 GAN* 生成和增强图像,概述了 GAN 是什么以及为什么它具有如此大的潜力。 然后,它将探讨如何构建和训练可用于生成类似人的手写数字的基本 GAN 模型以及可以将低分辨率图像增强为高分辨率图像的更高级模型。 最后,我们将介绍如何在 iOS 和 Android 应用程序中使用两种 GAN 模型。
第 9 章,*使用 GAN* 生成和增强图像,概述了 GAN 是什么以及为什么它具有如此大的潜力。 然后,它将探讨如何构建和训练可用于生成类似人的手写数字的基本 GAN 模型以及可以将低分辨率图像增强为高分辨率图像的更高级模型。 最后,我们将介绍如何在 iOS 和 Android 应用程序中使用两种 GAN 模型。
[第 10 章](../Text/10.html)*构建类似 AlphaZero 的手机游戏应用程序* ,从最新和最酷的 AlphaZero 的工作原理以及如何训练和测试 AlphaZero 的模型开始 在 TensorFlow 作为后端的 Keras 中玩一个简单但有趣的游戏,名为 Connect 4。 然后,我们将向您展示完整的 iOS 和 Android 应用程序,以使用该模型并在您的移动设备上玩 Connect 4 游戏。
第 10 章*构建类似 AlphaZero 的手机游戏应用程序* ,从最新和最酷的 AlphaZero 的工作原理以及如何训练和测试 AlphaZero 的模型开始 在 TensorFlow 作为后端的 Keras 中玩一个简单但有趣的游戏,名为 Connect 4。 然后,我们将向您展示完整的 iOS 和 Android 应用程序,以使用该模型并在您的移动设备上玩 Connect 4 游戏。
[第 11 章](../Text/11.html)*在移动设备上使用 TensorFlow Lite 和 Core ML* 演示 TensorFlow Lite,然后向您展示如何使用预先构建的 TensorFlow 模型(经过重新训练) TensorFlow Lite 的 TensorFlow 模型以及 iOS 中的自定义 TensorFlow Lite 模型。 我们还将向您展示如何在 Android 中使用 TensorFlow Lite。 之后,我们将概述 Apple 的 Core ML,并向您展示如何在使用 Scikit-Learn 的标准机器学习中使用 Core ML。 最后,我们将介绍如何在 TensorFlow 和 Keras 中使用 Core ML。
第 11 章,*在移动设备上使用 TensorFlow Lite 和 Core ML* 演示 TensorFlow Lite,然后向您展示如何使用预先构建的 TensorFlow 模型(经过重新训练) TensorFlow Lite 的 TensorFlow 模型以及 iOS 中的自定义 TensorFlow Lite 模型。 我们还将向您展示如何在 Android 中使用 TensorFlow Lite。 之后,我们将概述 Apple 的 Core ML,并向您展示如何在使用 Scikit-Learn 的标准机器学习中使用 Core ML。 最后,我们将介绍如何在 TensorFlow 和 Keras 中使用 Core ML。
[第 12 章](../Text/12.html)*在 Raspberry Pi 上开发 TensorFlow 应用程序* ,首先介绍如何设置 Raspberry Pi 并使其移动以及如何设置 Raspberry Pi 上的 TensorFlow。 然后,我们将介绍如何使用 TensorFlow 图像识别和音频识别模型,以及文本到语音和机器人移动 API,来构建可以移动,看,听和说的 Raspberry Pi 机器人。 最后,我们将详细讨论如何使用 OpenAI Gym 和 TensorFlow 在模拟环境中从头开始构建和训练强大的基于神经网络的强化学习策略模型,以使机器人学会保持平衡。
第 12 章*在 Raspberry Pi 上开发 TensorFlow 应用程序* ,首先介绍如何设置 Raspberry Pi 并使其移动以及如何设置 Raspberry Pi 上的 TensorFlow。 然后,我们将介绍如何使用 TensorFlow 图像识别和音频识别模型,以及文本到语音和机器人移动 API,来构建可以移动,看,听和说的 Raspberry Pi 机器人。 最后,我们将详细讨论如何使用 OpenAI Gym 和 TensorFlow 在模拟环境中从头开始构建和训练强大的基于神经网络的强化学习策略模型,以使机器人学会保持平衡。
......@@ -68,9 +68,9 @@ TensorFlow 是 Google 的开放源代码框架,用于构建机器学习 AI 应
我们建议您先按顺序阅读前四章,然后运行[这里](http://github.com/jeffxtang/mobiletfbook)。 这将帮助您确保已为 TensorFlow 移动应用程序开发设置了全部开发环境,并且知道如何将 TensorFlow 集成到自己的 iOS 和/或 Android 应用程序中。 如果您是 iOS 开发人员,还将学习如何在 TensorFlow 中使用 Objective-C 或 Swift,以及何时以及如何使用 TensorFlow pod 或手动 TensorFlow iOS 库。
然后,如果您需要构建自定义的 TensorFlow Android 库,请转到[第 7 章](../Text/07.html)*使用 CNN 和 LSTM 识别图形*,以及如果您想学习如何在 您的移动应用程序,请查看[第 8 章](../Text/08.html)*使用 RNN 预测股价* , 和[章 10](../Text/10.html)*构建类似 AlphaZero 的手机游戏应用程序*
然后,如果您需要构建自定义的 TensorFlow Android 库,请转到第 7 章,*使用 CNN 和 LSTM 识别图形*,以及如果您想学习如何在 您的移动应用程序,请查看第 8 章*使用 RNN 预测股价* , 和[章 10](../Text/10.html)*构建类似 AlphaZero 的手机游戏应用程序*
如果您对 TensorFlow Lite 或 Core ML 更感兴趣,请阅读[第 11 章](../Text/11.html)*在移动设备*上使用 TensorFlow Lite 和 Core ML,以及您对 Raspberry Pi 上的 TensorFlow 最感兴趣 或 TensorFlow 中的强化学习,请跳至[第 12 章](../Text/12.html)*在 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 章](../Text/12.html)*在 Raspberry Pi* 上开发 TensorFlow 应用程序中进行讨论):
我们将在本章涵盖以下主题(如何设置 Raspberry Pi 开发环境将在第 12 章,*在 Raspberry Pi* 上开发 TensorFlow 应用程序中进行讨论):
* 设置 TensorFlow
* 设置 Xcode
......
......@@ -8,7 +8,7 @@
如果我们想提高准确性并在使用改进模型的智能手机上构建移动应用程序怎么办,那么当我们四处走走并看到一只有趣的狗时,我们可以使用该应用程序告诉我们它是哪种狗。
在本章中,我们将首先讨论为什么对于这样的图像分类任务,转移学习或重新训练经过预训练的深度学习模型是完成任务的最经济有效的方法。 然后,我们将向您展示如何使用良好的狗数据集对一些最佳图像分类模型进行再训练,以及如何在[第 1 章](../Text/01.html)*移动 TensorFlow* 入门。 此外,我们还将分步说明如何将 TensorFlow 添加到基于 Objective-C 或 Swift 的 iOS 和 Android 应用中。
在本章中,我们将首先讨论为什么对于这样的图像分类任务,转移学习或重新训练经过预训练的深度学习模型是完成任务的最经济有效的方法。 然后,我们将向您展示如何使用良好的狗数据集对一些最佳图像分类模型进行再训练,以及如何在第 1 章*移动 TensorFlow* 入门。 此外,我们还将分步说明如何将 TensorFlow 添加到基于 Objective-C 或 Swift 的 iOS 和 Android 应用中。
总而言之,我们将在本章中介绍以下主题:
......@@ -339,7 +339,7 @@ bazel-bin/tensorflow/tools/benchmark/benchmark_model
我们在[第 1 章](../Text/01.html)*移动 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 章](../Text/01.html)*移动 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 章](../Text/01.html)*移动入门* *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 章](../Text/02.html)*通过转移学习对图像进行分类的`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 章](../Text/02.html)*通过转移学习对图像进行分类的 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}));
......
......@@ -58,7 +58,7 @@ images 目录中还有一些其他样式的图像,可用于创建不同的检
![](img/ea1f4494-b7f4-4be2-a897-adfcbc4f0ef4.jpg)Figure 4.1 Using Van Gogh's painting as the style image
[第 1 章](../Text/01.html) *Mobile TensorFlow* 入门中设置的 NVIDIA GTX 1070 GPU 驱动的 Ubuntu 上,整个培训大约需要 5 个小时,并且在 CPU 上肯定要花更长的时间 。
第 1 章, *Mobile TensorFlow* 入门中设置的 NVIDIA GTX 1070 GPU 驱动的 Ubuntu 上,整个培训大约需要 5 个小时,并且在 CPU 上肯定要花更长的时间 。
The script was originally written for TensorFlow 0.12 but modified later for TensorFlow 1.1, and has been verified to also run OK in the TensorFlow 1.4 with Python 2.7 environment we set up earlier.
......@@ -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 章](../Text/02.html)*通过转移学习*对图像进行分类中介绍了量化):
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 章](../Text/02.html)*分类 具有 Transfer Learning* 的图像,但 TensorFlow Magenta 项目中的预训练多样式模型文件(我们将在本章的后续部分中使用)将不会随 TensorFlow pod 一起加载(截至 2018 年 1 月 )—尝试加载多样式模型文件时将引发以下错误:
事实证明,在由 TensorFlow 实验性容器构建的 iOS 应用中,使用在步骤 7 中生成的`fst_frozen_quantized.pb`模型文件没有问题,如第 2 章*分类 具有 Transfer Learning* 的图像,但 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:
......@@ -115,7 +115,7 @@ Could not create TensorFlow Graph: Invalid argument: No OpKernel was registered
[[Node: transformer/expand/conv1/mul_1 = Mul[T=DT_INT32](transformer/expand/conv1/mul_1/x, transformer/expand/conv1/strided_slice_1)]]
```
[第 3 章](../Text/03.html)*检测对象及其位置*中,我们讨论了原因以及如何使用手动构建的 TensorFlow 库修复此错误。 由于我们将在同一 iOS 应用程序中使用这两种模型,因此我们将使用功能更强大的手动 TensorFlow 库创建一个新的 iOS 应用程序。
第 3 章*检测对象及其位置*中,我们讨论了原因以及如何使用手动构建的 TensorFlow 库修复此错误。 由于我们将在同一 iOS 应用程序中使用这两种模型,因此我们将使用功能更强大的手动 TensorFlow 库创建一个新的 iOS 应用程序。
......@@ -234,7 +234,7 @@ return imgScaled;
[第 2 章](../Text/02.html)*通过转移学习*对图像进行分类中,我们描述了如何将 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 章](../Text/01.html)*移动 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`工具将得到改进,以为我们提供准确的输入和输出节点名称。
现在是时候在移动应用中使用我们的热门新模型了。
......@@ -410,9 +410,9 @@ runOnUiThread(new Runnable() {
如果您已经阅读了前三章中的 iOS 应用程序,那么您可能更喜欢使用手动构建的 TensorFlow iOS 库而不是 TensorFlow 实验窗格,就像使用手动库方法一样,您可以更好地控制可以使用哪些 TensorFlow 操作 添加更好的模型使您的模型满意,这也是我们决定专注于 TensorFlow Mobile 而不是[第 1 章](../Text/01.html) *Mobile TensorFlow* 的 TensorFlow Lite 的原因之一。
如果您已经阅读了前三章中的 iOS 应用程序,那么您可能更喜欢使用手动构建的 TensorFlow iOS 库而不是 TensorFlow 实验窗格,就像使用手动库方法一样,您可以更好地控制可以使用哪些 TensorFlow 操作 添加更好的模型使您的模型满意,这也是我们决定专注于 TensorFlow Mobile 而不是第 1 章, *Mobile TensorFlow* 的 TensorFlow Lite 的原因之一。
因此,尽管您可以在阅读本书时尝试使用 TensorFlow 吊舱,以查看吊舱是否已更新以支持模型中使用的所有操作,但从现在开始,我们将始终使用手动构建的 TensorFlow 库( 请参见 iOS 应用中[第 3 章](../Text/03.html)*检测对象及其位置**在 iOS 中使用对象检测模型的*部分的步骤 1 和 2)。
因此,尽管您可以在阅读本书时尝试使用 TensorFlow 吊舱,以查看吊舱是否已更新以支持模型中使用的所有操作,但从现在开始,我们将始终使用手动构建的 TensorFlow 库( 请参见 iOS 应用中第 3 章*检测对象及其位置**在 iOS 中使用对象检测模型的*部分的步骤 1 和 2)。
......@@ -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 章](../Text/03.html)*检测对象及其位置中一样运行`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 章](../Text/02.html)*中使用 TensorFlow 窗格创建了一个基于 Swift 的 iOS 应用,并通过 Transfer Learning* 对图像进行了分类。 现在让我们创建一个新的 Swift 应用程序,该应用程序使用我们在上一节中手动构建的 TensorFlow iOS 库,并在我们的 Swift 应用程序中使用语音命令模型:
我们在第 2 章,*中使用 TensorFlow 窗格创建了一个基于 Swift 的 iOS 应用,并通过 Transfer Learning* 对图像进行了分类。 现在让我们创建一个新的 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 ++代码的包装。
......
......@@ -6,7 +6,7 @@
如果图像分类和物体检测是明智的任务,那么用自然语言描述图像绝对是一项更具挑战性的任务,需要更多的智能-请片刻考虑一下每个人如何从新生儿成长(谁学会了识别 物体并检测它们的位置)到三岁的孩子(他们学会讲述图片故事)。 用自然语言描述图像的任务的正式术语是图像标题。 与具有长期研究和发展历史的语音识别不同,图像字幕(具有完整的自然语言,而不仅仅是关键词输出)由于其复杂性和 2012 年的深度学习突破而仅经历了短暂而令人兴奋的研究历史。
在本章中,我们将首先回顾基于深度学习的图像字幕模型如何赢得 2015 年 Microsoft COCO(大规模对象检测,分割和字幕数据集),我们在 中简要介绍了该模型 *[第 3 章](../Text/03.html)**检测对象及其位置* ],有效。 然后,我们将总结在 TensorFlow 中训练模型的步骤,并详细介绍如何准备和优化要在移动设备上部署的复杂模型。 之后,我们将向您展示有关如何构建 iOS 和 Android 应用程序以使用该模型生成描述图像的自然语言语句的分步教程。 由于该模型同时涉及计算机视觉和自然语言处理,因此您将首次看到两种主要的深度神经网络架构 CNN 和 RNN 如何协同工作,以及如何编写 iOS 和 Android 代码以访问经过训练的网络并进行 多个推论。 总而言之,我们将在本章介绍以下主题:
在本章中,我们将首先回顾基于深度学习的图像字幕模型如何赢得 2015 年 Microsoft COCO(大规模对象检测,分割和字幕数据集),我们在 中简要介绍了该模型 *第 3 章**检测对象及其位置* ],有效。 然后,我们将总结在 TensorFlow 中训练模型的步骤,并详细介绍如何准备和优化要在移动设备上部署的复杂模型。 之后,我们将向您展示有关如何构建 iOS 和 Android 应用程序以使用该模型生成描述图像的自然语言语句的分步教程。 由于该模型同时涉及计算机视觉和自然语言处理,因此您将首次看到两种主要的深度神经网络架构 CNN 和 RNN 如何协同工作,以及如何编写 iOS 和 Android 代码以访问经过训练的网络并进行 多个推论。 总而言之,我们将在本章介绍以下主题:
* 图片字幕-工作原理
* 训练和冻结图像字幕模型
......@@ -26,7 +26,7 @@
获奖的 Show and Tell 模型是使用端到端方法进行训练的,类似于我们在上一章中简要介绍的最新的基于深度学习的语音识别模型。 它使用 MSCOCO 图像字幕 2014 数据集,可从[这里](http://cocodataset.org/#download)下载,该数据集包含超过 82,000 个训练图像,并以描述它们的自然语言句子为目标。 训练模型以使为每个输入图像输出目标自然语言句子的可能性最大化。 与使用多个子系统的其他更复杂的训练方法不同,端到端方法优雅,简单,并且可以实现最新的结果。
为了处理和表示输入图像,Show and Tell 模型使用预训练的 Inception v3 模型,该模型与我们在 *[第 2 章](../Text/02.html)**通过转移学习*对图像进行分类。 Inception v3 CNN 网络的最后一个隐藏层用作输入图像的表示。 由于 CNN 模型的性质,较早的层捕获更多的基本图像信息,而较后的层捕获更高级的图像概念。 因此,通过使用输入图像的最后一个隐藏层来表示图像,我们可以更好地准备具有高级概念的自然语言输出。 毕竟,我们通常会开始用诸如“人”或“火车”之类的词来描述图片,而不是“带有尖锐边缘的东西”。
为了处理和表示输入图像,Show and Tell 模型使用预训练的 Inception v3 模型,该模型与我们在 *第 2 章**通过转移学习*对图像进行分类。 Inception v3 CNN 网络的最后一个隐藏层用作输入图像的表示。 由于 CNN 模型的性质,较早的层捕获更多的基本图像信息,而较后的层捕获更高级的图像概念。 因此,通过使用输入图像的最后一个隐藏层来表示图像,我们可以更好地准备具有高级概念的自然语言输出。 毕竟,我们通常会开始用诸如“人”或“火车”之类的词来描述图片,而不是“带有尖锐边缘的东西”。
为了表示目标自然语言输出中的每个单词,使用了单词嵌入方法。 词嵌入只是词的向量表示。 [TensorFlow 网站上有一个不错的教程](https://www.tensorflow.org/tutorials/word2vec),介绍如何构建模型来获取单词的矢量表示。
......@@ -56,7 +56,7 @@ The gradient concept is used in the back propagation process to update network w
如果您已按照 *[第 3 章](../Text/03.html)**检测对象及其位置*中的*设置 TensorFlow 对象检测 API* 部分进行操作,那么您已经 已安装`im2txt`文件夹; 否则,只需将`cd`移至您的 TensorFlow 源根目录,然后运行:
如果您已按照 *第 3 章**检测对象及其位置*中的*设置 TensorFlow 对象检测 API* 部分进行操作,那么您已经 已安装`im2txt`文件夹; 否则,只需将`cd`移至您的 TensorFlow 源根目录,然后运行:
```py
git clone https://github.com/tensorflow/models
......@@ -72,7 +72,7 @@ The gradient concept is used in the back propagation process to update network w
MSCOCO_DIR="${HOME}/im2txt/data/mscoco"
```
请注意,尽管 2014 年要下载和保存的原始数据集约为 20 GB,但该数据集将转换为 TFRecord 格式(,我们还在 *[第 3 章](../Text/03.html)* *检测对象及其位置*来转换对象检测数据集,这是运行以下训练脚本所需的,并添加了大约 100 GB 数据。 因此,使用 TensorFlow im2txt 项目总共需要约 140 GB 的训练自己的图像字幕模型。
请注意,尽管 2014 年要下载和保存的原始数据集约为 20 GB,但该数据集将转换为 TFRecord 格式(,我们还在 *第 3 章* *检测对象及其位置*来转换对象检测数据集,这是运行以下训练脚本所需的,并添加了大约 100 GB 数据。 因此,使用 TensorFlow im2txt 项目总共需要约 140 GB 的训练自己的图像字幕模型。
2. 转到您的 im2txt 源代码所在的位置,然后下载并处理 MSCOCO 数据集:
......@@ -119,7 +119,7 @@ bazel-bin/im2txt/train \
--number_of_steps=1000000
```
即使在 GPU 上(例如[第 1 章](../Text/01.html)*Mobile TensorFlow* 入门中设置的 Nvidia GTX 1070),整个[1G]步骤(在前面的`--number_of_steps`参数中指定)也会 • 超过 5 个昼夜,因为运行 5 万步大约需要 6.5 个小时。 幸运的是,您很快就会看到,即使以大约 50K 的步长,图像字幕的结果也已经相当不错了。 另请注意,您可以随时取消`train`脚本,然后稍后重新运行它,该脚本将从最后保存的检查点开始; 默认情况下,检查点会每 10 分钟保存一次,因此在最坏的情况下,您只会损失 10 分钟的训练时间。
即使在 GPU 上(例如第 1 章*Mobile TensorFlow* 入门中设置的 Nvidia GTX 1070),整个[1G]步骤(在前面的`--number_of_steps`参数中指定)也会 • 超过 5 个昼夜,因为运行 5 万步大约需要 6.5 个小时。 幸运的是,您很快就会看到,即使以大约 50K 的步长,图像字幕的结果也已经相当不错了。 另请注意,您可以随时取消`train`脚本,然后稍后重新运行它,该脚本将从最后保存的检查点开始; 默认情况下,检查点会每 10 分钟保存一次,因此在最坏的情况下,您只会损失 10 分钟的训练时间。
经过几个小时的培训,取消前面的`train`脚本,然后查看`--train_dir`指向的位置。 您将看到类似这样的内容(默认情况下,将保存五组检查点文件,但此处仅显示三组):
......@@ -172,7 +172,7 @@ Captions for image COCO_val2014_000000224477.jpg:
[第 4 章](../Text/04.html)*转换具有惊人艺术风格的图片,*[第 5 章](../Text/05.html)*了解简单语音命令*中,我们使用了两个略有不同的版本 一个名为`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` 的完整文件名。
......@@ -344,7 +344,7 @@ x[:6]
u'convert_image']
```
解决您的 iOS 应用错误的第二种可能解决方案是,像在 中所做的那样,在 `tf_op_files`文件中添加未注册的 op 实施 t 并重建 TensorFlow iOS 库。 [第 5 章](../Text/05.html)*了解简单语音命令。* 坏消息是,由于 TensorFlow 中没有`DecodeJpeg`功能的实现,因此无法将`DecodeJpeg`的 TensorFlow 实现添加到`tf_op_files`中。
解决您的 iOS 应用错误的第二种可能解决方案是,像在 中所做的那样,在 `tf_op_files`文件中添加未注册的 op 实施 t 并重建 TensorFlow iOS 库。 第 5 章*了解简单语音命令。* 坏消息是,由于 TensorFlow 中没有`DecodeJpeg`功能的实现,因此无法将`DecodeJpeg`的 TensorFlow 实现添加到`tf_op_files`中。
实际上,在图 6.2 中也暗示了对此烦恼的解决方法,其中`convert_image`节点用作`image_feed`输入的解码版本。 为了更准确,单击 TensorBoard 图中的 Cast 和**解码**节点,如图 6.4 所示,您将从右侧的 TensorBoard 信息卡中看到输入 Cast(名为`convert_image/Cast`)的输出为`decode/DecodeJpeg``convert_image`,解码的输入和输出为`image_feed``convert_image/Cast`
......@@ -444,9 +444,9 @@ bazel-bin/tensorflow/contrib/util/convert_graphdef_memmapped_format \
由于该模型的 CNN 部分基于 Inception v3,因此我们在[第 2 章](../Text/02.html)*通过转移学习*对图像进行分类时使用的模型相同,因此我们可以并且将使用更简单的 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 章](../Text/02.html)*通过传输学习对图像进行分类,*中的*将 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 章](../Text/02.html)*通过 Transfer Learning* 对图像进行分类的 iOS 应用程序的代码。 基本上,您可以在应用启动后点击任意位置,然后选择两个模型之一,图像描述结果将显示在顶部。 当用户在`alert`操作中选择了映射模型时,将运行以下代码:
此简单的与 UI 相关的代码类似于第 2 章,*通过 Transfer Learning* 对图像进行分类的 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 章](../Text/02.html)*通过传递学习*[第 6 章[](../Text/06.html)*用自然语言描述图像*或手动构建的 TensorFlow 库,就像在其他章节中一样,我们必须使用一些新技巧。 发生错误的原因是`RefSwitch`操作需要 INT64 数据类型,但它不是 TensorFlow 库中内置的已注册数据类型之一,因为默认情况下,要使该库尽可能小,仅适用于 每个操作都包括在内。 我们可能会从 Python 的模型构建端修复此问题,但是在这里,我们仅向您展示如何从 iOS 端修复此问题,当您无权访问源代码来构建模型时,这很有用。
要解决以前的 RefSwitch 错误,无论您是否像在第 2 章*通过传递学习*[第 6 章[](../Text/06.html)*用自然语言描述图像*或手动构建的 TensorFlow 库,就像在其他章节中一样,我们必须使用一些新技巧。 发生错误的原因是`RefSwitch`操作需要 INT64 数据类型,但它不是 TensorFlow 库中内置的已注册数据类型之一,因为默认情况下,要使该库尽可能小,仅适用于 每个操作都包括在内。 我们可能会从 Python 的模型构建端修复此问题,但是在这里,我们仅向您展示如何从 iOS 端修复此问题,当您无权访问源代码来构建模型时,这很有用。
......@@ -617,7 +617,7 @@ void normalizeScreenCoordinates(NSMutableArray *allPoints, float *normalized) {
现在该看看我们如何在 Android 中加载和使用该模型。 在之前的章节中,我们通过使用 Android 应用程序的`build.gradle`文件并添加了一行 `compile 'org.tensorflow:tensorflow-android:+'`仅添加了 TensorFlow 支持。 与 iOS 相比,我们必须构建一个自定义的 TensorFlow 库来修复不同的模型加载或运行错误(例如,在 [第 3 章](../Text/03.html)*中,检测对象及其位置[*[第四章](../Text/04.html)*变换具有惊人艺术风格的图片*[第五章](../Text/05.html)*了解简单的语音命令*),Android 的默认 TensorFlow 库对注册的操作和数据类型有更好的支持,这可能是因为 Android 是 Google 的一等公民,而 iOS 是第二名,甚至是第二名。
现在该看看我们如何在 Android 中加载和使用该模型。 在之前的章节中,我们通过使用 Android 应用程序的`build.gradle`文件并添加了一行 `compile 'org.tensorflow:tensorflow-android:+'`仅添加了 TensorFlow 支持。 与 iOS 相比,我们必须构建一个自定义的 TensorFlow 库来修复不同的模型加载或运行错误(例如,在 第 3 章*中,检测对象及其位置[*[第四章](../Text/04.html)*变换具有惊人艺术风格的图片*[第五章](../Text/05.html)*了解简单的语音命令*),Android 的默认 TensorFlow 库对注册的操作和数据类型有更好的支持,这可能是因为 Android 是 Google 的一等公民,而 iOS 是第二名,甚至是第二名。
事实是,当我们处理各种惊人的模型时,我们不得不面对不可避免的问题只是时间问题:我们必须手动为 Android 构建 TensorFlow 库,以修复默认 TensorFlow 库中的一些错误 根本无法应对。 `No OpKernel was registered to support Op 'RefSwitch' with these attrs.`错误就是这样的错误之一。 对于乐观的开发人员来说,这仅意味着另一种向您的技能组合中添加新技巧的机会。
......@@ -647,7 +647,7 @@ android_ndk_repository(
api_level=14)
```
2. 如果您还使用过本书中的 iOS 应用程序,并且已将`tensorflow/core/platform/default/mutex.h``#include "nsync_cv.h"``#include "nsync_mu.h"`更改为`#include "nsync/public/nsync_cv.h"``#include "nsync/public/nsync_mu.h"`,请参见[第 3 章](../Text/03.html) *检测对象及其位置* 时,您需要将其更改回以成功构建 TensorFlow Android 库(此后,当您使用手动构建的 TensorFlow 库在 Xcode 和 iOS 应用上工作时,需要先添加`nsync/public` 这两个标头。
2. 如果您还使用过本书中的 iOS 应用程序,并且已将`tensorflow/core/platform/default/mutex.h``#include "nsync_cv.h"``#include "nsync_mu.h"`更改为`#include "nsync/public/nsync_cv.h"``#include "nsync/public/nsync_mu.h"`,请参见第 3 章, *检测对象及其位置* 时,您需要将其更改回以成功构建 TensorFlow Android 库(此后,当您使用手动构建的 TensorFlow 库在 Xcode 和 iOS 应用上工作时,需要先添加`nsync/public` 这两个标头。
Changing `tensorflow/core/platform/default/mutex.h` back and forth certainly is not an ideal solution. It's supposed to be just as a workaround. As it only needs to be changed when you start using a manually built TensorFlow iOS library or when you build a custom TensorFlow library, we can live with it for now.
......
......@@ -34,7 +34,7 @@
这就是为什么我们说 RNN 有内存。 RNN 对于处理股票价格数据似乎很有意义,因为直觉是,今天(以及明天和后天等等)的股票价格可能会受其前 N 天的价格影响。
LSTM 只是解决 RNN 已知消失梯度问题的一种 RNN,我们在[第 6 章](../Text/06.html)*用自然语言描述图像*中引入了 LSTM。 基本上,在训练 RNN 模型的过程中,,如果到 RNN 的输入序列的时间步太长,则使用反向传播更新较早时间步的网络权重可能会得到 0 的梯度值, 导致没有学习发生。 例如,当我们使用 50 天的价格作为输入,并且如果使用 50 天甚至 40 天的时间步长变得太长,则常规 RNN 将是不可训练的。 LSTM 通过添加一个长期状态来解决此问题,该状态决定可以丢弃哪些信息以及需要在许多时间步骤中存储和携带哪些信息。
LSTM 只是解决 RNN 已知消失梯度问题的一种 RNN,我们在第 6 章,*用自然语言描述图像*中引入了 LSTM。 基本上,在训练 RNN 模型的过程中,,如果到 RNN 的输入序列的时间步太长,则使用反向传播更新较早时间步的网络权重可能会得到 0 的梯度值, 导致没有学习发生。 例如,当我们使用 50 天的价格作为输入,并且如果使用 50 天甚至 40 天的时间步长变得太长,则常规 RNN 将是不可训练的。 LSTM 通过添加一个长期状态来解决此问题,该状态决定可以丢弃哪些信息以及需要在许多时间步骤中存储和携带哪些信息。
The other type of RNN that solves the vanishing gradient problem nicely is called **Gated Recurrent Unit** (**GRU**), which simplifies standard LSTM models a bit and is becoming more popular. Both TensorFlow and Keras APIs support basic RNN and LSTM/GRU models. In the next two sections, you'll see concrete TensorFlow and Keras APIs for using RNN and standard LSTM, and you can simply replace "LSTM" with "GRU" in the code to use and compare the results of using the GRU model with RNN and standard LSTM models.
......
......@@ -39,7 +39,7 @@ If you're interested in knowing more about the Nash Equilibrium, Google *"khan a
* 从劣质图像生成高质量图像
* 图像修复(修复丢失或损坏的图像)
* 翻译图像(例如,从边缘草图到照片,或者在人脸上添加或移除诸如眼镜之类的对象)
* 从文本生成图像(在[第 6 章](../Text/06.html)*中以自然语言*描述图像的 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 章](../Text/02.html)*中将带有转移学习*的图像分类到`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 章](../Text/06.html)*以自然语言*描述图像的复杂 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 章](../Text/08.html)*中使用 RNN 预测股价*一样在该项目中设置 TensorFlow。 以及其他不使用 TensorFlow 窗格的章节。 然后将两个模型文件`gan_mnist.pb``pix2pix_transformed_memmapped.pb`以及一个测试图像拖放到项目中。 另外,将[第 6 章](../Text/06.html)*以自然语言*描述图像的 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 章](../Text/07.html)*中使用 CNN 和 LSTM* 识别图形使用了类似的技术:
`createMNISTImageInRect`的定义如下-我们在第 7 章,*中使用 CNN 和 LSTM* 识别图形使用了类似的技术:
```py
- (UIImage *)createMNISTImageInRect:(CGRect)rect values:(NSArray*)greyscaleValues
......@@ -465,7 +465,7 @@ No OpKernel was registered to support Op 'FIFOQueueV2' with these attrs. Registe
`runPix2PixBlurryModel`方法中,我们使用`LoadMemoryMappedModel`方法加载`pix2pix_transformed_memmapped.pb`模型文件,并加载测试图像并设置输入张量,其方式与[第 4 章](../Text/04.html)*以惊人的艺术风格转换图片*
`runPix2PixBlurryModel`方法中,我们使用`LoadMemoryMappedModel`方法加载`pix2pix_transformed_memmapped.pb`模型文件,并加载测试图像并设置输入张量,其方式与第 4 章*以惊人的艺术风格转换图片*
```py
- (NSArray*) runPix2PixBlurryModel {
......@@ -557,7 +557,7 @@ No OpKernel was registered to support Op 'FIFOQueueV2' with these attrs. Registe
事实证明,我们不需要使用自定义的 TensorFlow Android 库,就像我们在[第 7 章](../Text/07.html)*通过 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 章](../Text/08.html)*中使用 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 应用程序的源代码。
总之,本章将涵盖以下主题:
......@@ -69,7 +69,7 @@ Connect 4 的 AlphaZero 模型基于[存储库](https://github.com/jeffxtang/Dee
git clone https://github.com/jeffxtang/DeepReinforcementLearning
```
然后,如果尚未在[第 8 章](../Text/08.html)*中使用 RNN* 预测股价,则设置 Keras 和 TensorFlow 虚拟环境:
然后,如果尚未在第 8 章,*中使用 RNN* 预测股价,则设置 Keras 和 TensorFlow 虚拟环境:
```py
cd
......@@ -324,7 +324,7 @@ if player2version > 0:
# saver.save(K.get_session(), '/tmp/alphazero_4.ckpt')
```
您可能会觉得很熟悉,因为我们在[第 8 章](../Text/08.html)*中使用 RNN* 预测股票价格做了类似的操作。 确保将`alphazero19.ckpt``alphazero_4.ckpt`中的版本号(例如 19 或 4)与`play.py`中定义的内容(例如`playMatchesBetweenVersions(env, 1, 19, 4, 10, lg.logger_tourney, 0)`)以及 `run_archive/connect4/run0001/models`目录中的版本号匹配 在这种情况下, `version0019.h5``version0004.h5`都需要存在。
您可能会觉得很熟悉,因为我们在第 8 章,*中使用 RNN* 预测股票价格做了类似的操作。 确保将`alphazero19.ckpt``alphazero_4.ckpt`中的版本号(例如 19 或 4)与`play.py`中定义的内容(例如`playMatchesBetweenVersions(env, 1, 19, 4, 10, lg.logger_tourney, 0)`)以及 `run_archive/connect4/run0001/models`目录中的版本号匹配 在这种情况下, `version0019.h5``version0004.h5`都需要存在。
运行`play.py`后,将在`/tmp`目录中生成`alphazero19`检查点文件:
......@@ -346,7 +346,7 @@ python tensorflow/python/tools/freeze_graph.py \
--input_binary=true
```
为简单起见,由于它是小型模型,因此我们不会像[第 6 章](../Text/06.html)*用自然语言描述图像*[ [第 9 章](../Text/09.html)*用 GAN* 生成和增强图像。 现在,我们准备在移动设备上使用该模型并编写代码以在 iOS 和 Android 设备上播放 Connect 4。
为简单起见,由于它是小型模型,因此我们不会像第 6 章,*用自然语言描述图像*和[ 第 9 章,*用 GAN* 生成和增强图像。 现在,我们准备在移动设备上使用该模型并编写代码以在 iOS 和 Android 设备上播放 Connect 4。
......@@ -837,7 +837,7 @@ int winners[69][4] = {
毫不奇怪,我们不需要像[第 7 章](../Text/07.html)*识别具有 CNN 和 LSTM* 的工程图那样使用自定义 Android 库来加载模型。 只需创建一个名称为 AlphaZero 的新 Android Studio 应用,将`alphazero19.pb` 模型文件 复制到新创建的素材资源文件夹,然后将 `compile 'org.tensorflow:tensorflow-android:+'` 行添加到 应用程序的`build.gradle`文件。
毫不奇怪,我们不需要像第 7 章,*识别具有 CNN 和 LSTM* 的工程图那样使用自定义 Android 库来加载模型。 只需创建一个名称为 AlphaZero 的新 Android Studio 应用,将`alphazero19.pb` 模型文件 复制到新创建的素材资源文件夹,然后将 `compile 'org.tensorflow:tensorflow-android:+'` 行添加到 应用程序的`build.gradle`文件。
我们首先创建一个新类`BoardView`,该类扩展了`View`并负责绘制游戏板以及 AI 和用户制作的棋子:
......
此差异已折叠。
......@@ -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 章](../Text/02.html)*通过转移学习*对图像进行分类时使用的模型,并通过文字转语音功能使机器人告诉我们它可以识别的内容 以及如何集成音频识别,这是我们在[第 5 章](../Text/05.html)*了解简单语音命令*中使用的模型以及 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 章](../Text/02.html)*使用*通过转移学习对图像进行分类一样,提供通过转移学习重新训练的模型。 ]参数在运行两个示例应用程序时。
默认情况下,摄像机示例还使用`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 源并进行构建。
......@@ -365,7 +365,7 @@ cmd.append("\"");
system(cmd.c_str());
```
现在,我们已经完成了 *如何使用 Cloud Vision 和 Speech API 演示*来构建智能 RasPi Bot 的图像分类和语音合成任务,而不使用任何 Cloud API。 使用我们在[第 5 章](../Text/05.html)*了解简单语音命令*中使用的相同模型,在 Raspberry Pi 上进行音频识别。
现在,我们已经完成了 *如何使用 Cloud Vision 和 Speech API 演示*来构建智能 RasPi Bot 的图像分类和语音合成任务,而不使用任何 Cloud API。 使用我们在第 5 章,*了解简单语音命令*中使用的相同模型,在 Raspberry Pi 上进行音频识别。
......@@ -375,9 +375,9 @@ system(cmd.c_str());
要使用 TensorFlow 教程中的[预训练音频识别模型](https://www.tensorflow.org/tutorials/audio_recognition)或我们之前描述的重新训练模型,我们将重用来自[这个页面](https://gist.github.com/aallan)的 Python 脚本`listen.py`,并在识别四个基本音频命令后添加 GoPiGo API 调用以控制机器人的运动:“左”,“右”,“去” ,”和“停止”。 预训练模型支持的其他六个命令-“是”,“否”,“向上”,“向下”,“打开”和“关闭”,在我们的示例中不太适用,如果需要 ,您可以使用[第 5 章](../Text/05.html)*了解简单语音命令*中所示的重新训练模型,以支持针对特定任务的其他语音命令。
要使用 TensorFlow 教程中的[预训练音频识别模型](https://www.tensorflow.org/tutorials/audio_recognition)或我们之前描述的重新训练模型,我们将重用来自[这个页面](https://gist.github.com/aallan)的 Python 脚本`listen.py`,并在识别四个基本音频命令后添加 GoPiGo API 调用以控制机器人的运动:“左”,“右”,“去” ,”和“停止”。 预训练模型支持的其他六个命令-“是”,“否”,“向上”,“向下”,“打开”和“关闭”,在我们的示例中不太适用,如果需要 ,您可以使用第 5 章*了解简单语音命令*中所示的重新训练模型,以支持针对特定任务的其他语音命令。
要运行脚本,请先从[这里](http://download.tensorflow.org/models/speech_commands_v0.01.zip)下载预训练的音频识别模型,然后将其解压缩到`/tmp`,或者对我们在[第 5 章](../Text/05.html)“了解简单语音命令”中使用的模型使用`scp`到 Pi 板的`/tmp`目录,然后运行:
要运行脚本,请先从[这里](http://download.tensorflow.org/models/speech_commands_v0.01.zip)下载预训练的音频识别模型,然后将其解压缩到`/tmp`,或者对我们在第 5 章“了解简单语音命令”中使用的模型使用`scp`到 Pi 板的`/tmp`目录,然后运行:
```py
python listen.py --graph /tmp/conv_actions_frozen.pb --labels /tmp/conv_actions_labels.txt -I plughw:1,0
......@@ -413,7 +413,7 @@ run(softmax_tensor, {
})
```
在这里,将`softmax_tensor`定义为 TensorFlow 图的`get_tensor_by_name(self.output_name_)`,将`output_name_``input_samples_name_``input_rate_name_`分别定义为`labels_softmax``decoded_sample_data:0``decoded_sample_data:1`,与 我们在[第 5 章](../Text/05.html)*了解简单语音命令*中的 iOS 和 Android 应用程序中使用过。
在这里,将`softmax_tensor`定义为 TensorFlow 图的`get_tensor_by_name(self.output_name_)`,将`output_name_``input_samples_name_``input_rate_name_`分别定义为`labels_softmax``decoded_sample_data:0``decoded_sample_data:1`,与 我们在第 5 章,*了解简单语音命令*中的 iOS 和 Android 应用程序中使用过。
在之前的章节中,我们主要使用 Python 训练和测试 TensorFlow 模型,然后再使用本机 TensorFlow C ++库的 Java 接口代码在使用 C ++或 Android 的 iOS 中运行模型。 在 Raspberry Pi 上,您可以选择直接使用 TensorFlow Python API 或 C ++ API 在 Pi 上运行 TensorFlow 模型,尽管通常仍会在功能更强大的模型上进行训练 电脑。 有关完整的 TensorFlow Python API 文档,请参见[这里](https://www.tensorflow.org/api_docs/python)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册