提交 cddd8dec 编写于 作者: W wizardforcel

2020-12-14 22:47:09

上级 93c1f499
......@@ -313,7 +313,7 @@
* 高频交易甚至不是一个主意
* 被动指数基金不那么受欢迎
可以想象,这些特征使库存性能显着不同。 如果我们使用具有 30 年历史的数据来训练模型,则很可能无法使用当今的数据来执行模型。
可以想象,这些特征使股票表现显着不同。 如果我们使用具有 30 年历史的数据来训练模型,则很可能无法使用当今的数据来执行模型。
### 营运表现
......
......@@ -29,7 +29,7 @@
时间序列数据是顺序数据的子分类。 时间序列数据的一些示例如下:
**股票市场价格**:时间序列数据的圣杯是股票价格。 许多数据科学家将在其职业生涯中的某个时刻尝试使用其数据科学技能来尝试预测股市。 他们中的许多人将意识到这是一项艰巨的努力,并转向其他主题和问题。 库存预测困难的几个原因是:
**股票市场价格**:时间序列数据的圣杯是股票价格。 许多数据科学家将在其职业生涯中的某个时刻尝试使用其数据科学技能来尝试预测股市。 他们中的许多人将意识到这是一项艰巨的努力,并转向其他主题和问题。 股票预测困难的几个原因是:
* 在经济周期的不同时间,股票对经济状况的反应不同。
* 影响股票价格的因素很多,这使它成为一个非常复杂的系统。
......
......@@ -537,7 +537,7 @@ from sklearn.metrics import homogeneity_score print('Homogeneity: {}'.format(hom
Homogeneity: 0.42229071246999117
```
这个值(特别是`K = 2`)证实了我们的初步分析。 至少一个聚类(具有大多数良性样本的聚类)不是完全同质的,因为它包含属于这两个类别的样本。 但是,由于该值不是非常接近`0`,因此我们可以确保分配部分正确。 考虑到`h``c`这两个值,我们可以推断出 K 均值的效果不是很好(可能是由于非凸性),但同时 正确分离所有最近簇距离在特定阈值以上的样本。 毋庸置疑,在掌握基本事实的情况下,我们不能轻易接受 K 均值,我们应该寻找另一种能够同时产生`h``c → 1`的算法 。
这个值(特别是`K = 2`)证实了我们的初步分析。 至少一个聚类(具有大多数良性样本的聚类)不是完全同质的,因为它包含属于这两个类别的样本。 但是,由于该值不是非常接近`0`,因此我们可以确保分配部分正确。 考虑到`h``c`这两个值,我们可以推断出 K 均值的效果不是很好(可能是由于非凸性),但同时正确分离所有最近簇距离在特定阈值以上的样本。 毋庸置疑,在掌握基本事实的情况下,我们不能轻易接受 K 均值,我们应该寻找另一种能够同时产生`h``c → 1`的算法 。
......@@ -602,7 +602,7 @@ from sklearn.metrics import adjusted_mutual_info_score
Adj. Mutual info: 0.42151741598216214
```
该协议是适度的,并且与其他措施兼容。 假设存在置换和机会分配的可能性,`Y[true]``Y[pred]`共享中等级别的信息,因为 我们已经讨论过,K 均值能够正确分配重叠概率可忽略不计的所有样本,同时它倾向于考虑良性地位于两个聚类边界上的许多恶性样本(相反,这没有错 良性样本的分配)。 没有任何进一步的指示,该索引还建议检查其他可以管理非凸簇的聚类算法,因为缺少共享信息主要是由于无法使用标准球(尤其是在重叠区域为子空间)捕获复杂的几何图形 更重要)。
该协议是适度的,并且与其他措施兼容。 假设存在置换和机会分配的可能性,`Y[true]``Y[pred]`共享中等级别的信息,因为我们已经讨论过,K 均值能够正确分配重叠概率可忽略不计的所有样本,同时它倾向于考虑良性地位于两个聚类边界上的许多恶性样本(相反,这没有错 良性样本的分配)。 没有任何进一步的指示,该索引还建议检查其他可以管理非凸簇的聚类算法,因为缺少共享信息主要是由于无法使用标准球(尤其是在重叠区域为子空间)捕获复杂的几何图形 更重要)。
......
......@@ -4,7 +4,7 @@
自从 2012 年深层神经网络在 AlexNet 赢得 ImageNet 挑战后开始起飞以来,人工智能研究人员一直在将深度学习技术(包括经过预训练的深度 CNN 模型)应用于越来越多的问题领域。 有什么能比创造艺术更有创造力? 已经提出并实现了 的一种想法,称为神经样式传递,它使您可以利用预先训练的深度神经网络模型并传递图像或任何梵高的样式 或莫奈的杰作),例如另一张图片(例如个人资料图片或您喜欢的狗的图片),从而创建将图片内容与杰作风格融合在一起的图片。 实际上,有一个名为 Prisma 的 iOS 应用程序在 2016 年获得了年度最佳应用程序奖。 在短短几秒钟内,它将以您选择的任何样式转换您的图片。
自从 2012 年深层神经网络在 AlexNet 赢得 ImageNet 挑战后开始起飞以来,人工智能研究人员一直在将深度学习技术(包括经过预训练的深度 CNN 模型)应用于越来越多的问题领域。 有什么能比创造艺术更有创造力? 一种想法已经提出并实现了,称为神经样式传递,它使您可以利用预先训练的深度神经网络模型并传递图像或任何梵高的样式或莫奈的杰作),例如另一张图片(例如个人资料图片或您喜欢的狗的图片),从而创建将图片内容与杰作风格融合在一起的图片。 实际上,有一个名为 Prisma 的 iOS 应用程序在 2016 年获得了年度最佳应用程序奖。 在短短几秒钟内,它将以您选择的任何样式转换您的图片。
在本章中,我们将首先概述三种神经样式转换方法,其中一种是原始方法,一种是经过改进的方法,另一种是进一步改进的方法。 然后,我们将详细研究如何使用第二种方法来训练快速神经样式转换模型,该模型可在您的 iOS 和 Android 智能手机中使用,以实现 Prisma 的功能。 接下来,我们将实际在 iOS 应用程序和 Android 应用程序中使用该模型,引导您完成从头开始创建此类应用程序的整个过程。 最后,我们将向您简要介绍 TensorFlow Magenta 开源项目,您可以将其用于基于深度学习构建更多的音乐和艺术生成应用程序,并向您展示如何使用单个预先训练的样式转换模型, 是基于神经样式转换的最新研究进展而创建的,其中包括 26 种很酷的艺术样式,可在您的 iOS 和 Android 应用中获得更快的性能和结果。 总之,本章将涵盖以下主题:
......@@ -32,7 +32,7 @@
自然地,在 2016 年,论文中发布了一种“快三个数量级”的新算法,即[《实时样式传递和超分辨率的感知损失》](https://cs.stanford.edu/people/jcjohns/eccv16/),作者是 Justin Johnson 等。 它使用单独的训练过程,并定义了更好的损失函数,这些函数本身就是深度神经网络。 训练后(在下一节中我们将看到,在 GPU 上可能要花费几个小时),使用训练后的模型来生成样式转换的图像在计算机上几乎是实时的,而在智能手机上只需几秒钟。
使用这种快速神经传递算法仍然有一个缺点:只能针对特定样式训练模型,因此,要在您的应用中使用不同的样式,必须逐一训练这些样式以为每种样式生成一个模型 。 2017 年发表了一篇名为[《学习风格的艺术表现形式》](https://arxiv.org/abs/1610.07629)的新论文,它发现一个单一的深度神经网络模型可以 概括许多不同的样式。 [TensorFlow Magenta 项目](https://github.com/tensorflow/magenta/tree/master/magenta/models/image_stylization)包括具有多种样式的预训练模型,我们将在最后一部分中看到 本章的两个部分在 iOS 和 Android 应用程序中使用这种模型来产生强大而神奇的艺术效果是多么容易。
使用这种快速神经传递算法仍然有一个缺点:只能针对特定样式训练模型,因此,要在您的应用中使用不同的样式,必须逐一训练这些样式以为每种样式生成一个模型 。 2017 年发表了一篇名为[《学习风格的艺术表现形式》](https://arxiv.org/abs/1610.07629)的新论文,它发现一个单一的深度神经网络模型可以概括许多不同的样式。 [TensorFlow Magenta 项目](https://github.com/tensorflow/magenta/tree/master/magenta/models/image_stylization)包括具有多种样式的预训练模型,我们将在本章的最后两个部分中看到,在 iOS 和 Android 应用程序中使用这种模型来产生强大而神奇的艺术效果是多么容易。
......
此差异已折叠。
......@@ -4,7 +4,7 @@
如果图像分类和物体检测是明智的任务,那么用自然语言描述图像绝对是一项更具挑战性的任务,需要更多的智能-请片刻考虑一下每个人如何从新生儿成长(谁学会了识别 物体并检测它们的位置)到三岁的孩子(他们学会讲述图片故事)。 用自然语言描述图像的任务的正式术语是图像标题。 与具有长期研究和发展历史的语音识别不同,图像字幕(具有完整的自然语言,而不仅仅是关键词输出)由于其复杂性和 2012 年的深度学习突破而仅经历了短暂而令人兴奋的研究历史。
如果图像分类和物体检测是明智的任务,那么用自然语言描述图像绝对是一项更具挑战性的任务,需要更多的智能-请片刻考虑一下每个人如何从新生儿成长(他们学会了识别物体并检测它们的位置)到三岁的孩子(他们学会讲述图片故事)。 用自然语言描述图像的任务的正式术语是图像标题。 与具有长期研究和发展历史的语音识别不同,图像字幕(具有完整的自然语言,而不仅仅是关键词输出)由于其复杂性和 2012 年的深度学习突破而仅经历了短暂而令人兴奋的研究历史。
在本章中,我们将首先回顾基于深度学习的图像字幕模型如何赢得 2015 年 Microsoft COCO(大规模对象检测,分割和字幕数据集),我们在第 3 章,“检测对象及其位置”中简要介绍了该有效模型。 然后,我们将总结在 TensorFlow 中训练模型的步骤,并详细介绍如何准备和优化要在移动设备上部署的复杂模型。 之后,我们将向您展示有关如何构建 iOS 和 Android 应用程序以使用该模型生成描述图像的自然语言语句的分步教程。 由于该模型同时涉及计算机视觉和自然语言处理,因此您将首次看到两种主要的深度神经网络架构 CNN 和 RNN 如何协同工作,以及如何编写 iOS 和 Android 代码以访问经过训练的网络并进行 多个推论。 总而言之,我们将在本章介绍以下主题:
......@@ -172,13 +172,13 @@ Captions for image COCO_val2014_000000224477.jpg:
在第 4 章,“转换具有惊人艺术风格的图片”,和第 5 章,“了解简单语音命令”中,我们使用了两个略有不同的版本 一个名为`freeze.py`的脚本将受过训练的网络权重与网络图定义合并到一个自足的模型文件中,这是我们可以在移动设备上使用的好处。 TensorFlow 还带有`freeze`脚本的更通用版本,称为`freeze_graph.py`,位于`tensorflow/python/tools`文件夹中,可用于构建模型文件。 要使其正常运行,您需要为其提供至少四个参数(要查看所有可用参数,请查看 `tensorflow/python/tools/freeze_graph.py`):
在第 4 章,“转换具有惊人艺术风格的图片”,和第 5 章,“了解简单语音命令”中,我们使用了一个名为`freeze.py`的脚本的两个略有不同的版本,将受过训练的网络权重与网络图定义合并到一个自足的模型文件中,这是我们可以在移动设备上使用的好处。 TensorFlow 还带有`freeze`脚本的更通用版本,称为`freeze_graph.py`,位于`tensorflow/python/tools`文件夹中,可用于构建模型文件。 要使其正常运行,您需要为其提供至少四个参数(要查看所有可用参数,请查看 `tensorflow/python/tools/freeze_graph.py`):
* `--input_graph``--input_meta_graph`:模型的图形定义文件。 例如,在上一节的第 4 步的命令`ls -lt $MODEL_DIR/train`的输出中,`model.ckpt-109587.meta`是一个元图文件,其中包含模型的图定义和其他与检查点相关的元数据,而`graph.pbtxt`只是模型的图 定义。
* `--input_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`:冻结模型文件的路径–这是在移动设备上使用的路径。
* `--output_node_names`:输出节点名称列表,以逗号分隔,告诉`freeze_graph`工具冻结模型中应包括模型的哪一部分和权重,因此生成特定输出不需要节点和权重 节点名称将保留。
* `--output_node_names`:输出节点名称列表,以逗号分隔,告诉`freeze_graph`工具冻结模型中应包括模型的哪一部分和权重,因此生成特定输出不需要的节点名称和权重将保留。
因此,对于该模型,我们如何找出必备的输出节点名称以及输入节点名称,这些对推理也至关重要,正如我们在上一章的 iOS 和 Android 应用程序中所见到的那样? 因为我们已经使用`run_inference`脚本来生成测试图像的标题,所以我们可以看到它是如何进行推理的。
......@@ -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
......@@ -350,7 +350,7 @@ x[:6]
u'convert_image']
```
解决您的 iOS 应用错误的第二种可能解决方案是,像在 中所做的那样,在 `tf_op_files`文件中添加未注册的操作实现,并重建 TensorFlow iOS 库。 就像第 5 章, “了解简单语音命令”一样。 坏消息是,由于 TensorFlow 中没有`DecodeJpeg`函数的实现,因此无法将`DecodeJpeg`的 TensorFlow 实现添加到`tf_op_files`中。
解决您的 iOS 应用错误的第二种可能解决方案,像第 5 章, “了解简单语音命令”一样,是在 `tf_op_files`文件中添加未注册的操作实现,并重建 TensorFlow iOS 库。 坏消息是,由于 TensorFlow 中没有`DecodeJpeg`函数的实现,因此无法将`DecodeJpeg`的 TensorFlow 实现添加到`tf_op_files`中。
实际上,在图 6.2 中也暗示了对此烦恼的解决方法,其中`convert_image`节点用作`image_feed`输入的解码版本。 为了更准确,单击 TensorBoard 图中的转换和**解码**节点,如图 6.4 所示,您将从右侧的 TensorBoard 信息卡中看到输入转换(名为`convert_image/Cast`)的输出为`decode/DecodeJpeg``convert_image`,解码的输入和输出为`image_feed``convert_image/Cast`
......@@ -428,7 +428,7 @@ bazel-bin/tensorflow/tools/graph_transforms/transform_graph \
真正的最后一步,也是至关重要的一步,尤其是在运行复杂的冻结和转换模型(例如我们在较旧的 iOS 设备上训练过的模型)时,是使用位于 `tensorflow/contrib/util`的另一个工具`convert_graphdef_memmapped_format` ,将冻结和转换后的模型转换为映射格式。 映射文件允许现代操作系统(例如 iOS 和 Android)将文件直接映射到主内存,因此无需为文件分配内存,也无需写回磁盘,因为文件数据是只读的,这非常重要。 性能提高。
更重要的是,iOS 不会将已映射文件视为内存使用量,因此,当内存压力过大时,即使文件很大,使用已映射文件的应用也不会由于 iOS 太大而被杀死 内存使用和崩溃。 实际上,正如我们将在下一节中很快看到的那样,如果模型文件的转换版本未转换为 memmapped 格式,则将在较旧的移动设备(如 iPhone 6)上崩溃,在这种情况下,转换是必须的, 有。
更重要的是,iOS 不会将已映射文件视为内存使用量,因此,当内存压力过大时,即使文件很大,使用已映射文件的应用也不会由于内存使用太大而被 iOS 杀死和崩溃。 实际上,正如我们将在下一节中很快看到的那样,如果模型文件的转换版本未转换为 memmapped 格式,则将在较旧的移动设备(如 iPhone 6)上崩溃,在这种情况下,转换是必须的, 有。
构建和运行该工具的命令非常简单:
......@@ -463,7 +463,7 @@ target 'Image2Text'
然后在终端上运行`pod install`并打开`Image2Text.xcworkspace`文件。 将`ios_image_load.h``ios_image_load.mm``tensorflow_utils.h``tensorflow_utils.mm`文件从位于`tensorflow/examples/ios/camera`的 TensorFlow iOS 示例相机应用程序拖放到 Xcode 的`Image2Text`项目中。 之前我们已经重用了`ios_image_load.*`文件,此处`tensorflow_utils.*`文件主要用于加载映射的模型文件。 `tensorflow_utils.mm`中有两种方法`LoadModel``LoadMemoryMappedModel` :一种以我们以前的方式加载非映射模型,另一种加载了映射模型 。 如果有兴趣,请看一下`LoadMemoryMappedModel`的实现方式,并且[这个页面](https://www.tensorflow.org/mobile/optimizing#reducing_model_loading_time_andor_memory_footprint)上的文档也可能会有用。
2. 添加在上一节末尾生成的两个模型文件,在“训练和测试字幕生成”小节第 2 步中生成的`word_counts.txt`文件,以及一些测试图像–我们保存了 并使用 [TensorFlow im2txt 模型页面](https://github.com/tensorflow/models/tree/master/research/im2txt) )顶部的四个图像,以便我们比较我们的字幕结果 模型,以及那些由模型训练得出的模型,需要经过更多步骤。 还将`ViewController.m`重命名为`.mm`,从现在开始,我们将只处理`ViewController.mm`文件即可完成应用程序。 现在,您的 Xcode `Image2Text`项目应类似于图 6.5:
2. 添加在上一节末尾生成的两个模型文件,在“训练和测试字幕生成”小节第 2 步中生成的`word_counts.txt`文件,以及一些测试图像–我们保存并使用 [TensorFlow im2txt 模型页面](https://github.com/tensorflow/models/tree/master/research/im2txt)顶部的四个图像,以便我们比较我们的模型的字幕结果,以及那些由使用更多步骤训练的模型所生成的结果。 还将`ViewController.m`重命名为`.mm`,从现在开始,我们将只处理`ViewController.mm`文件即可完成应用程序。 现在,您的 Xcode `Image2Text`项目应类似于图 6.5:
![](img/62be062e-39dc-4f0c-8a59-7e0e675bafaa.png)
......@@ -625,7 +625,7 @@ for (int i = 0; i < STATE_COUNT; i++){
}
```
10.`CAPTION_LEN`上创建一个`for`循环,然后在该循​​环内,首先创建`output_feed``output_states`张量向量,然后馈入我们先前设置的`input_feed``state_feed`,并运行模型以返回 `softmax`张量和`new_state`张量组成的`output`张量向量:
10.`CAPTION_LEN`上创建一个`for`循环,然后在该循​​环内,首先创建`output_feed``output_states`张量向量,然后馈入我们先前设置的`input_feed``state_feed`,并运行模型以返回由`softmax`张量和`new_state`张量组成的`output`张量向量:
```py
vector<int> captions;
......@@ -643,7 +643,7 @@ for (int i=0; i<CAPTION_LEN; i++) {
auto state_map = state.tensor<float, 2>();
```
11. 现在,找到可能性最大(softmax 值)的单词 ID。 如果是结束字的 ID,则结束`for`循环;否则,结束循环。 否则,将具有最大 softmax 值的单词`id`添加到向量`captions`中。 请注意,此处我们使用贪婪搜索,始终选择概率最大的单词,而不是像`run_inference.py`脚本中那样将大小设置为 3 的集束搜索。 在`for`循环的末尾,用最大字数`id`更新`input_feed`值,并用先前返回的`state`值更新`state_feed`值,然后再将两个输入馈送到 softmax 模型 所有下一个单词的值和下一个状态值
11. 现在,找到可能性最大(softmax 值)的单词 ID。 如果是结束字的 ID,则结束`for`循环;否则,结束循环。 否则,将具有最大 softmax 值的单词`id`添加到向量`captions`中。 请注意,此处我们使用贪婪搜索,始终选择概率最大的单词,而不是像`run_inference.py`脚本中那样将大小设置为 3 的集束搜索。 在`for`循环的末尾,用最大字数`id`更新`input_feed`值,并用先前返回的`state`值更新`state_feed`值,然后再将两个输入,所有下一个单词的 softmax 值和下一个状态值,馈送到模型
```py
float max_prob = 0.0f;
......@@ -666,7 +666,7 @@ for (int i=0; i<CAPTION_LEN; i++) {
}
```
我们可能从未详细解释过如何在 C++ 中获取和设置 TensorFlow 张量值。 但是,如果您到目前为止已经阅读了本书中的代码,那么您应该已经学会了。 这就像 RNN 学习:如果您接受了足够的代码示例培训,就可以编写有意义的代码。 总而言之,首先使用`Tensor`类型定义变量,并使用该变量的数据类型和形状指定,然后调用`Tensor`类的`tensor`方法,传入数据类型的 C++ 版本和 形状,以创建张量的贴图变量。 之后,您可以简单地使用映射来获取或设置张量的值。
我们可能从未详细解释过如何在 C++ 中获取和设置 TensorFlow 张量值。 但是,如果您到目前为止已经阅读了本书中的代码,那么您应该已经学会了。 这就像 RNN 学习:如果您接受了足够的代码示例培训,就可以编写有意义的代码。 总而言之,首先使用`Tensor`类型定义变量,并使用该变量的数据类型和形状指定,然后调用`Tensor`类的`tensor`方法,传入数据类型的 C++ 版本和形状,以创建张量的贴图变量。 之后,您可以简单地使用映射来获取或设置张量的值。
12. 最后,只需遍历`captions`向量并将向量中存储的每个词 ID 转换为一个词,然后将该词添加到`sentence`字符串中,而忽略起始 ID 和结束 ID,然后返回该句子,希望是明智的 自然语言:
......@@ -715,7 +715,7 @@ return sentence;
遵循相同的简单性考虑,我们将开发具有最小 UI 的新 Android 应用,并着重于如何在 Android 中使用该模型:
1. 创建一个名为`Image2Text`的新 Android 应用,在应用`build.gradle`文件的依存关系的末尾添加`compile 'org.tensorflow:tensorflow-android:+'`,创建一个`assets`文件夹,然后将`image2text_frozen_transformed.pb`模型文件`word_counts.txt`拖放到其中 文件和一些测试图像文件
1. 创建一个名为`Image2Text`的新 Android 应用,在应用`build.gradle`文件的依存关系的末尾添加`compile 'org.tensorflow:tensorflow-android:+'`,创建一个`assets`文件夹,然后将`image2text_frozen_transformed.pb`模型文件`word_counts.txt`文件和一些测试图像文件拖放到其中
2.`activity_main.xml`文件中添加一个`ImageView`和一个按钮:
```py
......@@ -833,7 +833,7 @@ try {
}
```
5. 现在,在`public void run()`方法中,在`DESCRIBE ME`按钮发生`onClick`事件时启动,添加代码以调整测试图像的大小,从调整后的位图中读取像素值,然后将它们转换为浮点数-我们已经看到了 在前三章中这样的代码:
5. 现在,在`public void run()`方法中,在`DESCRIBE ME`按钮发生`onClick`事件时启动,添加代码以调整测试图像的大小,从调整后的位图中读取像素值,然后将它们转换为浮点数-我们已经在前三章中看到了这样的代码:
```py
intValues = new int[IMAGE_WIDTH * IMAGE_HEIGHT];
......
......@@ -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`方法,该方法将生成给定功能的预测,然后打印下一个预测:
......@@ -181,7 +181,7 @@ def predict_input_fn():
现在,如果您运行`predict.py`,您将在步骤 2 中获得具有输入数据返回最大值的类 ID。
基本了解如何使用`Estimator`高级 API 构建的模型进行预测后,我们现在就可以冻结该模型,以便可以在移动设备上使用该模型,这需要我们首先弄清楚 输出节点名称应该是什么。
基本了解如何使用`Estimator`高级 API 构建的模型进行预测后,我们现在就可以冻结该模型,以便可以在移动设备上使用该模型,这需要我们首先弄清楚输出节点名称应该是什么。
......@@ -1049,6 +1049,6 @@ private double[] normalizeScreenCoordinates() {
在本章中,我们首先描述了图纸分类模型的工作原理,然后介绍了如何使用高级 TensorFlow Estimator API 训练这种模型。 我们研究了如何编写 Python 代码以使用经过训练的模型进行预测,然后详细讨论了如何找到正确的输入和输出节点名称以及如何以正确的方式冻结和转换模型以使移动应用程序可以使用它。 我们还提供了一种新方法来构建新的 TensorFlow 自定义 iOS 库,并提供了一个逐步教程,以构建适用于 Android 的 TensorFlow 自定义库,以修复使用模型时的运行时错误。 最后,我们展示了 iOS 和 Android 代码,这些代码捕获并显示用户图形,将其转换为模型所需的数据,并处理和呈现模型返回的分类结果。 希望您在漫长的旅途中学到了很多东西。
到目前为止,除了来自其他开放源代码项目的几个模型以外,所有由我们自己进行预训练或训练的模型,我们在 iOS 和 Android 应用中使用的都是 TensorFlow 开放源代码项目,该项目 当然,它提供了大量强大的模型,其中一些模型在强大的 GPU 上进行了数周的训练。 但是,如果您有兴趣从头开始构建自己的模型,并且还对本章中使用和应用的强大 RNN 模型以及概念感到困惑,那么下一章就是您所需要的:我们将讨论如何 从头开始构建自己的 RNN 模型并在移动应用程序中使用它,从而带来另一种乐趣-从股市中赚钱-至少我们会尽力做到这一点。 当然,没有人能保证您每次都能从每次股票交易中获利,但是至少让我们看看我们的 RNN 模型如何帮助我们提高这样做的机会。
到目前为止,除了来自其他开放源代码项目的几个模型以外,所有由我们自己进行预训练或训练的模型,我们在 iOS 和 Android 应用中使用的都是 TensorFlow 开放源代码项目,当然,该项目提供了大量强大的模型,其中一些模型在强大的 GPU 上进行了数周的训练。 但是,如果您有兴趣从头开始构建自己的模型,并且还对本章中使用和应用的强大 RNN 模型以及概念感到困惑,那么下一章就是您所需要的:我们将讨论如何从头开始构建自己的 RNN 模型并在移动应用程序中使用它,从而带来另一种乐趣-从股市中赚钱-至少我们会尽力做到这一点。 当然,没有人能保证您每次都能从每次股票交易中获利,但是至少让我们看看我们的 RNN 模型如何帮助我们提高这样做的机会。
......@@ -62,7 +62,7 @@ LSTM 只是解决 RNN 已知梯度消失问题的一种 RNN,我们在第 6 章
首先,您需要在[这里](https://www.alphavantage.co)索取免费的 API 密钥,以便获取任何股票代码的股价数据。 取得 API 密钥后,打开终端并运行以下命令(将`<your_api_key>`替换为您自己的密钥后)以获取 Amazon(amzn)和 Google(goog)的每日库存数据,或将它们替换为您的任何符号 利益:
首先,您需要在[这里](https://www.alphavantage.co)索取免费的 API 密钥,以便获取任何股票代码的股价数据。 取得 API 密钥后,打开终端并运行以下命令(将`<your_api_key>`替换为您自己的密钥后)以获取 Amazon(amzn)和 Google(goog)的每日股票数据,或将它们替换为您的任何符号 利益:
```py
curl -o daily_amzn.csv "https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=amzn&apikey=<your_api_key>&datatype=csv&outputsize=full"
......@@ -70,7 +70,7 @@ curl -o daily_amzn.csv "https://www.alphavantage.co/query?function=TIME_SERIES_D
curl -o daily_goog.csv "https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=goog&apikey=<your_api_key>&datatype=csv&outputsize=full"
```
这将生成一个`daily_amzn.csv``daily_goog.csv` csv 文件 ,其顶行为“ 时间戳,打开,打开,升高,降低,关闭,音量”,其余部分 这些行作为每日库存信息。 我们只关心收盘价,因此运行以下命令以获取所有收盘价:
这将生成一个`daily_amzn.csv``daily_goog.csv` csv 文件 ,其顶行为“时间戳,开盘,高位,低位,收盘,交易量”,这些行的其余部分作为每日股票信息。 我们只关心收盘价,因此运行以下命令以获取所有收盘价:
```py
cut -d ',' -f 5 daily_amzn.csv | tail -n +2 > amzn.txt
......@@ -105,9 +105,9 @@ seq_len = 20
learning_rate = 0.001
```
[NumPy](http://www.numpy.org) 是用于 N 维数组操作的最受欢迎的 Python 库,而 [Matplotlib](https://matplotlib.org) 是领先的 Python 2D 绘图库。 我们将使用 numpy 处理数据集,并使用 Matplotlib 可视化股票价格和预测。 `num_neurons`是 RNN(或更准确地说是 RNN 单元)在每个时间步长上的神经元数量-每个神经元在该时间步长上都接收输入序列的输入元素,并从前一个时间步长上接收输出。 `num_inputs``num_outputs`指定每个时间步长的输入和输出数量-我们将从每个时间步长的 20 天输入序列中将一个股票价格提供给带有`num_neurons`神经元的 RNN 单元,并期望 每个步骤的库存量。 `seq_len`是时间步数。 因此,我们将使用 Google 的 20 天股票价格作为输入序列,并将这些输入发送给具有 100 个神经元的 RNN 单元。
[NumPy](http://www.numpy.org) 是用于 N 维数组操作的最受欢迎的 Python 库,而 [Matplotlib](https://matplotlib.org) 是领先的 Python 2D 绘图库。 我们将使用 numpy 处理数据集,并使用 Matplotlib 可视化股票价格和预测。 `num_neurons`是 RNN(或更准确地说是 RNN 单元)在每个时间步长上的神经元数量-每个神经元在该时间步长上都接收输入序列的输入元素,并从前一个时间步长上接收输出。 `num_inputs``num_outputs`指定每个时间步长的输入和输出数量-我们将从每个时间步长的 20 天输入序列中将一个股票价格提供给带有`num_neurons`神经元的 RNN 单元,并期望 每个步骤的股票量。 `seq_len`是时间步数。 因此,我们将使用 Google 的 20 天股票价格作为输入序列,并将这些输入发送给具有 100 个神经元的 RNN 单元。
2. 打开并读取包含所有价格的文本文件,将价格解析为`float`数字列表,颠倒列表顺序,以便最早的价格首先开始,然后每次添加`seq_len+1`值(第一个`seq_len`值将 是 RNN 的输入序列,最后的`seq_len`值将是目标输出序列),从列表中的第一个开始,每次移动 1 直到列表的末尾,直到一个 numpy `result`数组:
2. 打开并读取包含所有价格的文本文件,将价格解析为`float`数字列表,颠倒列表顺序,以便最早的价格首先开始,然后每次添加`seq_len+1`值(第一个`seq_len`值将是 RNN 的输入序列,最后的`seq_len`值将是目标输出序列),从列表中的第一个开始,每次移动 1 直到列表的末尾,直到一个 numpy `result`数组:
```py
f = open(symbol + '.txt', 'r').read()
......@@ -174,7 +174,7 @@ outputs, _ = tf.nn.dynamic_rnn(cell, X, dtype=tf.float32)
`OutputProjectionWrapper`用于在每个单元的输出之上添加一个完全连接的层,因此,在每个时间步长处,RNN 单元的输出(将是`num_neurons`值的序列)都会减小为单个值。 这就是 RNN 在每个时间步为输入序列中的每个值输出一个值,或为每个实例的`seq_len`个数的值的每个输入序列输出总计`seq_len`个数的值的方式。
`dynamic_rnn`用于循环所有时间步长的 RNN 信元,总和为`seq_len`(在`X`形状中定义),它返回两个值:每个时间步长的输出列表,以及 网络的最终状态。 接下来,我们将使用第一个`outputs` 返回值 的整形值来定义损失函数。
`dynamic_rnn`用于循环所有时间步长的 RNN 信元,总和为`seq_len`(在`X`形状中定义),它返回两个值:每个时间步长的输出列表,以及网络的最终状态。 接下来,我们将使用第一个`outputs`返回的整形值来定义损失函数。
5. 通过以标准方式指定预测张量,损失,优化器和训练操作来完成模型定义:
......@@ -254,7 +254,7 @@ with tf.Session() as sess:
correct += 1
```
现在我们可以使用`plot`方法可视化正确的预测比率:
现在我们可以使用`plot`方法可视化预测正确率:
```py
total = len(X_test)
......@@ -522,7 +522,7 @@ plt.show()
图 8.2:使用 Keras 双向和堆叠 LSTM 层进行股价预测
很容易在堆栈中添加更多 LSTM 层,或者使用诸如学习率和丢弃率以及许多恒定设置之类的超参数。 但是,对于使用`pred_len``shift_pred`的不同设置,正确率的差异还没有发现。 也许我们现在应该对接近 60% 的正确率感到满意,并看看如何在 iOS 和 Android 上使用 TensorFlow 和 Keras 训练的模型-我们可以在以后继续尝试改进模型,但是 了解使用 TensorFlow 和 Keras 训练的 RNN 模型是否会遇到任何问题将非常有价值。
很容易在堆栈中添加更多 LSTM 层,或者使用诸如学习率和丢弃率以及许多恒定设置之类的超参数。 但是,对于使用`pred_len``shift_pred`的不同设置,正确率的差异还没有发现。 也许我们现在应该对接近 60% 的正确率感到满意,并看看如何在 iOS 和 Android 上使用 TensorFlow 和 Keras 训练的模型-我们可以在以后继续尝试改进模型,但是了解使用 TensorFlow 和 Keras 训练的 RNN 模型是否会遇到任何问题将非常有价值。
正如 FrançoisChollet 指出的那样,“深度学习更多的是艺术而不是科学……每个问题都是独特的,您将不得不尝试并经验地评估不同的策略。目前尚无理论可以提前准确地告诉您应该做什么。 以最佳方式解决问题。您必须尝试并进行迭代。” 希望我们为您使用 TensorFlow 和 Keras API 改善股票价格预测模型提供了一个很好的起点。
......@@ -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)
......@@ -579,7 +579,7 @@ const int SEQ_LEN = 20;
}
```
`getLatestData`方法首先发出 URL 请求以获取紧凑型版本的 Alpha Vantage API,该 API 返回 Amazon 每日库存数据的最后 100 个数据点,然后解析结果并将最后 20 个收盘价保存在`_closeprices`数组中:
`getLatestData`方法首先发出 URL 请求以获取紧凑型版本的 Alpha Vantage API,该 API 返回 Amazon 每日股票数据的最后 100 个数据点,然后解析结果并将最后 20 个收盘价保存在`_closeprices`数组中:
```py
-(void)getLatestData:(BOOL)useKerasModel {
......@@ -874,7 +874,7 @@ public void run() {
在本章中,我们首先对表示不屑一顾,试图通过使用 TensorFlow 和 Keras RNN API 预测股价来击败市场。 我们首先讨论了 RNN 和 LSTM 模型是什么以及如何使用它们进行股价预测。 然后,我们使用 TensorFlow 和 Keras 从零开始构建了两个 RNN 模型,接近测试正确率的 60%。 最后,我们介绍了如何冻结模型并在 iOS 和 Android 上使用它们,并使用自定义 TensorFlow 库修复了 iOS 上可能出现的运行时错误。
如果您对我们尚未建立正确预测比率为 80% 或 90% 的模型感到有些失望,则可能需要继续进行“尝试并迭代”过程,以查看是否以该正确比率预测股票价格 可能的。 但是,您肯定会从使用 TensorFlow 和 Keras API 的 RNN 模型构建,训练和测试中学到的技能以及在 iOS 和 Android 上运行的技能而受益。
如果您对我们尚未建立预测正确率为 80% 或 90% 的模型感到有些失望,则可能需要继续进行“尝试并迭代”过程,以查看是否可以以该正确率预测股票价格。 但是,您肯定会从使用 TensorFlow 和 Keras API 的 RNN 模型构建,训练和测试中学到的技能以及在 iOS 和 Android 上运行的技能而受益。
如果您对使用深度学习技术打败市场感兴趣并感到兴奋,让我们在 GAN(生成对抗网络)上的下一章中进行研究,该模型试图击败能够分辨真实数据与虚假数据之间差异的对手, 并且越来越擅长生成看起来像真实数据的数据,欺骗对手。 GAN 实际上被深度学习的一些顶级研究人员誉为是过去十年中深度学习中最有趣和令人兴奋的想法。
......
......@@ -33,7 +33,7 @@ AlphaZero 算法包含三个主要组件:
* 一种通用的强化学习算法,该算法通过自玩从头开始学习,除了游戏规则外,没有特定的领域知识。 通过自增强学习学习深度神经网络的参数,以使预测值与实际自游戏结果之间的损失最小,并使预测策略与搜索概率之间的相似性最大化,这来自以下算法。
* 一种通用(与域无关)的**蒙特卡洛树搜索****MCTS**)算法,该算法从头至尾模拟自玩游戏,并通过考虑到从深度神经网络返回的预测值和策略概率值,以及访问节点的频率—有时,选择访问次数较少的节点称为强化学习中的探索(与采取较高预测值的举动相反) 价值和政策,这称为剥削)。 探索与开发之间的良好平衡可以带来更好的结果。
强化学习的历史可以追溯到 1960 年代,当时该术语在工程文献中首次使用。 但是突破发生在 2013 年,当时 DeepMind 将强化学习与深度学习相结合,并开发了深度强化学习应用程序,该应用程序学会了从头开始玩 Atari 游戏,以原始像素为输入的,并随后击败了人类。 与监督学习不同,监督学习需要标记数据进行训练,就像我们在前几章中建立或使用的许多模型中所看到的那样,强化学习使用反复试验的方法来获得更好的效果:代理与环境交互并接收 对每个州采取的任何行动都会获得奖励(正面或负面)。 在 AlphaZero 下象棋的示例中,只有在游戏结束后才能获得奖励,获胜的结果为 +1,失败的为 -1,平局为 0。强化学习 AlphaZero 中的算法对我们前面提到的损失使用梯度下降来更新深层神经网络的参数, 就像一个通用函数近似来学习和编码游戏技巧。
强化学习的历史可以追溯到 1960 年代,当时该术语在工程文献中首次使用。 但是突破发生在 2013 年,当时 DeepMind 将强化学习与深度学习相结合,并开发了深度强化学习应用程序,该应用程序学会了从头开始玩 Atari 游戏,以原始像素为输入的,并随后击败了人类。 与监督学习不同,监督学习需要标记数据进行训练,就像我们在前几章中建立或使用的许多模型中所看到的那样,强化学习使用反复试验的方法来获得更好的效果:代理与环境交互并接收在每个状态上采取的每个动作的奖励(正面或负面)。 在 AlphaZero 下象棋的示例中,只有在游戏结束后才能获得奖励,获胜的结果为 +1,失败的为 -1,平局为 0。强化学习 AlphaZero 中的算法对我们前面提到的损失使用梯度下降来更新深层神经网络的参数, 就像一个通用函数近似来学习和编码游戏技巧。
学习或训练过程的结果可以是由深度神经网络生成的策略,该策略说出对任何状态应采取的行动,或者是将每个状态以及该状态的每个可能动作映射到长期奖励的价值函数 。
......@@ -376,7 +376,7 @@ Couldn't load model: Invalid argument: No OpKernel was registered to support Op
您应该已经知道如何解决这种类型的错误,因为前面的章节已经对此进行了讨论。 回顾一下,只需确保`tensorflow/contrib/makefile/tf_op_files.txt`文件中包含`Switch`操作的内核文件。 您可以通过运行`grep 'REGISTER.*"Switch"' tensorflow/core/kernels/*.cc`来查找哪个`Switch`内核文件,该文件应显示`tensorflow/core/kernels/control_flow_ops.cc`。 默认情况下,从 TensorFlow 1.4 开始, `tf_op_files.txt`中包含 `control_flow_ops.cc` 文件,因此您所需要做的就是通过运行`tensorflow/contrib/makefile/build_all_ios.sh`来构建 TensorFlow iOS 自定义库。 如果您已在上一章中成功运行了 iOS 应用程序,则该库已经不错,您不需要或不想再次运行耗时的命令。
现在,只需创建一个名为 AlphaZero 的新 Xcode iOS 项目,然后将上一章中的 iOS 项目中的`tensorflow_utils.mm``tensorflow_utils.h`文件以及上一节中生成的`alphazero19.pb`模型文件拖放到 项目。 将`ViewController.m`重命名为`ViewController.mm`,并添加一些常量和变量。 您的项目应如图 10.3 所示:
现在,只需创建一个名为 AlphaZero 的新 Xcode iOS 项目,然后将上一章中的 iOS 项目中的`tensorflow_utils.mm``tensorflow_utils.h`文件以及上一节中生成的`alphazero19.pb`模型文件拖放到项目。 将`ViewController.m`重命名为`ViewController.mm`,并添加一些常量和变量。 您的项目应如图 10.3 所示:
![](img/a0639a2a-55f3-485a-92cd-4ffdc99b398c.png)
......
......@@ -76,9 +76,9 @@ open simple.xcworkspace
`download_models.sh` will download a zip file that contains the `mobilenet_quant_v1_224.tflite` model file and `labels.txt` label file, then copy them to the simple/data and camera/data directories. Notice that somehow this script is not included in the official TensorFlow 1.5.0 and 1.6.0 releases. You'll need to do `git clone https://github.com/tensorflow/tensorflow` and clone the latest source (as of March 2018) to get it.
您可以查看 Xcode `tflite_camera_example`项目的`CameraExampleViewController.mm`文件和`tflite_simple_example` `RunModelViewController.mm`文件中的源代码,以了解如何使用 TensorFlow Lite API 加载和运行 TensorFlow Lite 模型。 在逐步指导您如何创建新的 iOS 应用并向其添加 TensorFlow Lite 支持以运行预先构建的 TensorFlow Lite 模型的逐步教程之前,我们将快速以具体数字向您展示的好处之一 如前所述,使用 TensorFlow Lite-应用程序二进制大小:
您可以查看 Xcode `tflite_camera_example`项目的`CameraExampleViewController.mm`文件和`tflite_simple_example` `RunModelViewController.mm`文件中的源代码,以了解如何使用 TensorFlow Lite API 加载和运行 TensorFlow Lite 模型。 在逐步指导您如何创建新的 iOS 应用并向其添加 TensorFlow Lite 支持以运行预先构建的 TensorFlow Lite 模型的逐步教程之前,我们将快速以具体数字向您展示使用 TensorFlow Lite-应用程序的好处之一,如前所述,二进制大小:
位于`tensorflow/examples/ios/camera`文件夹中的`tf_camera_example` TensorFlow Mobile 示例应用程序中使用的`tensorflow_inception.graph.pb`模型文件为 95.7MB,而`mobilenet_quant_v1_224.tflite` TensorFlow Lite 模型文件 位于`tensorflow/contrib/lite/examples/ios/camera` 文件夹中的 `tflite_camera_example` TensorFlow Lite 示例应用程序中使用的仅 4.3MB。 TensorFlow Mobile 重新训练的 Inception 3 模型文件的量化版本,如我们在第 2 章,“通过迁移学习对图像进行分类”的 HelloTensorFlow 应用中所见,约为 22.4MB,并且重新训练的 MobileNet TensorFlow Mobile 模型文件为 17.6MB。 总之,以下列出了四种不同类型的模型的大小:
位于`tensorflow/examples/ios/camera`文件夹中的 TensorFlow Mobile 示例应用程序`tf_camera_example` 中使用的`tensorflow_inception.graph.pb`模型文件为 95.7MB,而位于`tensorflow/contrib/lite/examples/ios/camera`文件夹中的 `tflite_camera_example` TensorFlow Lite 示例应用程序中使用的模型文件`mobilenet_quant_v1_224.tflite`仅 4.3MB。 TensorFlow Mobile 重新训练的 Inception 3 模型文件的量化版本,如我们在第 2 章,“通过迁移学习对图像进行分类”的 HelloTensorFlow 应用中所见,约为 22.4MB,并且重新训练的 MobileNet TensorFlow Mobile 模型文件为 17.6MB。 总之,以下列出了四种不同类型的模型的大小:
* TensorFlow Mobile Inception 3 模型:95.7MB
* 量化和重新训练的 TensorFlow Mobile Inception 3 模型:22.4MB
......@@ -87,7 +87,7 @@ open simple.xcworkspace
如果在 iPhone 上安装并运行这两个应用程序,则从 iPhone 的设置中将看到 `tflite_camera_example`的应用程序大小约为 18.7MB,`tf_camera_example`的大小约为 44.2MB。
的确,Inception 3 模型的准确性比 MobileNet 模型要高,但是在许多使用情况下,可以忽略很小的准确性差异。 另外,不可否认,如今的移动应用程序很容易占用数十 MB 的空间,在某些用例中,应用程序大小相差 20 或 30MB 听起来并不大,但是在较小的嵌入式设备中,大小会更加敏感,如果 我们可以以更快的速度和更小的尺寸获得几乎相同的精度,而不会遇到太多麻烦,对于用户而言,这永远是一件好事。
的确,Inception 3 模型的准确性比 MobileNet 模型要高,但是在许多使用情况下,可以忽略很小的准确性差异。 另外,不可否认,如今的移动应用程序很容易占用数十 MB 的空间,在某些用例中,应用程序大小相差 20 或 30MB 听起来并不大,但是在较小的嵌入式设备中,大小会更加敏感,如果我们可以以更快的速度和更小的尺寸获得几乎相同的精度,而不会遇到太多麻烦,对于用户而言,这永远是一件好事。
......@@ -122,7 +122,7 @@ target 'HelloTFLite'
我们仅向您展示如何在 iOS 应用中使用 TensorFlow Lite Pod。 还有另一种将 TensorFlow Lite 添加到 iOS 的方法,类似于构建自定义 TensorFlow Mobile iOS 库的过程,我们在前几章中已经做过很多次了。 有关如何构建自己的自定义 TensorFlow Lite iOS 库的更多信息,请参阅[以下位置的文档](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/g3doc/ios.md)
4. 将第 2 章,“通过迁移学习对图像进行分类”的 iOS 应用中的类似 UI 代码复制到`ViewController.mm`,后者使用`UITapGestureRecognizer`捕获用户的手势 屏幕上,然后调用`RunInferenceOnImage`方法,该方法将加载 TensorFlow Lite 模型文件:
4. 将第 2 章,“通过迁移学习对图像进行分类”的 iOS 应用中的类似 UI 代码复制到`ViewController.mm`,后者使用`UITapGestureRecognizer`捕获屏幕上的用户手势,然后调用`RunInferenceOnImage`方法,该方法将加载 TensorFlow Lite 模型文件:
```py
NSString* RunInferenceOnImage() {
......@@ -212,7 +212,7 @@ NSString* RunInferenceOnImage() {
在第 2 章,”通过迁移学习对图像进行分类“中,我们重新训练了 MobileNet TensorFlow 模型来进行狗的品种识别任务,并且要在 TensorFlow Lite 中使用这种模型,我们首先需要进行转换 使用 TensorFlow Lite 转换工具将其转换为 TensorFlow Lite 格式:
在第 2 章,”通过迁移学习对图像进行分类“中,我们重新训练了 MobileNet TensorFlow 模型来进行狗的品种识别任务,并且要在 TensorFlow Lite 中使用这种模型,我们首先需要使用 TensorFlow Lite 转换工具将其转换为 TensorFlow Lite 格式:
```py
bazel build tensorflow/contrib/lite/toco:toco
......@@ -239,7 +239,7 @@ bazel-bin/tensorflow/contrib/lite/toco/toco \
在前面的章节中,我们已经训练了许多定制的 TensorFlow 模型,并将其冻结以供移动使用。 不幸的是,如果您尝试使用上一节中内置的`bazel-bin/tensorflow/contrib/lite/toco/toco` TensorFlow Lite 转换工具 将模型从 TensorFlow 格式转换为 TensorFlow Lite 格式,则它们都会失败,除了第 2 章, “通过迁移学习对图像进行分类”的再训练模型; 大多数错误属于“转换不受支持的操作”类型。 例如,以下命令尝试将第 3 章, “检测对象及其位置” 中的 TensorFlow 对象检测模型转换为 TensorFlow Lite 格式:
在前面的章节中,我们已经训练了许多定制的 TensorFlow 模型,并将其冻结以供移动使用。 不幸的是,如果您尝试使用上一节中内置的`bazel-bin/tensorflow/contrib/lite/toco/toco` TensorFlow Lite 转换工具将模型从 TensorFlow 格式转换为 TensorFlow Lite 格式,则它们都会失败,除了第 2 章, “通过迁移学习对图像进行分类”的再训练模型; 大多数错误属于“转换不受支持的操作”类型。 例如,以下命令尝试将第 3 章, “检测对象及其位置” 中的 TensorFlow 对象检测模型转换为 TensorFlow Lite 格式:
```py
bazel-bin/tensorflow/contrib/lite/toco/toco \
......@@ -288,7 +288,7 @@ bazel-bin/tensorflow/contrib/lite/toco/toco \
但是,您还将收到许多“转换不受支持的操作”错误。
截至 2018 年 3 月以及 TensorFlow 1.6 中,TensorFlow Lite 仍在开发人员预览版中,但将来的发行版将支持更多操作,因此如果您想在 TensorFlow 1.6 中尝试 TensorFlow Lite,则应该将自己限制训练和重新训练的 Inception 和 MobileNet 模型,同时关注将来的 TensorFlow Lite 版本。 本书前面和其他章节中介绍的更多 TensorFlow 模型有可能会在 TensorFlow 1.7 或阅读本书时成功转换为 TensorFlow Lite 格式。
截至 2018 年 3 月以及 TensorFlow 1.6 中,TensorFlow Lite 仍在开发人员预览版中,但将来的发行版将支持更多操作,因此如果您想在 TensorFlow 1.6 中尝试 TensorFlow Lite,则应该将自己限制于预训练和重新训练的 Inception 和 MobileNet 模型,同时关注将来的 TensorFlow Lite 版本。 本书前面和其他章节中介绍的更多 TensorFlow 模型有可能会在 TensorFlow 1.7 或阅读本书时成功转换为 TensorFlow Lite 格式。
但是至少到目前为止,对于使用 TensorFlow 或 Keras 构建的自定义复杂模型,很可能您将无法成功进行 TensorFlow Lite 转换,因此您应该继续使用 TensorFlow Mobile,如前几章所述。现在,除非您致力于使它们与 TensorFlow Lite 一起使用,并且不介意帮助添加更多由 TensorFlow Lite 支持的操作-毕竟 TensorFlow 是一个开源项目。
......
......@@ -60,7 +60,7 @@
3.[这个页面](https://www.raspberrypi.org/downloads/noobs)上下载 Raspbian 的官方简易安装程序 New Out Of Box Software(NOOBS)的离线 ZIP 版本,将其解压缩,然后将提取的`NOOBS`文件夹中的所有文件拖放到格式化的 MicroSD 卡中。
现在弹出 MicroSD 卡并将其插入 Raspberry Pi 板上。 将显示器的 HDMI 电缆以及 USB 键盘和鼠标连接到开发板上。 用电源为开发板供电,然后按照屏幕上的步骤完成 Raspbian 的安装,包括设置 Wifi 网络。 整个安装过程不到一个小时即可完成。 完成后,您可以打开一个终端并输入`ifconfig`来查找电路板的 IP 地址,然后从您的计算中使用`ssh pi@<board_ip_address>`来访问它,正如我们稍后将要看到的,这确实很方便并且需要 在移动中测试控制 Raspberry Pi 机器人-当移动时,您不想或不能将键盘,鼠标和显示器与板子一起使用。
现在弹出 MicroSD 卡并将其插入 Raspberry Pi 板上。 将显示器的 HDMI 电缆以及 USB 键盘和鼠标连接到开发板上。 用电源为开发板供电,然后按照屏幕上的步骤完成 Raspbian 的安装,包括设置 Wifi 网络。 整个安装过程不到一个小时即可完成。 完成后,您可以打开一个终端并输入`ifconfig`来查找电路板的 IP 地址,然后从您的计算中使用`ssh pi@<board_ip_address>`来访问它,正如我们稍后将要看到的,这确实很方便并且需要在移动中测试控制 Raspberry Pi 机器人 -- 当移动时,您不想或不能将键盘,鼠标和显示器与板子一起使用。
但是默认情况下未启用 SSH,因此,当您首次尝试 SSH 到 Pi 板上时,会出现“SSH 连接被拒绝”错误。 启用它的最快方法是运行以下两个命令:
......@@ -212,7 +212,7 @@ sudo pip install http://ci.tensorflow.org/view/Nightly/job/nightly-pi/lastSucces
此方法更为常见,并在一个不错的博客条目中描述,[《为 Raspberry Pi 交叉编译 TensorFlow》](https://petewarden.com/2017/08/20/cross-compiling-tensorflow-for-the-raspberry-pi),作者是 Pete Warden。
一种更复杂的方法是使用`makefile`,这在您需要构建和使用 TensorFlow 库时是必需的。 [TensorFlow 官方 makefile 文档](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/makefile)的 Raspberry Pi 部分包含构建 TensorFlow 库的详细步骤,但是它 可能不适用于每个版本的 TensorFlow。 此处的步骤与 TensorFlow 的早期版本(0.10)完美配合,但是在 TensorFlow 1.6 中会导致许多“未定义对`google::protobuf`的引用”错误。
一种更复杂的方法是使用`makefile`,这在您需要构建和使用 TensorFlow 库时是必需的。 [TensorFlow 官方 makefile 文档](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/makefile)的 Raspberry Pi 部分包含构建 TensorFlow 库的详细步骤,但是它可能不适用于每个版本的 TensorFlow。 此处的步骤与 TensorFlow 的早期版本(0.10)完美配合,但是在 TensorFlow 1.6 中会导致许多“未定义对`google::protobuf`的引用”错误。
TensorFlow 1.6 版本已经测试了以下步骤,可从[下载 https://github.com/tensorflow/tensorflow/releases/tag/v1.6.0](https://github.com/tensorflow/tensorflow/releases/tag/v1.6.0) ; 您当然可以在 TensorFlow 发行页面中尝试使用较新的版本,或者通过`git clone https://github.com/tensorflow/tensorflow`克隆最新的 TensorFlow 源,并修复所有可能的问题。
......@@ -232,7 +232,7 @@ export HOST_NSYNC_LIB=`tensorflow/contrib/makefile/compile_nsync.sh`
export TARGET_NSYNC_LIB="$HOST_NSYNC_LIB"
```
确保您运行的是`make CXX=g++-4.8`,而不是运行在正式 TensorFlow Makefile 文档中的`make`,因为 Protobuf 必须使用与用于构建以下 TensorFlow 的版本相同的`gcc`版本进行编译 库,以修复那些“未定义对`google::protobuf`的引用”错误。 现在尝试使用以下命令构建 TensorFlow 库:
确保您运行的是`make CXX=g++-4.8`,而不是运行在正式 TensorFlow Makefile 文档中的`make`,因为 Protobuf 必须使用与用于构建以下 TensorFlow 的版本相同的`gcc`版本来编译库,以修复那些“未定义对`google::protobuf`的引用”错误。 现在尝试使用以下命令构建 TensorFlow 库:
```py
make -f tensorflow/contrib/makefile/Makefile HOST_OS=PI TARGET=PI \
......@@ -344,11 +344,11 @@ tensorflow/contrib/pi_examples/label_image/gen/bin/label_image
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++ 代码来加载模型图文件,准备输入张量,运行 模型,并获得输出张量。
看看 C++ 源代码`tensorflow/contrib/pi_examples/label_image/label_image.cc``tensorflow/contrib/pi_examples/camera/camera.cc`,您会看到它们使用与前几章中的 iOS 应用类似的 C++ 代码来加载模型图文件,准备输入张量,运行模型,并获得输出张量。
默认情况下,摄像机示例还使用`label_image/data`文件夹中解压缩的预构建 Inception 模型。 但是对于您自己的特定图像分类任务,提供通过迁移学习重新训练的模型。您可以像第 2 章,“通过迁移学习对图像进行分类”一样,在运行两个示例应用程序时使用`--graph`参数。
通常,语音是 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 源并进行构建。
通常,语音是 Raspberry Pi 机器人与我们互动的主要 UI。 理想情况下,我们应该运行 TensorFlow 支持的自然声音**文本到语音****TTS**)模型,例如 [WaveNet](https://deepmind.com/blog/wavenet-generative-model-raw-audio)[Tacotron](https://github.com/keithito/tacotron),但运行和部署不在本章范围之内。 这样的模型。 事实证明,我们可以使用称为 [CMU **Flite**](http://www.festvox.org/flite) 的简单得多的 TTS 库,它提供了相当不错的 TTS,并且只需一个简单的命令即可安装它:`sudo apt-get install flite`。 如果要安装最新版本的 Flite 以期希望获得更好的 TTS 质量,只需从链接下载最新的 Flite 源并进行构建。
要使用我们的 USB 扬声器测试 Flite,请使用`-t`参数运行 flite,然后使用双引号引起来的文本字符串,例如 `flite -t "i recommend the ATM machine"`。 如果您不喜欢默认语音,则可以通过运行 `flite -lv`找到其他受支持的语音,它们应返回 `Voices available: kal awb_time kal16 awb rms slt` 。 然后,您可以指定用于 TTS 的语音: `flite -voice rms -t "i recommend the ATM machine"`
......@@ -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, {
......@@ -415,7 +415,7 @@ run(softmax_tensor, {
})
```
在这里,将`softmax_tensor`定义为 TensorFlow 图的`get_tensor_by_name(self.output_name_)`,将`output_name_``input_samples_name_``input_rate_name_`分别定义为`labels_softmax``decoded_sample_data:0``decoded_sample_data:1`与 我们在第 5 章,“了解简单语音命令”中的 iOS 和 Android 应用程序中使用过
在这里,将`softmax_tensor`定义为 TensorFlow 图的`get_tensor_by_name(self.output_name_)`,将`output_name_``input_samples_name_``input_rate_name_`分别定义为`labels_softmax``decoded_sample_data:0``decoded_sample_data:1`我们在第 5 章,“了解简单语音命令”中的 iOS 和 Android 应用程序中使用过它
在之前的章节中,我们主要使用 Python 训练和测试 TensorFlow 模型,然后再使用本机 TensorFlow C++ 库的 Java 接口代码在使用 C++ 或 Android 的 iOS 中运行模型。 在 Raspberry Pi 上,您可以选择直接使用 TensorFlow Python API 或 C++ API 在 Pi 上运行 TensorFlow 模型,尽管通常仍会在功能更强大的电脑上训练模型。 有关完整的 TensorFlow Python API 文档,请参见[这里](https://www.tensorflow.org/api_docs/python)
......@@ -670,7 +670,7 @@ obs, reward, done, info = env.step(0)
环境决定何时将`done`返回`True`时会有一些延迟-尽管前两个步骤已经返回了大于 15 度的度数(当极点与垂直线成 15 度以上时,情节结束了) ,您仍然可以对环境执行 0 操作。 第三步将`done`返回为`True`,并且环境中的另一步骤(最后一步)将导致警告,因为环境已经完成了该情节。
对于 CartPole 环境,每个`step`调用返回的`reward`值始终为 1,信息始终为{}。 这就是关于 CartPole 模拟环境的全部知识。 现在我们了解了 CartPole 的工作原理,让我们看看可以在每种状态(观察)下制定什么样的策略,我们可以让该策略告诉我们要采取的操作(步骤),以便我们可以保持杆直立 换句话说,就是尽可能长的时间,这样我们才能最大化我们的回报。 请记住,强化学习中的一项政策只是一项功能,该功能以代理商所处的状态为输入,并输出代理商接下来应采取的行动,以实现价值最大化或长期回报。
对于 CartPole 环境,每个`step`调用返回的`reward`值始终为 1,信息始终为{}。 这就是关于 CartPole 模拟环境的全部知识。 现在我们了解了 CartPole 的工作原理,让我们看看可以在每种状态(观察)下制定什么样的策略,我们可以让该策略告诉我们要采取的操作(步骤),以便我们可以保持杆直立换句话说,就是尽可能长的时间,这样我们才能最大化我们的回报。 请记住,强化学习中的一项政策只是一项功能,该功能以代理商所处的状态为输入,并输出代理商接下来应采取的行动,以实现价值最大化或长期回报。
......@@ -892,7 +892,7 @@ optimizer = tf.train.AdamOptimizer(learning_rate)
请注意,此处不再像以前的简单神经网络策略示例那样使用`minimize`函数,因为我们需要手动微调梯度以考虑每个动作的折价奖励。 这就要求我们首先使用`compute_gradients`方法,然后以所需的方式更新渐变,最后调用`apply_gradients`方法([我们大多数时候应该使用的`minimize`方法实际上是在幕后调用`compute_gradients`和`apply_gradients`](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/training/optimizer.py))。
因此,让我们现在为网络参数(权重和偏差)计算交叉熵损失的梯度,并设置梯度占位符,稍后将使用考虑了计算梯度和动作折现奖励的值来填充梯度占位符 在测试运行期间使用当前策略采取的措施
因此,让我们现在为网络参数(权重和偏差)计算交叉熵损失的梯度,并设置梯度占位符,稍后将使用考虑了计算梯度和动作折现奖励的值来填充它,动作在测试运行期间使用当前策略选取
```py
gvs = optimizer.compute_gradients(cross_entropy)
......@@ -1021,7 +1021,7 @@ pi@raspberrypi:~/mobiletf/ch12 $ python nn_pg.py
在本章中,我们首先详细介绍了使用所有必需的附件和操作系统以及将 Raspberry Pi 板变成移动机器人的 GoPiGo 工具包来设置 Raspberry Pi 的详细步骤。 然后,我们介绍了如何在 Raspberry Pi 上安装 TensorFlow 并构建 TensorFlow 库,以及如何将 TTS 与图像分类集成以及如何使用 GoPiGO API 进行音频命令识别,从而使 Raspberry Pi 机器人可以移动,看到,收听和讲话所有内容 无需使用 Cloud API。 最后,我们介绍了用于强化学习的 OpenAI Gym 工具包,并向您展示了如何使用 TensorFlow 构建和训练功能强大的强化学习神经网络模型,以使您的机器人在模拟环境中保持平衡。
在本章中,我们首先详细介绍了使用所有必需的附件和操作系统以及将 Raspberry Pi 板变成移动机器人的 GoPiGo 工具包来设置 Raspberry Pi 的详细步骤。 然后,我们介绍了如何在 Raspberry Pi 上安装 TensorFlow 并构建 TensorFlow 库,以及如何将 TTS 与图像分类集成以及如何使用 GoPiGO API 进行音频命令识别,从而使 Raspberry Pi 机器人可以移动,看到,听到和说出所有内容,而无需使用 Cloud API。 最后,我们介绍了用于强化学习的 OpenAI Gym 工具包,并向您展示了如何使用 TensorFlow 构建和训练功能强大的强化学习神经网络模型,以使您的机器人在模拟环境中保持平衡。
......@@ -1035,12 +1035,12 @@ pi@raspberrypi:~/mobiletf/ch12 $ python nn_pg.py
之后,我们从零开始开发了用于预测 TensorFlow 和 Keras 中的股价的 RNN 模型,两个用于数字识别和像素转换的 GAN 模型以及一个用于 Connect4 的类似于 AlphaZero 的模型,以及使用所有这些 TensorFlow 模型的完整 iOS 和 Android 应用 。 然后,我们介绍了如何将 TensorFlow Lite 以及 Apple 的 Core ML 与标准机器学习模型和转换后的 TensorFlow 模型一起使用,展示了它们的潜力和局限性。 最后,我们探索了如何使用 TensorFlow 构建 Raspberry Pi 机器人,该机器人可以使用强大的强化学习算法来移动,观看,聆听,讲话和学习。
我们还展示了同时使用 TensorFlow Pod 和手动构建的 TensorFlow 库的 Objective-C 和 Swift iOS 应用程序,以及使用即用型 TensorFlow 库和手动构建库的 Android 应用程序,以修复您可能遇到的各种错误 在移动设备上部署和运行 TensorFlow 模型时遇到的问题。
我们还展示了同时使用 TensorFlow Pod 和手动构建的 TensorFlow 库的 Objective-C 和 Swift iOS 应用程序,以及使用即用型 TensorFlow 库和手动构建库的 Android 应用程序,以修复您在移动设备上部署和运行 TensorFlow 模型时可能遇到的各种问题。
我们已经介绍了很多,但是还有很多要讲的。 TensorFlow 的新版本已经快速发布。 已经构建并实现了采用最新研究论文的新 TensorFlow 模型。 本书的主要目的是向您展示使用各种智能 TensorFlow 模型的足够的 iOS 和 Android 应用程序,以及所有实用的故障排除和调试技巧,以便您可以在移动设备上为你的下一个杀手级移动 AI 应用程序快速部署和运行自己喜欢的 TensorFlow 模型。
如果您想使用 TensorFlow 或 Keras 构建自己的出色模型,实现最令您兴奋的算法和网络,则需要在本书结束后继续学习,因为我们没有详细介绍如何做到这一点, 但希望我们能激发您足够的动力来开始这一旅程,并从书中获得保证,一旦您构建并训练了模型,便知道如何快速,随时随地在移动设备上部署和运行它们。
关于走哪条路和要解决哪些 AI 任务,Ian Goodfellow 在接受 Andrew Ng 采访时的建议可能是最好的:“问问自己,下一步做什么是最好的,选取哪条路是最适合的:强化学习,无监督学习或生成对抗网络”。 无论如何,这将是一条充满兴奋的绝妙之路,当然还要有艰苦的工作,而您从本书中学到的技能就像您的智能手机一样,随时可以为您服务,并准备好将使您的甜蜜而聪明的小设备变得更加甜蜜和智能。
关于走哪条路和要解决哪些 AI 任务,Ian Goodfellow 在接受 Andrew Ng 采访时的建议可能是最好的:“问问自己,下一步做什么是最好的,选取哪条路是最适合的:强化学习,无监督学习或生成对抗网络”。 无论如何,这将是一条充满兴奋的绝妙之路,当然还要有艰苦的工作,而您从本书中学到的技能就像您的智能手机一样,随时可以为您服务,并准备好将使您的甜蜜而聪明的小设备变得更加甜蜜和智能。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册