提交 99bc49af 编写于 作者: W wizardforcel

2020-12-17 23:17:00

上级 226c0f9e
......@@ -197,7 +197,7 @@
您一定已经意识到,这是艰巨的战斗! 为了对 GPS 进行编程,作者创建了一种新语言,称为**信息处理语言****IPL**)。 基本前提是使用一组格式正确的公式来表达任何问题。 这些公式将成为有多个源和汇的有向图的一部分。 在图中,源是指起始节点,宿是指终止节点。 对于 GPS,源是公理,汇是结论。
即使 GPS 只是通用的,它也只能解决明确定义的问题,例如证明几何和逻辑上的数学定理。 它还可以解决单词拼图和下棋。 原因是这些问题可以在合理范围内形式化。 但是在现实世界中,由于您可以采取多种可能的途径,因此这很快变得很棘手。 如果它试图通过计算图中的步数来强行解决问题,则完全无法计算 。
即使 GPS 只是通用的,它也只能解决明确定义的问题,例如证明几何和逻辑上的数学定理。 它还可以解决单词拼图和下棋。 原因是这些问题可以在合理范围内形式化。 但是在现实世界中,由于您可以采取多种可能的途径,因此这很快变得很棘手。 如果它试图通过计算图中的步数来强行解决问题,则完全无法计算 。
## 使用 GPS 解决问题
......
......@@ -659,7 +659,7 @@ X = quotes_diff.copy().T
X /= X.std(axis=0)
```
创建一个图模型:
创建一个图模型:
```
# Create a graph model
......
......@@ -27,7 +27,7 @@ Google 提供这些答案的基本技术之一就是通常所说的大数据。
图 1:大数据类比
这句话使人们明白,大数据对不同的人意味着不同的事物。 这种情况开始改变,但是传统数据库在我们可以存储多少信息以及可扩展的最大范围上有一个上限。 如果您正在使用 Hadoop,Spark,NoSQL 数据库和图数据库等新技术,那么您正在使用大数据。 没有什么是无限的,但是这些技术可以横向扩展(而不是纵向扩展),因此可以更有效地扩展规模。 没有任何东西可以无限扩展,但是在传统技术(如传统数据库)与新技术(如 Hadoop 和 Spark)之间存在根本差异。 随着供应商和诸如 Snowflake 之类的工具的出现,也开始使用普通的 SQL 处理 PB 级数据库。
这句话使人们明白,大数据对不同的人意味着不同的事物。 这种情况开始改变,但是传统数据库在我们可以存储多少信息以及可扩展的最大范围上有一个上限。 如果您正在使用 Hadoop,Spark,NoSQL 数据库和图数据库等新技术,那么您正在使用大数据。 没有什么是无限的,但是这些技术可以横向扩展(而不是纵向扩展),因此可以更有效地扩展规模。 没有任何东西可以无限扩展,但是在传统技术(如传统数据库)与新技术(如 Hadoop 和 Spark)之间存在根本差异。 随着供应商和诸如 Snowflake 之类的工具的出现,也开始使用普通的 SQL 处理 PB 级数据库。
随着业务的增长和对资源的需求的增加,如果他们使用的是传统架构,则他们将通过升级到更大,功能更强的计算机来扩展。 可以预见,这种增长方式将达到极限。 硬件制造商制造的机器只有这么大。
......@@ -335,13 +335,13 @@ Impala 可以轻松与 Hadoop 集成,并支持 MapReduce,Apache Hive 和 Apa
**文档数据库**:文档数据库用于存储半结构化数据。 他们使用与复杂的数据结构(称为文档)配对的键。 文档可以包含许多类型的数据结构,例如原始值(如整数,布尔值和字符串),不同的键值对或键数组对,甚至是嵌套文档。
**图数据库**:图形数据库将图形结构用于具有节点,边和属性的语义查询,以表示和存储数据。 图形数据库的重点是数据中的关系。 一些示例使用图数据库的案例:
**图数据库**:图数据库将图结构用于具有节点,边和属性的语义查询,以表示和存储数据。 图数据库的重点是数据中的关系。 一些示例使用图数据库的案例:
* Facebook 中包含的信息以及网络中朋友之间的关系。
* 交易,客户和银行帐户。 即,使用*帐户 X**客户 A* 向具有*帐户 Y**客户 B* 汇款。
* 一个家庭的祖先信息。 该案例中的关系示例包括配偶,兄弟姐妹,父母,孩子,叔叔等。
数据库的示例是:
图数据库的示例是:
* Neo4J
* Giraph
......@@ -380,7 +380,7 @@ Redis 是的另一个开源 NoSQL 数据库。 这是一个键值存储。 它
## Neo4j
Neo4j 是 Neo4j,Inc.开发的图形数据库管理系统。它最初于 2010 年 2 月发布。它在本机图形存储和处理中支持符合 ACID 的事务。 Neo4j 可能是最受欢迎的图形数据库。
Neo4j 是 Neo4j,Inc.开发的图数据库管理系统。它最初于 2010 年 2 月发布。它在本机图存储和处理中支持符合 ACID 的事务。 Neo4j 可能是最受欢迎的图数据库。
Neo4j 具有开源版本和付费版本。 Neo4j 的开源版本可通过 GPL3 许可的开源“社区版”获得,而通过开源商业许可证,您可以拥有在线备份和高可用性扩展。 Neo 还根据开源商业条款向这些扩展提供了 Neo4j 许可。
......
......@@ -786,7 +786,7 @@ tensorboard --logdir=logs
TensorBoard 的 GRAPHS 部分包含两个网络的图形 。 如果网络表现不佳,这些图可以帮助您调试网络。 它们还显示了每个图中的张量流和不同的运算:
TensorBoard 的`GRAPHS`部分包含两个网络的图 。 如果网络表现不佳,这些图可以帮助您调试网络。 它们还显示了每个图中的张量流和不同的运算:
![](img/411f5f33-a51c-4f61-a795-4fb06231ea00.png)
......
......@@ -1368,11 +1368,11 @@ tensorboard --logdir=logs
TensorBoard 的`GRAPHS`部分包含两个网络的图。 如果网络表现不佳,这些图可以帮助您调试网络。 它们还显示了每个图中的张量流和不同的操作:
TensorBoard 的`GRAPHS`部分包含两个网络的图。 如果网络表现不佳,这些图可以帮助您调试网络。 它们还显示了每个图中的张量流和不同的操作:
![](img/63d2ac6d-4141-47c4-8807-19efe0bb901e.png)
张量流和图内部的不同操作
张量流和图内部的不同操作
......
......@@ -944,7 +944,7 @@ tensorboard --logdir=logs
Tensorboard 的`GRAPHS`部分包含两个网络的图。 如果网络表现不佳,这些图可以帮助您调试网络。 它们还显示了每个图中的张量流和不同的操作:
Tensorboard 的`GRAPHS`部分包含两个网络的图。 如果网络表现不佳,这些图可以帮助您调试网络。 它们还显示了每个图中的张量流和不同的操作:
![](img/9bdd11ae-60a0-4d18-b9ba-9e9a46e9514f.png)
......
......@@ -1178,7 +1178,7 @@ tensorboard --logdir=logs
TensorBoard 的 GRAPHS 部分包含两个网络的图。 如果网络表现不佳,这些图可以帮助您调试网络。 它们还显示了每个图中的张量流和不同的运算:
TensorBoard 的 GRAPHS 部分包含两个网络的图。 如果网络表现不佳,这些图可以帮助您调试网络。 它们还显示了每个图中的张量流和不同的运算:
![](img/5d8ca1c2-04b5-4106-b5c6-5c96ca28ce46.png)
......
......@@ -1980,7 +1980,7 @@ tensorboard --logdir=logs
TensorBoard 的`GRAPHS`部分包含两个网络的图。 如果网络表现不佳,这些图可以帮助您调试网络。 它们还显示了每个图中的张量流和不同的操作:
TensorBoard 的`GRAPHS`部分包含两个网络的图。 如果网络表现不佳,这些图可以帮助您调试网络。 它们还显示了每个图中的张量流和不同的操作:
![](img/b2df0366-0c95-4e61-a490-7efa0da76e73.png)
......
......@@ -818,7 +818,7 @@ adversarial_model.compile(loss=['mse', 'mse', 'mae', 'mae', 'mae', 'mae'],
在开始训练之前,请执行以下两个基本步骤。 TensorBoard 将在后面的部分中使用:
添加 TensorBoard 来存储损失和图以用于可视化目的,如下所示:
添加 TensorBoard 来存储损失和图以用于可视化目的,如下所示:
```py
tensorboard = TensorBoard(log_dir="logs/{}".format(time.time()), write_images=True, write_grads=True,
......@@ -1076,7 +1076,7 @@ tensorboard --logdir=logs
TensorBoard 的`GRAPHS`部分包含两个网络的图。 如果网络表现不佳,这些图可以帮助您调试网络。 它们还显示了每个图中的张量流和不同的操作,如以下示例所示:
TensorBoard 的`GRAPHS`部分包含两个网络的图。 如果网络表现不佳,这些图可以帮助您调试网络。 它们还显示了每个图中的张量流和不同的操作,如以下示例所示:
![](img/9bd3d80d-905f-4e80-8eb0-ee3827a69a8c.png)
......@@ -1103,7 +1103,7 @@ CycleGAN 有许多应用。 在本章中,我们使用了 CycleGAN 将画作转
在本章中,我们学习了如何使用 CycleGAN 将绘画转换为照片。 我们从介绍 CyleGAN 入手,并探讨了 CycleGAN 所涉及的网络架构。 我们还探讨了训练 CycleGAN 所需的不同损失函数。 接下来是在 Keras 框架中实现 CycleGAN。 我们在`monet2photo`数据集上训练了 CycleGAN,并可视化了生成的图像,损失和不同网络的图。 在结束本章之前,我们探讨了 CycleGAN 的实际用例。
在本章中,我们学习了如何使用 CycleGAN 将绘画转换为照片。 我们从介绍 CyleGAN 入手,并探讨了 CycleGAN 所涉及的网络架构。 我们还探讨了训练 CycleGAN 所需的不同损失函数。 接下来是在 Keras 框架中实现 CycleGAN。 我们在`monet2photo`数据集上训练了 CycleGAN,并可视化了生成的图像,损失和不同网络的图。 在结束本章之前,我们探讨了 CycleGAN 的实际用例。
在下一章中,我们将在 pix2pix 网络上进行图像到图像的翻译。 在 pix2pix 中,我们将探索条件 GAN 进行图像翻译。
......
......@@ -1389,11 +1389,11 @@ TensorBoard 的标量部分
TensorBoard 的`GRAPHS`部分包含两个网络的图。 如果网络表现不佳,这些图可以帮助您调试网络。 它们还显示了每个图中的张量流和不同的操作:
TensorBoard 的`GRAPHS`部分包含两个网络的图。 如果网络表现不佳,这些图可以帮助您调试网络。 它们还显示了每个图中的张量流和不同的操作:
![](img/7c0476a9-d31c-4ef3-b3b3-2193680e7c0c.png)
张量流和每个图内部的不同操作
张量流和每个图内部的不同操作
......
......@@ -473,7 +473,7 @@ syn = poisson.rvs(mu, size=2000)
* 标签传播
* 半监督支持向量机
第一个称为**标签传播**,其目标是将一些样本的标签传播到更大的人群。 通过考虑一个图来实现此目标,其中每个顶点代表一个样本,并且使用距离函数对每个边缘进行加权。 通过迭代过程,所有标记的样本将一部分标记值发送给所有邻居,并重复该过程,直到标记停止更改为止。 该系统具有稳定点(即,不能再进化的配置),并且算法可以通过有限的迭代次数轻松达到目标。
第一个称为**标签传播**,其目标是将一些样本的标签传播到更大的人群。 通过考虑一个图来实现此目标,其中每个顶点代表一个样本,并且使用距离函数对每个边缘进行加权。 通过迭代过程,所有标记的样本将一部分标记值发送给所有邻居,并重复该过程,直到标记停止更改为止。 该系统具有稳定点(即,不能再进化的配置),并且算法可以通过有限的迭代次数轻松达到目标。
在所有可以根据相似性度量标记样本的情况下,标记传播都非常有用。 例如,在线商店可能有大量的客户群,但是只有 10% 的顾客公开了自己的性别。 如果特征向量足够丰富,可以代表男性和女性用户的常见行为,则可以使用标签传播算法来猜测尚未公开的用户性别。 当然,重要的是要记住,所有分配均基于类似样本具有相同标签的假设。 在许多情况下这可能是正确的,但是当特征向量的复杂性增加时,也会产生误导。
......
......@@ -46,7 +46,7 @@
可以管理非凸类的最常见算法家族之一是**谱聚类**。 主要思想是将数据集`X`投影到可以通过超球体捕获群集的空间(例如,使用 K-means)。 该结果可以通过不同的方式实现,但是由于该算法的目标是消除通用形状区域的凹面,因此第一步始终是`X`表示为图`{V,E}`,其中顶点`V ≡ X`,加权边通过参数`w[ij] ≥ 0`表示每对样本`x[i], x[j] ∈ X`的邻近性。 生成的图形可以是完整的(完全连接的),也可以仅在某些样本对之间具有边(即,不存在的权重的权重设置为零)。 在下图中,有一个局部图的示例:
可以管理非凸类的最常见算法家族之一是**谱聚类**。 主要思想是将数据集`X`投影到可以通过超球体捕获群集的空间(例如,使用 K-means)。 该结果可以通过不同的方式实现,但是由于该算法的目标是消除通用形状区域的凹面,因此第一步始终是`X`表示为图`{V,E}`,其中顶点`V ≡ X`,加权边通过参数`w[ij] ≥ 0`表示每对样本`x[i], x[j] ∈ X`的邻近性。 生成的图可以是完整的(完全连接的),也可以仅在某些样本对之间具有边(即,不存在的权重的权重设置为零)。 在下图中,有一个局部图的示例:
![](img/85a481c5-78cf-4e85-85b2-f8a8faa6cc13.png)
......@@ -60,7 +60,7 @@
![](img/ac69d18f-0a9d-4ea7-9837-d658e8d1b89c.png)
此方法简单且相当可靠,但是生成的图未完全连接。 通过采用如下定义的 RBF 可以轻松实现这种条件:
此方法简单且相当可靠,但是生成的图未完全连接。 通过采用如下定义的 RBF 可以轻松实现这种条件:
![](img/4f5ad428-6f15-48c6-9fdf-28243aa857ed.png)
......@@ -135,7 +135,7 @@ Y_pred_sc = sc.fit_predict(data)
原始数据集(左)。 谱聚类结果(中心)。 K 均值结果(右)
如您所见,K 均值将数据集沿`x`轴划分为两个球,而谱聚类成功地正确分离了两个正弦曲线。 只要群集的数量和`X`的维数都不太大(在这种情况下,拉普拉斯算子的本征分解会变得非常昂贵),该算法就非常强大。 此外,由于该算法基于图*切割*程序,因此,当群集数为偶数时,它非常适合。
如您所见,K 均值将数据集沿`x`轴划分为两个球,而谱聚类成功地正确分离了两个正弦曲线。 只要群集的数量和`X`的维数都不太大(在这种情况下,拉普拉斯算子的本征分解会变得非常昂贵),该算法就非常强大。 此外,由于该算法基于图*切割*程序,因此,当群集数为偶数时,它非常适合。
......
......@@ -749,7 +749,7 @@ has done all the 4+ trails in Moab without a tow. The 93 and later is even
better with the bigger engine and locking diffs.
```
因此,第一个帖子显然与图形有关,而第二个帖子是政治信息。 让我们为它们两者计算主题混合,如下所示:
因此,第一个帖子显然与绘画有关,而第二个帖子是政治信息。 让我们为它们两者计算主题混合,如下所示:
```py
print(Xl[100])
......
......@@ -506,7 +506,7 @@ ELBO 右侧的第二项是`log p(x|z; θ)`的期望值。 不难看出,这样
* 具有 32 个`3×3`过滤器,`1×1`跨距,ReLU 激活和相同填充的 2D 转置卷积
* 2D 转置卷积,带有 1`3×3`过滤器,`1×1`步幅,Sigmoid 激活,以及相同的填充
TensorFlow 完全控制了噪声的产生,并且基于理论部分中说明的技巧。 以下代码段显示了 DAG 的第一部分,其中包含图定义和编码器:
TensorFlow 完全控制了噪声的产生,并且基于理论部分中说明的技巧。 以下代码段显示了 DAG 的第一部分,其中包含图定义和编码器:
```py
import tensorflow as tf
......
......@@ -308,7 +308,7 @@ def discriminator(x, is_training=True, reuse_variables=True):
同样,在这种情况下,我们需要声明一个专用的变量作用域。 但是,由于判别器在两个不同的上下文中使用(即,对真实样本和生成样本的评估),我们需要在第二个声明中要求重用变量。 如果未设置此类标志,则对函数的每次调用都会产生新的变量集,对应于不同的标识符。
声明了两个主要组件后,我们可以初始化图并为 GAN 设置整个 DAG,如下所示:
声明了两个主要组件后,我们可以初始化图并为 GAN 设置整个 DAG,如下所示:
```py
import tensorflow as tf
......@@ -664,7 +664,7 @@ with graph.as_default():
通常,第一步是声明占位符,该占位符与 DCGAN 相同。 但是,由于已经针对 64×64 图像优化了模型(特别是卷积或转置卷积的序列),因此我们将使用`tf.image.resize_images()`方法来调整原始样本的大小。 此操作将导致有限的质量损失; 因此,在生产应用中,我强烈建议您使用针对原始输入大小优化的模型。 在生成器和标注器都声明之后(如我们在上一个示例中讨论的那样,由于需要分别优化损失函数,因此我们需要两个实例共享相同的变量),我们可以设置损失。 在这种情况下,它们的计算非常简单且快速,但是我们为此付出了代价,并为此网络可以应用更小的校正。 实际上,在这种情况下,我们并没有直接最小化批评者损失函数; 相反,我们首先使用运算符`optimizer_c`计算并应用梯度,然后使用运算符`training_step_c`裁剪所有评论者变量。 因为我们只想调用此运算符,所以已在使用指令`tf.control_dependencies([optimizer_c])`定义的上下文中声明了它。 这样,当请求一个会话来计算`traning_step_c`时,TensorFlow 将注意首先运行`optimizer_c`,但是只有在结果准备好后,才会执行 main 命令(简单地裁剪变量)。 正如我们在理论中所解释的那样,此步骤对于保证评论者仍然具有 L-Lipschitz 函数是必要的,因此,允许使用从 Kantorovich-Rubinstein 定理得到的简化 Wasserstein 距离表达式。
当图完全定义后,可以创建一个会话并初始化所有变量,如下所示:
当图完全定义后,可以创建一个会话并初始化所有变量,如下所示:
```py
import tensorflow as tf
......
......@@ -46,7 +46,7 @@ TensorFlow 是 Google 的开放源代码框架,用于构建机器学习 AI 应
第 6 章,“用自然语言描述图像”,介绍了图像字幕的工作原理,然后介绍了如何训练和冻结图像字幕模型 TensorFlow。 我们将进一步讨论如何转换和优化复杂的模型,以使其可以在移动设备上运行。 最后,我们将使用该模型提供完整的 iOS 和 Android 应用,以生成图像的自然语言描述。
第 7 章,“使用 CNN 和 LSTM 识别图形”,解释了图形分类的工作原理,并讨论了如何训练,预测和准备模型。 然后,我们将向您展示如何构建另一个自定义 TensorFlow iOS 库,以在有趣的 iOS 涂鸦应用中使用该模型。 最后,我们将向您展示如何构建自定义的 TensorFlow Android 库来修复新的模型加载错误,然后在您自己的 Android 应用中使用该模型。
第 7 章,“使用 CNN 和 LSTM 识别绘画”,解释了绘画分类的工作原理,并讨论了如何训练,预测和准备模型。 然后,我们将向您展示如何构建另一个自定义 TensorFlow iOS 库,以在有趣的 iOS 涂鸦应用中使用该模型。 最后,我们将向您展示如何构建自定义的 TensorFlow Android 库来修复新的模型加载错误,然后在您自己的 Android 应用中使用该模型。
第 8 章,“使用 RNN 预测股票价格”带领您完成 RNN 以及如何使用它预测股票价格。 然后,我们将向您介绍如何使用 TensorFlow API 构建 RNN 模型以预测股价,以及如何使用易于使用的 Keras API 构建 RNN LSTM 模型以实现相同的目标。 我们将测试并查看此类模型是否可以击败随机购买或出售策略。 最后,我们将向您展示如何在 iOS 和 Android 应用中运行 TensorFlow 和 Keras 模型。
......@@ -68,7 +68,7 @@ TensorFlow 是 Google 的开放源代码框架,用于构建机器学习 AI 应
我们建议您先按顺序阅读前四章,然后运行[这里](http://github.com/jeffxtang/mobiletfbook)。 这将帮助您确保已为 TensorFlow 移动应用开发设置了全部开发环境,并且知道如何将 TensorFlow 集成到自己的 iOS 和/或 Android 应用中。 如果您是 iOS 开发人员,还将学习如何在 TensorFlow 中使用 Objective-C 或 Swift,以及何时以及如何使用 TensorFlow pod 或手动 TensorFlow iOS 库。
然后,如果您需要构建自定义的 TensorFlow Android 库,请转到第 7 章,“使用 CNN 和 LSTM 识别图形”,以及如果您想学习如何在您的移动应用中使用 Keras 模型,请查看第 8 章,“使用 RNN 预测股价”,和第 10 章, “构建类似 AlphaZero 的手机游戏应用” 。
然后,如果您需要构建自定义的 TensorFlow Android 库,请转到第 7 章,“使用 CNN 和 LSTM 识别绘画”,以及如果您想学习如何在您的移动应用中使用 Keras 模型,请查看第 8 章,“使用 RNN 预测股价”,和第 10 章, “构建类似 AlphaZero 的手机游戏应用” 。
如果您对 TensorFlow Lite 或 Core ML 更感兴趣,请阅读第 11 章,“在移动设备上使用 TensorFlow Lite 和 Core ML”,以及您对 Raspberry Pi 上的 TensorFlow 或 TensorFlow 中的强化学习最感兴趣,请跳至第 12 章,“在 Raspberry Pi 上开发 TensorFlow 应用”。
......
......@@ -127,7 +127,7 @@ n02090379 redbone (32): 0.00943663
n02088364 beagle (20): 0.00672507
```
`--input_layer (Mul)``--output_layer (final_result)`的值非常重要–必须与模型中定义的值相同,这样分类才能完全起作用。 如果您想知道如何获取它们(从图,aka 模型,文件`dog_retrained.pb`中获取),则有两个 TensorFlow 工具可能会有所帮助。 第一个是适当命名的`summarize_graph`。 这是构建和运行它的方法:
`--input_layer (Mul)``--output_layer (final_result)`的值非常重要–必须与模型中定义的值相同,这样分类才能完全起作用。 如果您想知道如何获取它们(从图,aka 模型,文件`dog_retrained.pb`中获取),则有两个 TensorFlow 工具可能会有所帮助。 第一个是适当命名的`summarize_graph`。 这是构建和运行它的方法:
```py
bazel build tensorflow/tools/graph_transforms:summarize_graph
......@@ -254,7 +254,7 @@ bazel-bin/tensorflow/tools/graph_transforms/transform_graph
在测试中使用`label_image`脚本可以正确运行`quantized_stripped_dogs_retrained.pb``transform_dog_retrained.pb`。 但是只有第一个可以在 iOS 和 Android 应用中正常工作。
有关图转换工具的详细文档,请参见其 [GitHub README](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/graph_transforms/README.md)
有关图转换工具的详细文档,请参见其 [GitHub README](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/graph_transforms/README.md)
......@@ -302,7 +302,7 @@ n02087394 rhodesian ridgeback (105): 0.00528782
n02090379 redbone (32): 0.0035457
```
请注意,在运行`label_image`时,`input_layer`名为`input`。 我们可以使用交互式 iPython 代码或之前看到的摘要图形工具找到该名称:
请注意,在运行`label_image`时,`input_layer`名为`input`。 我们可以使用交互式 iPython 代码或之前看到的图摘要工具找到该名称:
```py
bazel-bin/tensorflow/tools/graph_transforms/summarize_graph
......@@ -339,7 +339,7 @@ bazel-bin/tensorflow/tools/benchmark/benchmark_model
您将获得相当长的输出,最后会有一行像 FLOPS 的估计值:11.42B,这意味着它将使用基于 Inception v3 的重新训练模型约 11B FLOPS(浮点运算)进行推断。 iPhone 6 运行大约 2 B FLOPS,因此在 iPhone 6 上运行模型大约需要 5–6 秒。 其他现代智能手机可以运行 10B FLOPS。
通过将图文件替换为基于 MobileNet 模型的重新训练模型`dog_retrained_mobilenet10_224.pb`并重新运行基准测试工具,您将看到 FLOPS 估计值变为约 1.14B,大约快了 10 倍。
通过将图文件替换为基于 MobileNet 模型的重新训练模型`dog_retrained_mobilenet10_224.pb`并重新运行基准测试工具,您将看到 FLOPS 估计值变为约 1.14B,大约快了 10 倍。
......@@ -588,7 +588,7 @@ UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Pick a
}
```
与调用 TensorFlow 相关的核心代码在`RunInferenceOnImage`方法中,该方法基于 TensorFlow iOS 简单应用进行了略微修改,包括首先创建一个 TensorFlow 会话和一个图
与调用 TensorFlow 相关的核心代码在`RunInferenceOnImage`方法中,该方法基于 TensorFlow iOS 简单应用进行了略微修改,包括首先创建一个 TensorFlow 会话和一个图:
```py
tensorflow::Session* session_pointer = nullptr;
......
......@@ -433,7 +433,7 @@ python object_detection/export_inference_graph.py \
在上一章中,我们向您展示了如何使用 TensorFlow 实验性容器将 TensorFlow 快速添加到您的 iOS 应用中。 TensorFlow 实验性 Pod 在诸如 Inception 和 MobileNet 之类的模型或其经过重新训练的模型中工作良好。 但是,如果至少在撰写本文时(2018 年 1 月)使用 TensorFlow 实验荚,并使用`SSD_MobileNet`模型,则在加载`ssd_mobilenet`文件时可能会收到以下错误消息:
在上一章中,我们向您展示了如何使用 TensorFlow 实验性容器将 TensorFlow 快速添加到您的 iOS 应用中。 TensorFlow 实验性 Pod 在诸如 Inception 和 MobileNet 之类的模型或其经过重新训练的模型中工作良好。 但是,如果至少在撰写本文时(2018 年 1 月)使用 TensorFlow 实验荚,并使用`SSD_MobileNet`模型,则在加载`ssd_mobilenet`图文件时可能会收到以下错误消息:
```py
Could not create TensorFlow Graph: Not found: Op type not registered 'NonMaxSuppressionV2'
......@@ -673,7 +673,7 @@ conda install -c derickl tensorflow
接下来,我们需要下载经过预训练的 YOLO 模型的权重-我们将尝试两个 Tiny-YOLO 模型,它们超级快,但不如完整的 YOLO 模型准确。 同时运行 Tiny-YOLO 模型和 YOLO 模型的 iOS 代码几乎相同,因此我们仅向您展示如何运行 Tiny-YOLO 模型。
您可以在 YOLO2 官方网站上下载 tiny-yolo-voc(受 20 个对象类的 PASCAL VOC 数据集训练)和 tiny-yolo(受 80 个对象类的 MS COCO 数据集训练)的权重和配置文件。 或 darkflow 仓库。 现在,运行以下命令将权重转换为 TensorFlow 图文件:
您可以在 YOLO2 官方网站上下载 tiny-yolo-voc(受 20 个对象类的 PASCAL VOC 数据集训练)和 tiny-yolo(受 80 个对象类的 MS COCO 数据集训练)的权重和配置文件。 或 darkflow 仓库。 现在,运行以下命令将权重转换为 TensorFlow 图文件:
```py
flow --model cfg/tiny-yolo-voc.cfg --load bin/tiny-yolo-voc.weights --savepb
......
......@@ -79,7 +79,7 @@ python evaluate.py --checkpoint checkpoints \
--out-path examples/content/dog-output.jpg
```
6. 运行以下命令以构建一个 TensorFlow 图形文件,该文件将图形定义和检查点中的权重结合在一起。 这将创建一个大约 6.7MB 的`.pb`文件:
6. 运行以下命令以构建一个 TensorFlow 图文件,该文件将图定义和检查点中的权重结合在一起。 这将创建一个大约 6.7MB 的`.pb`文件:
```py
python freeze.py --model_folder=checkpoints_ios --output_graph fst_frozen.pb
......@@ -95,7 +95,7 @@ bazel-bin/tensorflow/tools/quantization/quantize_graph \
--mode=weights
```
这会将冻结的图文件大小从 6.7MB 减小到 1.7MB,这意味着,如果在您的应用中放置 50 种不同风格的 50 个模型,则增加的大小将约为 85MB。 苹果于 2017 年 9 月宣布,蜂窝无线应用下载限制已增加至 150MB,因此用户仍应能够通过蜂窝网络下载具有 50 多种不同样式的应用。
这会将冻结的图文件大小从 6.7MB 减小到 1.7MB,这意味着,如果在您的应用中放置 50 种不同风格的 50 个模型,则增加的大小将约为 85MB。 苹果于 2017 年 9 月宣布,蜂窝无线应用下载限制已增加至 150MB,因此用户仍应能够通过蜂窝网络下载具有 50 多种不同样式的应用。
这就是使用样式图像和输入图像来训练和量化快速神经迁移模型的全部步骤。 您可以在步骤 3 中生成的 `test_dir` 目录中签出生成的图像,以查看样式迁移的效果。 如果需要,您可以使用[中记录的超参数 https://github.com/jeffxtang/fast-style-transfer/blob/master/docs.md#style](https://github.com/jeffxtang/fast-style-transfer/blob/master/docs.md#style) 进行查看,以及希望样式迁移效果更好。
......
......@@ -72,7 +72,7 @@ python tensorflow/examples/speech_commands/train.py
您可以使用许多参数:`--wanted_words`默认为以`yes`开头的 10 个核心词; 您可以使用此参数添加更多可以被模型识别的单词。 要训​​练自己的语音命令数据集,请使用`--data_url --data_dir=<path_to_your_dataset>`禁用语音命令数据集的下载并访问您自己的数据集,其中每个命令应命名为自己的文件夹,其中应包含 1000-2000 个音频剪辑,大约需要 1 秒钟的长度; 如果音频片段更长,则可以相应地更改`--clip_duration_ms`参数值。 有关更多详细信息,请参见`train.py`源代码和 TensorFlow 简单音频识别教程。
3. 如果您接受`train.py`的所有默认参数,则在下载 1.48GB 语音命令数据集之后,在 GTX-1070 GPU 驱动的 Ubuntu 上,完成 18,000 个步骤的整个训练大约需要 90 分钟。 训练完成后,您应该在`/tmp/speech_commands_train`文件夹内看到检查点文件的列表,以及`conv.pbtxt`定义文件和名为`conv_labels.txt`的标签文件,其中包含命令列表(与命令列表相同)。 `--wanted_words`参数是默认值或设置为,在文件的开头加上两个附加词`_silence``_unknown`):
3. 如果您接受`train.py`的所有默认参数,则在下载 1.48GB 语音命令数据集之后,在 GTX-1070 GPU 驱动的 Ubuntu 上,完成 18,000 个步骤的整个训练大约需要 90 分钟。 训练完成后,您应该在`/tmp/speech_commands_train`文件夹内看到检查点文件的列表,以及`conv.pbtxt`图定义文件和名为`conv_labels.txt`的标签文件,其中包含命令列表(与命令列表相同)。 `--wanted_words`参数是默认值或设置为,在文件的开头加上两个附加词`_silence``_unknown`):
```py
-rw-rw-r-- 1 jeff jeff 75437 Dec 9 21:08 conv.ckpt-18000.meta
......@@ -112,7 +112,7 @@ stop
go
```
现在运行以下命令,将图定义文件和检查点文件组合成一个我们可以在移动应用中使用的模型文件:
现在运行以下命令,将图定义文件和检查点文件组合成一个我们可以在移动应用中使用的模型文件:
```py
python tensorflow/examples/speech_commands/freeze.py \
......@@ -151,7 +151,7 @@ No variables spotted.
Found 1 possible outputs: (name=labels_softmax, op=Softmax)
```
不幸的是,它仅对于输出名称是正确的,并且不显示其他可能的输入。 使用`tensorboard --logdir /tmp/retrain_logs`,然后在浏览器中打开`http://localhost:6006`与图进行交互也无济于事。 但是,前面各章中显示的小代码段可以帮助您了解输入和输出名称,以下内容与 iPython 进行了交互:
不幸的是,它仅对于输出名称是正确的,并且不显示其他可能的输入。 使用`tensorboard --logdir /tmp/retrain_logs`,然后在浏览器中打开`http://localhost:6006`与图进行交互也无济于事。 但是,前面各章中显示的小代码段可以帮助您了解输入和输出名称,以下内容与 iPython 进行了交互:
```py
In [1]: import tensorflow as tf
......
......@@ -138,7 +138,7 @@ ls -lt $MODEL_DIR/train
-rw-rw-r-- 1 jeff jeff 4812699 Feb 6 14:27 graph.pbtxt
```
您可以告诉每 10 分钟生成一组检查点文件(`model.ckpt-109068.*``model.ckpt-109332.*``model.ckpt-109587.*`)。 `graph.pbtxt`是模型的图形定义文件(以文本格式),`model.ckpt-??????.meta`文件还包含模型的图形定义,以及特定检查点的其他一些元数据,例如`model.ckpt-109587.data-00000-of-00001`(请注意, 大小几乎为 150MB,因为所有网络参数都保存在此处)。
您可以告诉每 10 分钟生成一组检查点文件(`model.ckpt-109068.*``model.ckpt-109332.*``model.ckpt-109587.*`)。 `graph.pbtxt`是模型的图定义文件(以文本格式),`model.ckpt-??????.meta`文件还包含模型的图定义,以及特定检查点的其他一些元数据,例如`model.ckpt-109587.data-00000-of-00001`(请注意, 大小几乎为 150MB,因为所有网络参数都保存在此处)。
5. 测试字幕生成,如下所示:
......@@ -174,7 +174,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`):
* `--input_graph``--input_meta_graph`:模型的图定义文件。 例如,在上一节的第 4 步的命令`ls -lt $MODEL_DIR/train`的输出中,`model.ckpt-109587.meta`是一个元图文件,其中包含模型的图定义和其他与检查点相关的元数据,而`graph.pbtxt`只是模型的图定义。
* `--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` 的完整文件名。
* `--output_graph`:冻结模型文件的路径–这是在移动设备上使用的路径。
......@@ -230,7 +230,7 @@ tf.nn.softmax(logits, name="softmax")
我们输入`input_feed``state_feed`,然后返回`softmax``state`。 总共三个输入节点名称和三个输出名称。
注意,仅当`mode`为“推断”时才创建这些节点,因为`train.py``run_inference.py`都使用了 `show_and_tell_model.py`。 这意味着在运行`run_inference.py`脚本后,将修改在步骤 5 中使用`train`生成的`--checkpoint_path`中模型的图形定义文件和权重。 那么,我们如何保存更新的图形定义和检查点文件?
注意,仅当`mode`为“推断”时才创建这些节点,因为`train.py``run_inference.py`都使用了 `show_and_tell_model.py`。 这意味着在运行`run_inference.py`脚本后,将修改在步骤 5 中使用`train`生成的`--checkpoint_path`中模型的图定义文件和权重。 那么,我们如何保存更新的图定义和检查点文件?
事实证明,在`run_inference.py`中,在创建 TensorFlow 会话后,还有一个调用`restore_fn(sess)`来加载检查点文件,并且该调用在`inference_utils/inference_wrapper_base.py`中定义:
......@@ -239,7 +239,7 @@ def _restore_fn(sess):
saver.restore(sess, checkpoint_path)
```
在启动`run_inference.py`之后到达`saver.restore`调用时,已进行了更新的图形定义,因此我们可以在此处保存新的检查点和图形文件,从而使`_restore_fn`函数如下:
在启动`run_inference.py`之后到达`saver.restore`调用时,已进行了更新的图定义,因此我们可以在此处保存新的检查点和图文件,从而使`_restore_fn`函数如下:
```py
def _restore_fn(sess):
......@@ -250,7 +250,7 @@ def _restore_fn(sess):
tf.summary.FileWriter("logdir", sess.graph_def)
```
`tf.train.write_graph(sess.graph_def, "model", 'im2txt4.pbtxt')`行是可选的,因为当通过调用`saver.save`保存新的检查点文件时,也会生成一个元文件,`freeze_graph.py`可以将其与检查点文件一起使用。 但是对于那些希望以纯文本格式查看所有内容,或者在冻结模型时更喜欢使用带有`--in_graph`参数的图形定义文件的人来说,它是在这里生成的。 最后一行`tf.summary.FileWriter("logdir", sess.graph_def)`也是可选的,但它会生成一个可由 TensorBoard 可视化的事件文件。 因此,有了这些更改,在再次运行`run_inference.py`之后(除非首先直接使用 Python 运行`run_inference.py`,否则请记住首先运行`bazel build -c opt //im2txt:run_inference`),您将在`model`目录中看到以下新的检查点文件和新的图形定义文件:
`tf.train.write_graph(sess.graph_def, "model", 'im2txt4.pbtxt')`行是可选的,因为当通过调用`saver.save`保存新的检查点文件时,也会生成一个元文件,`freeze_graph.py`可以将其与检查点文件一起使用。 但是对于那些希望以纯文本格式查看所有内容,或者在冻结模型时更喜欢使用带有`--in_graph`参数的图定义文件的人来说,它是在这里生成的。 最后一行`tf.summary.FileWriter("logdir", sess.graph_def)`也是可选的,但它会生成一个可由 TensorBoard 可视化的事件文件。 因此,有了这些更改,在再次运行`run_inference.py`之后(除非首先直接使用 Python 运行`run_inference.py`,否则请记住首先运行`bazel build -c opt //im2txt:run_inference`),您将在`model`目录中看到以下新的检查点文件和新的图定义文件:
```py
jeff@AiLabby:~/tensorflow-1.5.0/models/research/im2txt$ ls -lt model
......@@ -271,7 +271,7 @@ total 2124
Running the `bazel build` command to build a TensorFlow Python script is optional. You can just run the Python script directly. For example, we can run `python tensorflow/python/tools/freeze_graph.py` without building it first with `bazel build tensorflow/python/tools:freeze_graph` then running `bazel-bin/tensorflow/python/tools/freeze_graph`. But be aware that running the Python script directly will use the version of TensorFlow you’ve installed via pip, which may be different from the version you’ve downloaded as source and built by the `bazel build` command. This can be the cause of some confusing errors so be sure you know the TensorFlow version used to run a script. In addition, for a C++ based tool, you have to build it first with bazel before you can run it. For example, the `transform_graph` tool, which we'll see soon, is implemented in `transform_graph.cc` located at `tensorflow/tools/graph_transforms`; another important tool called `convert_graphdef_memmapped_format`, which we'll use for our iOS app later, is also implemented in C++ located at `tensorflow/contrib/util`.
现在我们到了,让我们快速使用 TensorBoard 看一下我们的图–只需运行`tensorboard --logdir logdir`,然后从浏览器中打开`http://localhost:6006`。 图 6.1 显示了三个输出节点名称(顶部为`softmax`,以及`lstm/initial_state`和红色矩形顶部的突出显示的`lstm/state`)和一个输入节点名称(底部的`state_feed`):
现在我们到了,让我们快速使用 TensorBoard 看一下我们的图–只需运行`tensorboard --logdir logdir`,然后从浏览器中打开`http://localhost:6006`。 图 6.1 显示了三个输出节点名称(顶部为`softmax`,以及`lstm/initial_state`和红色矩形顶部的突出显示的`lstm/state`)和一个输入节点名称(底部的`state_feed`):
![](img/d47ea13b-441c-4fb1-bccc-bbceaf2a8bdf.png)
......@@ -297,13 +297,13 @@ python tensorflow/python/tools/freeze_graph.py --input_meta_graph=/home/jeff/ten
请注意,我们在这里使用元图文件以及将`--input_binary`参数设置为`true`,因为默认情况下它为`false`,这意味着`freeze_graph`工具期望输入图或元图文件为文本格式。
您可以使用文本格式的图文件作为输入,在这种情况下,无需提供`--input_binary`参数:
您可以使用文本格式的图文件作为输入,在这种情况下,无需提供`--input_binary`参数:
```py
python tensorflow/python/tools/freeze_graph.py --input_graph=/home/jeff/tensorflow-1.5.0/models/research/im2txt/model/image2text.pbtxt --input_checkpoint=/home/jeff/tensorflow-1.5.0/models/research/im2txt/model/image2text --output_graph=/tmp/image2text_frozen2.pb --output_node_names="softmax,lstm/initial_state,lstm/state"
```
两个输出图文件`image2text_frozen.pb``image2text_frozen2.pb`的大小会稍有不同,但是在经过转换和可能的优化后,它们在移动设备上使用时,它们的行为完全相同。
两个输出图文件`image2text_frozen.pb``image2text_frozen2.pb`的大小会稍有不同,但是在经过转换和可能的优化后,它们在移动设备上使用时,它们的行为完全相同。
......@@ -956,7 +956,7 @@ mHandler.sendMessage(msg);
在本章中,我们首先讨论了由现代端到端深度学习支持的图像字幕如何工作,然后总结了如何使用 TensorFlow im2txt 模型项目训练这种模型。 我们详细讨论了如何找到正确的输入节点名称和输出节点名称,以及如何冻结模型,然后使用最新的图转换工具和映射转换工具修复在将模型加载到手机上时出现的一些讨厌的错误。 之后,我们展示了有关如何使用模型构建 iOS 和 Android 应用以及如何使用模型的 LSTM RNN 组件进行新的序列推断的详细教程。
在本章中,我们首先讨论了由现代端到端深度学习支持的图像字幕如何工作,然后总结了如何使用 TensorFlow im2txt 模型项目训练这种模型。 我们详细讨论了如何找到正确的输入节点名称和输出节点名称,以及如何冻结模型,然后使用最新的图转换工具和映射转换工具修复在将模型加载到手机上时出现的一些讨厌的错误。 之后,我们展示了有关如何使用模型构建 iOS 和 Android 应用以及如何使用模型的 LSTM RNN 组件进行新的序列推断的详细教程。
令人惊讶的是,经过训练了成千上万个图像字幕示例,并在现代 CNN 和 LSTM 模型的支持下,我们可以构建和使用一个模型,该模型可以在移动设备上生成合理的自然语言描述。 不难想象可以在此基础上构建什么样的有用应用。 我们喜欢福尔摩斯吗? 当然不。 我们已经在路上了吗? 我们希望如此。 AI 的世界既令人着迷又充满挑战,但是只要我们不断取得稳步进步并改善自己的学习过程,同时又避免了梯度问题的消失和爆炸,我们就有很大机会建立一个类似于 Holmes 的模型,并可以随时随地在一天中在移动应用中使用它。
......
......@@ -30,13 +30,13 @@
[TensorFlow 教程](https://www.tensorflow.org/tutorials/recurrent_quickdraw)中内置的绘画分类模型,首先接受表示为点列表的用户绘画输入,并将规范化输入转换为连续点的增量的张量,以及有关每个点是否是新笔画的开始的信息。 然后将张量穿过几个卷积层和 LSTM 层,最后穿过 softmax 层,如图 7.1 所示,以对用户图形进行分类:
[TensorFlow 教程](https://www.tensorflow.org/tutorials/recurrent_quickdraw)中内置的绘画分类模型,首先接受表示为点列表的用户绘画输入,并将规范化输入转换为连续点的增量的张量,以及有关每个点是否是新笔画的开始的信息。 然后将张量穿过几个卷积层和 LSTM 层,最后穿过 softmax 层,如图 7.1 所示,以对用户绘画进行分类:
![](img/ef475044-6568-4e50-bc98-8ff0a0d6efbf.png)
图 7.1:绘画分类模式
与接受 2D 图像输入的 2D 卷积 API `tf.layers.conv2d` 不同,此处将 1D 卷积 API `tf.layers.conv1d`用于时间卷积(例如绘画)。 默认情况下,在图形分类模型中,使用三个 1D 卷积层,每个层具有 48、64 和 96 个过滤器,其长度分别为 5、5 和 3。 卷积层之后,将创建 3 个 LSTM 层,每层具有 128 个正向`BasicLSTMCell`节点和 128 个反向`BasicLSTMCell`节点,然后将其用于创建动态双向循环神经网络,该网络的输出将发送到最终的完全连接层以计算`logits`(非标准化的对数概率)。
与接受 2D 图像输入的 2D 卷积 API `tf.layers.conv2d` 不同,此处将 1D 卷积 API `tf.layers.conv1d`用于时间卷积(例如绘画)。 默认情况下,在绘画分类模型中,使用三个 1D 卷积层,每个层具有 48、64 和 96 个过滤器,其长度分别为 5、5 和 3。 卷积层之后,将创建 3 个 LSTM 层,每层具有 128 个正向`BasicLSTMCell`节点和 128 个反向`BasicLSTMCell`节点,然后将其用于创建动态双向循环神经网络,该网络的输出将发送到最终的完全连接层以计算`logits`(非标准化的对数概率)。
If you don't have a good understanding of all these details, don't worry; to develop powerful mobile apps using a model built by others, you don't have to understand all the details, but in the next chapter we'll also discuss in greater detail how you can build a RNN model from scratch for stock prediction, and with that, you'll have a better understanding of all the RNN stuff.
......@@ -120,10 +120,10 @@ drwxr-xr-x 2 jeff jeff 4096 Feb 12 00:11 eval
* `tf.estimator.ModeKeys.EVAL`
* `tf.estimator.ModeKeys.PREDICT`
实现`train_model.py`的方式支持训练和求值模式,但是您不能直接使用它来通过特定的图形输入进行推理(对图形进行分类)。 要使用特定输入来测试预测,请按照以下步骤操作:
实现`train_model.py`的方式支持训练和求值模式,但是您不能直接使用它来通过特定的绘画输入进行推理(对绘画进行分类)。 要使用特定输入来测试预测,请按照以下步骤操作:
1. 复制`train_model.py`,然后将新文件重命名为`predict.py`-这样您就可以更自由地进行预测了。
2.`predict.py`中,定义[预测]的输入函数,并将`features`设置为模型期望的图形输入(连续点的增量,其中第三个数字表示该点是否为笔划的起点) :
2.`predict.py`中,定义[预测]的输入函数,并将`features`设置为模型期望的绘画输入(连续点的增量,其中第三个数字表示该点是否为笔划的起点) :
```py
def predict_input_fn():
......@@ -155,7 +155,7 @@ def predict_input_fn():
我们并没有显示所有的点值,但它们是使用 TensorFlow RNN 用于绘画分类的教程中显示的示例猫示例数据创建的,并应用了`parse_line`函数(请参见教程或`models/tutorials/rnn/quickdraw`文件夹中的`create_dataset.py` 细节)。
还要注意,我们使用`tf.data.Dataset``make_one_shot_iterator`方法创建了一个迭代器,该迭代器从数据集中返回一个示例(在这种情况下,我们在数据集中只有一个示例),与模型在处理大型数据集时,在训练和评估过程中获取数据的方式相同–这就是为什么稍后在模型的图中看到`OneShotIterator`操作的原因。
还要注意,我们使用`tf.data.Dataset``make_one_shot_iterator`方法创建了一个迭代器,该迭代器从数据集中返回一个示例(在这种情况下,我们在数据集中只有一个示例),与模型在处理大型数据集时,在训练和评估过程中获取数据的方式相同–这就是为什么稍后在模型的图中看到`OneShotIterator`操作的原因。
3. 在主函数中,调用估计器的`predict`方法,该方法将生成给定特征的预测,然后打印下一个预测:
......@@ -234,7 +234,7 @@ strip_unused_nodes(name=Squeeze,type_for_name=int64,shape_for_name="8",name=Resh
我们首先需要了解有关`IsVariableInitialized`的更多信息。 如果我们回到 TensorBoard `GRAPHS`标签,我们会在左侧看到一个`IsVariableInitialized`操作,该操作以红色突出显示并在右侧的信息面板中以`global_step`作为其输入(图 7.6)。
即使我们不确切知道它的用途,我们也可以确保它与模型推断无关,该模型推断只需要一些输入(图 7.4 和图 7.5)并生成图形分类作为输出(图 7.3)。 :
即使我们不确切知道它的用途,我们也可以确保它与模型推断无关,该模型推断只需要一些输入(图 7.4 和图 7.5)并生成绘画分类作为输出(图 7.3)。 :
![](img/6cc9946c-dfb2-41de-af95-a35e47d405a7.png)
......@@ -772,7 +772,7 @@ public class QuickDrawView extends View {
}
```
4. 覆盖方法`onTouchEvent`用于填充`mConsecutivePoints``mAllPoints`,调用画布的`drawPath`方法,使图形无效(以调用`onDraw`方法),以及(每次使用`MotionEvent.ACTION_UP`完成笔划线),以启动一个新线程以使用模型对图形进行分类:
4. 覆盖方法`onTouchEvent`用于填充`mConsecutivePoints``mAllPoints`,调用画布的`drawPath`方法,使图无效(以调用`onDraw`方法),以及(每次使用`MotionEvent.ACTION_UP`完成笔划线),以启动一个新线程以使用模型对绘画进行分类:
```py
@Override
......@@ -807,7 +807,7 @@ public class QuickDrawView extends View {
}
```
5. 定义两个将由`MainActivity`调用的公共方法,以获取所有点并在用户点击重新启动按钮后重置图形
5. 定义两个将由`MainActivity`调用的公共方法,以获取所有点并在用户点击重新启动按钮后重置绘画
```py
public List<List<Pair<Float, Float>>> getAllPoints() {
......@@ -1047,7 +1047,7 @@ private double[] normalizeScreenCoordinates() {
在本章中,我们首先描述了绘画分类模型的工作原理,然后介绍了如何使用高级 TensorFlow Estimator API 训练这种模型。 我们研究了如何编写 Python 代码以使用经过训练的模型进行预测,然后详细讨论了如何找到正确的输入和输出节点名称以及如何以正确的方式冻结和转换模型以使移动应用可以使用它。 我们还提供了一种新方法来构建新的 TensorFlow 自定义 iOS 库,并提供了一个逐步教程,以构建适用于 Android 的 TensorFlow 自定义库,以修复使用模型时的运行时错误。 最后,我们展示了 iOS 和 Android 代码,这些代码捕获并显示用户图形,将其转换为模型所需的数据,并处理和呈现模型返回的分类结果。 希望您在漫长的旅途中学到了很多东西。
在本章中,我们首先描述了绘画分类模型的工作原理,然后介绍了如何使用高级 TensorFlow Estimator API 训练这种模型。 我们研究了如何编写 Python 代码以使用经过训练的模型进行预测,然后详细讨论了如何找到正确的输入和输出节点名称以及如何以正确的方式冻结和转换模型以使移动应用可以使用它。 我们还提供了一种新方法来构建新的 TensorFlow 自定义 iOS 库,并提供了一个逐步教程,以构建适用于 Android 的 TensorFlow 自定义库,以修复使用模型时的运行时错误。 最后,我们展示了 iOS 和 Android 代码,这些代码捕获并显示用户绘画,将其转换为模型所需的数据,并处理和呈现模型返回的分类结果。 希望您在漫长的旅途中学到了很多东西。
到目前为止,除了来自其他开放源代码项目的几个模型以外,所有由我们自己进行预训练或训练的模型,我们在 iOS 和 Android 应用中使用的都是 TensorFlow 开放源代码项目,当然,该项目提供了大量强大的模型,其中一些模型在强大的 GPU 上进行了数周的训练。 但是,如果您有兴趣从头开始构建自己的模型,并且还对本章中使用和应用的强大 RNN 模型以及概念感到困惑,那么下一章就是您所需要的:我们将讨论如何从头开始构建自己的 RNN 模型并在移动应用中使用它,从而带来另一种乐趣-从股市中赚钱-至少我们会尽力做到这一点。 当然,没有人能保证您每次都能从每次股票交易中获利,但是至少让我们看看我们的 RNN 模型如何帮助我们提高这样做的机会。
......
......@@ -542,7 +542,7 @@ python tensorflow/python/tools/freeze_graph.py --input_meta_graph=/tmp/keras_amz
我们不会通过重复项目设置步骤来烦您-只需按照我们之前的操作即可创建一个名为 StockPrice 的新 Objective-C 项目,该项目将使用手动构建的 TensorFlow 库(请参阅第 7 章,“使用 CNN 和 LSTM 识别图形”的 iOS 部分(如果需要详细信息)。 然后将两个模型文件`amzn_tf_frozen.pb``amzn_keras_frozen.pb`添加到项目中,您应该在 Xcode 中拥有 StockPrice 项目,如图 8.3 所示:
我们不会通过重复项目设置步骤来烦您-只需按照我们之前的操作即可创建一个名为 StockPrice 的新 Objective-C 项目,该项目将使用手动构建的 TensorFlow 库(请参阅第 7 章,“使用 CNN 和 LSTM 识别绘画”的 iOS 部分(如果需要详细信息)。 然后将两个模型文件`amzn_tf_frozen.pb``amzn_keras_frozen.pb`添加到项目中,您应该在 Xcode 中拥有 StockPrice 项目,如图 8.3 所示:
![](img/454020d6-1f32-480d-b159-b474b6878540.png)
......
......@@ -432,7 +432,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
......
......@@ -406,7 +406,7 @@ with tf.gfile.FastGFile(filename, 'rb') as f:
tf.import_graph_def(graph_def, name='')
```
使用`tf.Session()`创建 TensorFlow 会话,并在加载图并创建会话之后,将记录的音频缓冲区以及采样率作为输入数据发送到 TensorFlow 会话的`run`方法,该方法返回识别的预测:
使用`tf.Session()`创建 TensorFlow 会话,并在加载图并创建会话之后,将记录的音频缓冲区以及采样率作为输入数据发送到 TensorFlow 会话的`run`方法,该方法返回识别的预测:
```py
run(softmax_tensor, {
......@@ -921,7 +921,7 @@ training_op = optimizer.apply_gradients(gvs_feed)
<tf.Variable 'dense_1/bias:0' shape=(1,) dtype=float32_ref>)]
```
请注意,`kernel`只是权重的另一个名称,`(4, 4)``(4, )``(4, 1)``(1, )`是权重的形状和对第一个(输入到隐藏)和第二层(隐藏到输出)。 如果您从 iPython 多次运行脚本,则`tf`对象的默认图将包含先前运行的可训练变量,因此,除非调用`tf.reset_default_graph()`,否则需要使用`gvs = [(g, v) for g, v in gvs if g != None]`删除那些过时的训练变量, 将返回 None 梯度(有关`computer_gradients`的更多信息,请参见[这里](https://www.tensorflow.org/api_docs/python/tf/train/AdamOptimizer#compute_gradients))。
请注意,`kernel`只是权重的另一个名称,`(4, 4)``(4, )``(4, 1)``(1, )`是权重的形状和对第一个(输入到隐藏)和第二层(隐藏到输出)。 如果您从 iPython 多次运行脚本,则`tf`对象的默认图将包含先前运行的可训练变量,因此,除非调用`tf.reset_default_graph()`,否则需要使用`gvs = [(g, v) for g, v in gvs if g != None]`删除那些过时的训练变量, 将返回 None 梯度(有关`computer_gradients`的更多信息,请参见[这里](https://www.tensorflow.org/api_docs/python/tf/train/AdamOptimizer#compute_gradients))。
现在,玩一些游戏并保存奖励和梯度值:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册