提交 5748c481 编写于 作者: W wizardforcel

2020-12-06 12:14:36

上级 f967db61
...@@ -655,7 +655,7 @@ conda install -c derickl tensorflow ...@@ -655,7 +655,7 @@ conda install -c derickl tensorflow
接下来,我们需要下载经过预训练的 YOLO 模型的权重-我们将尝试两个 Tiny-YOLO 模型,它们超级快,但不如完整的 YOLO 模型准确。 同时运行 Tiny-YOLO 模型和 YOLO 模型的 iOS 代码几乎相同,因此我们仅向您展示如何运行 Tiny-YOLO 模型。 接下来,我们需要下载经过预训练的 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 ```py
flow --model cfg/tiny-yolo-voc.cfg --load bin/tiny-yolo-voc.weights --savepb flow --model cfg/tiny-yolo-voc.cfg --load bin/tiny-yolo-voc.weights --savepb
......
...@@ -22,15 +22,15 @@ ...@@ -22,15 +22,15 @@
*Show and Tell:从 2015 年 MSCOCO 图像字幕挑战赛*中汲取的经验教训( [https:/ /arxiv.org/pdf/1609.06647.pdf](https://arxiv.org/pdf/1609.06647.pdf) )。 在讨论培训过程之前,TensorFlow 的 im2txt 模型文档网站 [https://github.com/tensorflow/models/tree/master/research/im2txt](https://github.com/tensorflow/models/tree/master/research/im2txt) 中也对此进行了很好的介绍,让我们首先了解一下 基本了解模型的工作原理。 这也将帮助您了解 Python 中的训练和推理代码,以及本章稍后将介绍的 iOS 和 Android 中的推理代码。 [Show and Tell:从 2015 年 MSCOCO 图像字幕挑战赛中汲取的经验教训](https://arxiv.org/pdf/1609.06647.pdf)。 在讨论培训过程之前,[TensorFlow 的 im2txt 模型文档网站](https://github.com/tensorflow/models/tree/master/research/im2txt)中也对此进行了很好的介绍,让我们首先了解一下 基本了解模型的工作原理。 这也将帮助您了解 Python 中的训练和推理代码,以及本章稍后将介绍的 iOS 和 Android 中的推理代码。
获奖的 Show and Tell 模型是使用端到端方法进行训练的,类似于我们在上一章中简要介绍的最新的基于深度学习的语音识别模型。 它使用 MSCOCO 图像字幕 2014 数据集,可从 [http://cocodataset.org/#download](http://cocodataset.org/#download) 下载,该数据集包含超过 82,000 个训练图像,并以描述它们的自然语言句子为目标。 训练模型以使为每个输入图像输出目标自然语言句子的可能性最大化。 与使用多个子系统的其他更复杂的训练方法不同,端到端方法优雅,简单,并且可以实现最新的结果。 获奖的 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 章](../Text/02.html)**通过转移学习*对图像进行分类。 Inception v3 CNN 网络的最后一个隐藏层用作输入图像的表示。 由于 CNN 模型的性质,较早的层捕获更多的基本图像信息,而较后的层捕获更高级的图像概念。 因此,通过使用输入图像的最后一个隐藏层来表示图像,我们可以更好地准备具有高级概念的自然语言输出。 毕竟,我们通常会开始用诸如“人”或“火车”之类的词来描述图片,而不是“带有尖锐边缘的东西”。
为了表示目标自然语言输出中的每个单词,使用了单词嵌入方法。 词嵌入只是词的向量表示。 TensorFlow 网站上有一个不错的教程( [https://www.tensorflow.org/tutorials/word2vec](https://www.tensorflow.org/tutorials/word2vec),介绍如何构建模型来获取单词的矢量表示。 为了表示目标自然语言输出中的每个单词,使用了单词嵌入方法。 词嵌入只是词的向量表示。 [TensorFlow 网站上有一个不错的教程](https://www.tensorflow.org/tutorials/word2vec),介绍如何构建模型来获取单词的矢量表示。
现在,在既表示输入图像又表示输出单词的情况下(每个这样的单词对构成一个训练示例),给定的最佳训练模型可用于最大化在目标输出中生成每个单词 *w* 的概率 输入图像和该单词 *w,*之前的先前单词是 RNN 序列模型,或更具体地说,是**长短期记忆****LSTM** )的 RNN 模型类型。 LSTM 以解决常规 RNN 模型固有的消失和爆炸梯度问题而闻名。 为了更好地了解 LSTM,您应该查看这个热门博客 [http://colah.github.io/posts/2015-08-Understanding-LSTMs](http://colah.github.io/posts/2015-08-Understanding-LSTMs) 现在,在既表示输入图像又表示输出单词的情况下(每个这样的单词对构成一个训练示例),给定的最佳训练模型可用于最大化在目标输出中生成每个单词 *w* 的概率 输入图像和该单词 *w,*之前的先前单词是 RNN 序列模型,或更具体地说,是**长短期记忆****LSTM** )的 RNN 模型类型。 LSTM 以解决常规 RNN 模型固有的消失和爆炸梯度问题而闻名。 为了更好地了解 LSTM,[您应该查看这个热门博客](http://colah.github.io/posts/2015-08-Understanding-LSTMs)
The gradient concept is used in the back propagation process to update network weights so it can learn to generate better outputs. If you're not familiar with the back propagation process, one of the most fundamental and powerful algorithms in neural networks, you should definitely spend some time understanding it – just Google "backprop" and the top five results won't disappoint. Vanishing gradient means that, during the deep neural network back propagation learning process, network weights in earlier layers barely get updated so the network never converges; exploding gradient means that those weights get updated too wildly, causing the network to diverge a lot. So, if someone has a closed mind and never learns, or if someone gets crazy about new things as fast as he loses interest, you know what kind of gradient problem they seem to have. The gradient concept is used in the back propagation process to update network weights so it can learn to generate better outputs. If you're not familiar with the back propagation process, one of the most fundamental and powerful algorithms in neural networks, you should definitely spend some time understanding it – just Google "backprop" and the top five results won't disappoint. Vanishing gradient means that, during the deep neural network back propagation learning process, network weights in earlier layers barely get updated so the network never converges; exploding gradient means that those weights get updated too wildly, causing the network to diverge a lot. So, if someone has a closed mind and never learns, or if someone gets crazy about new things as fast as he loses interest, you know what kind of gradient problem they seem to have.
...@@ -46,7 +46,7 @@ The gradient concept is used in the back propagation process to update network w ...@@ -46,7 +46,7 @@ The gradient concept is used in the back propagation process to update network w
在本部分中,我们将首先总结训练训练名为 im2txt 的 Show and Tell 模型的过程,该模型记录在 [https://github.com/tensorflow/models/tree/master/research/im2txt](https://github.com/tensorflow/models/tree/master/research/im2txt) 中, 一些提示,以帮助您更好地了解该过程。 然后,我们将展示 im2txt 模型项目随附的 Python 代码的一些关键更改,以便冻结该模型以准备在移动设备上使用。 在本部分中,我们将首先总结训练训练名为 im2txt 的 Show and Tell 模型的过程,该模型记录在[这个页面](https://github.com/tensorflow/models/tree/master/research/im2txt)中, 一些提示,以帮助您更好地了解该过程。 然后,我们将展示 im2txt 模型项目随附的 Python 代码的一些关键更改,以便冻结该模型以准备在移动设备上使用。
...@@ -62,7 +62,7 @@ The gradient concept is used in the back propagation process to update network w ...@@ -62,7 +62,7 @@ The gradient concept is used in the back propagation process to update network w
git clone https://github.com/tensorflow/models git clone https://github.com/tensorflow/models
``` ```
您可能尚未安装的一个 Python 库是 **自然语言工具包****NLTK** ),这是最流行的用于自然语言处理的 Python 库之一。 只需访问其网站 [http://www.nltk.org](http://www.nltk.org) 以获得安装说明。 您可能尚未安装的一个 Python 库是 **自然语言工具包****NLTK** ),这是最流行的用于自然语言处理的 Python 库之一。 只需访问[其网站](http://www.nltk.org)以获得安装说明。
现在,请按照以下步骤来训练模型: 现在,请按照以下步骤来训练模型:
...@@ -182,7 +182,7 @@ Captions for image COCO_val2014_000000224477.jpg: ...@@ -182,7 +182,7 @@ Captions for image COCO_val2014_000000224477.jpg:
因此,对于该模型,我们如何找出必备的输出节点名称以及输入节点名称,这些对推理也至关重要,正如我们在上一章的 iOS 和 Android 应用程序中所见到的那样? 因为我们已经使用`run_inference`脚本来生成测试图像的标题,所以我们可以看到它是如何进行推理的。 因此,对于该模型,我们如何找出必备的输出节点名称以及输入节点名称,这些对推理也至关重要,正如我们在上一章的 iOS 和 Android 应用程序中所见到的那样? 因为我们已经使用`run_inference`脚本来生成测试图像的标题,所以我们可以看到它是如何进行推理的。
转到您的 im2txt 源代码文件夹`models/research/im2txt/im2txt`:您可能想在一个不错的编辑器(例如 Atom 或 Sublime Text)中打开它,或者在 Python IDE(例如 PyCharm)中打开它,或只打开它( [https:// github .com / tensorflow / models / tree / master / research / im2txt / im2txt](https://github.com/tensorflow/models/tree/master/research/im2txt/im2txt)。 在`run_inference.py`中,对`inference_utils/inference_wrapper_base.py`中的`build_graph_from_config`进行了调用,在`inference_wrapper.py`中调用了`build_model`,在`show_and_tell_model.py`中进一步调用了`build`方法。 最后,`build`方法将调用`build_input`方法,该方法具有以下代码: 转到您的 im2txt 源代码文件夹`models/research/im2txt/im2txt`:您可能想在一个不错的编辑器(例如 Atom 或 Sublime Text)中打开它,[或者在 Python IDE(例如 PyCharm)中打开它](https://github.com/tensorflow/models/tree/master/research/im2txt/im2txt)。 在`run_inference.py`中,对`inference_utils/inference_wrapper_base.py`中的`build_graph_from_config`进行了调用,在`inference_wrapper.py`中调用了`build_model`,在`show_and_tell_model.py`中进一步调用了`build`方法。 最后,`build`方法将调用`build_input`方法,该方法具有以下代码:
```py ```py
if self.mode == "inference": if self.mode == "inference":
...@@ -317,7 +317,7 @@ python tensorflow/python/tools/freeze_graph.py --input_graph=/home/jeff/tensorf ...@@ -317,7 +317,7 @@ python tensorflow/python/tools/freeze_graph.py --input_graph=/home/jeff/tensorf
通常,您可以使用`tensorflow/python/tools,`位于 `freeze_graph.py`相同位置的 `strip_unused.py,` 工具来删除不包含的`DecodeJpeg`操作 在 TensorFlow 核心库中(有关更多详细信息,请参见 [https://www.tensorflow.org/mobile/prepare_models#removing_training-only_nodes](https://www.tensorflow.org/mobile/prepare_models#removing_training-only_nodes) ),但是由于输入节点 image_feed 需要进行解码操作(图 6.2), `strip_unused`之类的工具不会将`DecodeJpeg`视为未使用,因此不会被剥夺。 您可以先运行`strip_unused`命令,如下所示进行验证: 通常,您可以使用`strip_unused.py,` 工具,与 `tensorflow/python/tools,`中的 `freeze_graph.py`位于相同位置,来[删除不包含在 TensorFlow 核心库中的`DecodeJpeg`操作](https://www.tensorflow.org/mobile/prepare_models#removing_training-only_nodes)但是由于输入节点 image_feed 需要进行解码操作(图 6.2), `strip_unused`之类的工具不会将`DecodeJpeg`视为未使用,因此不会被剥夺。 您可以先运行`strip_unused`命令,如下所示进行验证:
```py ```py
bazel-bin/tensorflow/python/tools/strip_unused --input_graph=/tmp/image2text_frozen.pb --output_graph=/tmp/image2text_frozen_stripped.pb --input_node_names="image_feed,input_feed,lstm/state_feed" --output_node_names="softmax,lstm/initial_state,lstm/state" --input_binary=True bazel-bin/tensorflow/python/tools/strip_unused --input_graph=/tmp/image2text_frozen.pb --output_graph=/tmp/image2text_frozen_stripped.pb --input_node_names="image_feed,input_feed,lstm/state_feed" --output_node_names="softmax,lstm/initial_state,lstm/state" --input_binary=True
...@@ -375,7 +375,7 @@ x[:6] ...@@ -375,7 +375,7 @@ x[:6]
u'ExpandDims_1'] u'ExpandDims_1']
``` ```
如果我们在 iOS 或 Android 应用程序中使用新的模型文件`image2text_frozen_stripped.pb`,则`No OpKernel was registered to support Op 'DecodeJpeg' with these attrs.` 肯定会消失。 但是发生另一个错误, `Not a valid TensorFlow Graph serialization: Input 0 of node ExpandDims_6 was passed float from input_feed:0 incompatible with expected int64`。 如果您通过名为 TensorFlow for Poets 2 的不错的 Google TensorFlow 代码实验室( [https://codelabs.developers.google.com/codelabs/tensorflow-for-poets-2](https://codelabs.developers.google.com/codelabs/tensorflow-for-poets-2) ),可能会想起来 还有另一个名为`optimize_for_inference`的工具,其功能类似于`strip_unused`,并且可以很好地用于代码实验室中的图像分类任务。 您可以像这样运行它: 如果我们在 iOS 或 Android 应用程序中使用新的模型文件`image2text_frozen_stripped.pb`,则`No OpKernel was registered to support Op 'DecodeJpeg' with these attrs.` 肯定会消失。 但是发生另一个错误, `Not a valid TensorFlow Graph serialization: Input 0 of node ExpandDims_6 was passed float from input_feed:0 incompatible with expected int64`。 如果您通过名为 TensorFlow for Poets 2 的[不错的 Google TensorFlow 代码实验室](https://codelabs.developers.google.com/codelabs/tensorflow-for-poets-2),可能会想起来,还有另一个名为`optimize_for_inference`的工具,其功能类似于`strip_unused`,并且可以很好地用于代码实验室中的图像分类任务。 您可以像这样运行它:
```py ```py
bazel build tensorflow/python/tools:optimize_for_inference bazel build tensorflow/python/tools:optimize_for_inference
...@@ -389,7 +389,7 @@ bazel-bin/tensorflow/python/tools/optimize_for_inference \ ...@@ -389,7 +389,7 @@ bazel-bin/tensorflow/python/tools/optimize_for_inference \
但是在 iOS 或 Android 应用上加载输出模型文件 `image2text_frozen_optimized.pb`会导致相同的`Input 0 of node ExpandDims_6 was passed float from input_feed:0 incompatible with expected int64` 错误。 看起来,尽管我们试图至少在某种程度上实现福尔摩斯在本章中可以做的事情,但有人希望我们首先成为福尔摩斯。 但是在 iOS 或 Android 应用上加载输出模型文件 `image2text_frozen_optimized.pb`会导致相同的`Input 0 of node ExpandDims_6 was passed float from input_feed:0 incompatible with expected int64` 错误。 看起来,尽管我们试图至少在某种程度上实现福尔摩斯在本章中可以做的事情,但有人希望我们首先成为福尔摩斯。
如果您在其他型号(例如我们在前几章中看到的型号)上尝试过`strip_unused``optimize_for_inference`工具,则它们可以正常工作。 事实证明,尽管官方 TensorFlow 1.4 和 1.5 发行版中包含了两个基于 Python 的工具,但在优化一些更复杂的模型时却存在一些错误。 更新和正确的工具是基于 C ++的`transform_graph`工具,现在是 TensorFlow Mobile 网站( [https://www.tensorflow.org/mobile](https://www.tensorflow.org/mobile)推荐的官方工具。 运行以下命令以消除在移动设备上部署时与 int64 错误不兼容的 float: 如果您在其他型号(例如我们在前几章中看到的型号)上尝试过`strip_unused``optimize_for_inference`工具,则它们可以正常工作。 事实证明,尽管官方 TensorFlow 1.4 和 1.5 发行版中包含了两个基于 Python 的工具,但在优化一些更复杂的模型时却存在一些错误。 更新和正确的工具是基于 C ++的`transform_graph`工具,现在是 [TensorFlow Mobile 网站](https://www.tensorflow.org/mobile)推荐的官方工具。 运行以下命令以消除在移动设备上部署时与 int64 错误不兼容的 float:
```py ```py
bazel build tensorflow/tools/graph_transforms:transform_graph bazel build tensorflow/tools/graph_transforms:transform_graph
...@@ -455,7 +455,7 @@ target 'Image2Text' ...@@ -455,7 +455,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](https://www.tensorflow.org/mobile/optimizing#reducing_model_loading_time_andor_memory_footprint) 然后在终端上运行`pod install`并打开`Image2Text.xcworkspace`文件。 将`ios_image_load.h``ios_image_load.mm``tensorflow_utils.h``tensorflow_utils.mm`文件从位于`tensorflow/examples/ios/camera`的 TensorFlow iOS 示例相机应用程序拖放到 Xcode 的`Image2Text`项目中。 之前我们已经重用了`ios_image_load.*`文件,此处`tensorflow_utils.*`文件主要用于加载映射的模型文件。 `tensorflow_utils.mm`中有两种方法`LoadModel``LoadMemoryMappedModel` :一种以我们以前的方式加载非映射模型,另一种加载了映射模型 。 如果有兴趣,请看一下`LoadMemoryMappedModel`的实现方式,并且[上的文档也可能会有用。https://www.tensorflow.org/mobile/optimizing#reducing_model_loading_time_andor_memory_footprint](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](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)Figure 6.5: Setting up the Image2Text iOS app, also showing how LoadMemoryMappedModel is implemented ![](img/62be062e-39dc-4f0c-8a59-7e0e675bafaa.png)Figure 6.5: Setting up the Image2Text iOS app, also showing how LoadMemoryMappedModel is implemented
...@@ -942,6 +942,6 @@ mHandler.sendMessage(msg); ...@@ -942,6 +942,6 @@ mHandler.sendMessage(msg);
令人惊讶的是,经过培训了成千上万个图像字幕示例,并在现代 CNN 和 LSTM 模型的支持下,我们可以构建和使用一个模型,该模型可以在移动设备上生成合理的自然语言描述。 不难想象可以在此基础上构建什么样的有用应用程序。 我们喜欢福尔摩斯吗? 当然不。 我们已经在路上了吗? 我们希望如此。 AI 的世界既令人着迷又充满挑战,但是只要我们不断取得稳步进步并改善自己的学习过程,同时又避免了梯度问题的消失和爆炸,我们就有很大机会建立 一个类似于 Holmes 的模型,并可以随时随地在一天中在移动应用中使用它。 令人惊讶的是,经过培训了成千上万个图像字幕示例,并在现代 CNN 和 LSTM 模型的支持下,我们可以构建和使用一个模型,该模型可以在移动设备上生成合理的自然语言描述。 不难想象可以在此基础上构建什么样的有用应用程序。 我们喜欢福尔摩斯吗? 当然不。 我们已经在路上了吗? 我们希望如此。 AI 的世界既令人着迷又充满挑战,但是只要我们不断取得稳步进步并改善自己的学习过程,同时又避免了梯度问题的消失和爆炸,我们就有很大机会建立 一个类似于 Holmes 的模型,并可以随时随地在一天中在移动应用中使用它。
漫长的篇章讨论了基于 CNN 和 LSTM 的网络模型的实际使用,我们值得一试。 在下一章中,您将看到如何使用另一个基于 CNN 和 LSTM 的模型来开发有趣的 iOS 和 Android 应用程序,这些应用程序使您可以绘制对象然后识别它们是什么。 要快速获得游戏在线版本的乐趣,请访问 [https://quickdraw.withgoogle.com](https://quickdraw.withgoogle.com) 漫长的篇章讨论了基于 CNN 和 LSTM 的网络模型的实际使用,我们值得一试。 在下一章中,您将看到如何使用另一个基于 CNN 和 LSTM 的模型来开发有趣的 iOS 和 Android 应用程序,这些应用程序使您可以绘制对象然后识别它们是什么。 要快速获得游戏在线版本的乐趣,请访问[这里](https://quickdraw.withgoogle.com)
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
在上一章中,我们看到了使用深度学习模型的强大功能,该模型将 CNN 与 LSTM RNN 集成在一起以生成图像的自然语言描述。 如果深度学习驱动的 AI 就像新的电力一样,我们当然希望看到这种混合神经网络模型在许多不同领域中的应用。 诸如图像字幕之类的严肃应用程序与之相反? 一个有趣的绘图应用程序,例如 Quick Draw( [https://quickdraw.withgoogle.com](https://quickdraw.withgoogle.com) ,请参见 [https://quickdraw.withgoogle.com/data](https://quickdraw.withgoogle.com/data) 了解有趣的示例数据), 使用经过训练并基于 345 个类别中的 5000 万张图纸的模型,并将新图纸分类到这些类别中,听起来不错。 还有一个正式的 TensorFlow 教程( [https://www.tensorflow.org/tutorials/recurrent_quickdraw](https://www.tensorflow.org/tutorials/recurrent_quickdraw),该教程介绍了如何构建这样的模型来帮助我们快速入门。 在上一章中,我们看到了使用深度学习模型的强大功能,该模型将 CNN 与 LSTM RNN 集成在一起以生成图像的自然语言描述。 如果深度学习驱动的 AI 就像新的电力一样,我们当然希望看到这种混合神经网络模型在许多不同领域中的应用。 诸如图像字幕之类的严肃应用程序与之相反? 一个有趣的绘图应用程序,例如 [Quick Draw](https://quickdraw.withgoogle.com)(请参见[这里](https://quickdraw.withgoogle.com/data)了解有趣的示例数据),使用经过训练并基于 345 个类别中的 5000 万张图纸的模型,并将新图纸分类到这些类别中,听起来不错。 还有一个[正式的 TensorFlow 教程](https://www.tensorflow.org/tutorials/recurrent_quickdraw),该教程介绍了如何构建这样的模型来帮助我们快速入门。
事实证明,在 iOS 和 Android 应用程序上使用本教程构建的模型的任务提供了一个绝佳的机会: 事实证明,在 iOS 和 Android 应用程序上使用本教程构建的模型的任务提供了一个绝佳的机会:
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
TensorFlow 教程( [https://www.tensorflow.org/tutorials/recurrent_quickdraw](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)Figure 7.1: The drawing classification mode ![](img/ef475044-6568-4e50-bc98-8ff0a0d6efbf.png)Figure 7.1: The drawing classification mode
...@@ -38,7 +38,7 @@ TensorFlow 教程( [https://www.tensorflow.org/tutorials/recurrent_quickdraw]( ...@@ -38,7 +38,7 @@ TensorFlow 教程( [https://www.tensorflow.org/tutorials/recurrent_quickdraw](
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. 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.
在前面提到的有趣的教程中详细描述了简单而优雅的模型以及构建模型的 Python 实现,其源代码位于仓库 [https://github.com/tensorflow/models](https://github.com/tensorflow/models) [中。](https://github.com/tensorflow/models) 。 在继续进行下一部分之前,我们只想说一件事:模型的构建,训练,评估和预测的代码与上一章中看到的代码不同,它使用了 称为`Estimator`[https://www.tensorflow.org/api_docs/python/tf/estimator/Estimator](https://www.tensorflow.org/api_docs/python/tf/estimator/Estimator) )的 TensorFlow API,或更准确地说,是自定义`Estimator`。 如果您对模型实现的详细信息感兴趣,则应该阅读有关创建和使用自定义`Estimator`[https://www.tensorflow.org/get_started/custom_estimators](https://www.tensorflow.org/get_started/custom_estimators) )的指南。 [https://github.com/tensorflow/models](https://github.com/tensorflow/models) `models/samples/core/get_started/custom_estimator.py`上的指南的有用源代码。 基本上,首先要实现一个函数,该函数定义模型,指定损耗和准确性度量,设置优化器和`training`操作,然后创建`tf.estimator.Estimator`类的实例并调用其`train``evaluate``predict`方法。 就像您将很快看到的那样,使用`Estimator`可以简化如何构建,训练和推断神经网络模型,但是由于它是高级 API,因此它还会执行一些低级任务,例如找出输入和输出 在移动设备上进行推理的节点名称更加困难。 在前面提到的有趣的教程中详细描述了简单而优雅的模型以及构建模型的 Python 实现,其源代码位于[仓库](https://github.com/tensorflow/models)中。 在继续进行下一部分之前,我们只想说一件事:模型的构建,训练,评估和预测的代码与上一章中看到的代码不同,它使用了称为[`Estimator`](https://www.tensorflow.org/api_docs/python/tf/estimator/Estimator)的 TensorFlow API,或更准确地说,是自定义`Estimator`。 如果您对模型实现的详细信息感兴趣,则应该阅读有关[创建和使用自定义`Estimator`](https://www.tensorflow.org/get_started/custom_estimators)的指南。 [这个页面](https://github.com/tensorflow/models)`models/samples/core/get_started/custom_estimator.py`上的指南的有用源代码。 基本上,首先要实现一个函数,该函数定义模型,指定损耗和准确性度量,设置优化器和`training`操作,然后创建`tf.estimator.Estimator`类的实例并调用其`train``evaluate``predict`方法。 就像您将很快看到的那样,使用`Estimator`可以简化如何构建,训练和推断神经网络模型,但是由于它是高级 API,因此它还会执行一些低级任务,例如找出输入和输出 在移动设备上进行推理的节点名称更加困难。
...@@ -48,7 +48,7 @@ If you don't have a good understanding of all these details, don't worry; to dev ...@@ -48,7 +48,7 @@ If you don't have a good understanding of all these details, don't worry; to dev
训练模型非常简单,但为移动部署准备模型则有些棘手。 在我们开始培训之前,请首先确保您已经在 TensorFlow 根目录中克隆了 TensorFlow 模型库( [https://github.com/tensorflow/models](https://github.com/tensorflow/models) ) ,就像我们在前两章中所做的一样。 然后从 [http://download.tensorflow.org/data/quickdraw_tutorial_dataset_v1.tar.gz](http://download.tensorflow.org/data/quickdraw_tutorial_dataset_v1.tar.gz) 下载图纸分类训练数据集,大约 1.1 GB,创建一个名为`rnn_tutorial_data`的新文件夹, 并解压缩`dataset tar.gz`文件。 您将看到 10 个训练 TFRecord 文件和 10 个评估 TFRecord 文件,以及两个带有`.classes`扩展名的文件,它们具有相同的内容,并且只是该数据集可用于分类的 345 个类别的纯文本,例如 如“绵羊”,“头骨”,“甜甜圈”和“苹果”。 训练模型非常简单,但为移动部署准备模型则有些棘手。 在我们开始培训之前,请首先确保您已经在 TensorFlow 根目录中克隆了 [TensorFlow 模型库](https://github.com/tensorflow/models),就像我们在前两章中所做的一样。 然后从[这里](http://download.tensorflow.org/data/quickdraw_tutorial_dataset_v1.tar.gz)下载图纸分类训练数据集,大约 1.1 GB,创建一个名为`rnn_tutorial_data`的新文件夹, 并解压缩`dataset tar.gz`文件。 您将看到 10 个训练 TFRecord 文件和 10 个评估 TFRecord 文件,以及两个带有`.classes`扩展名的文件,它们具有相同的内容,并且只是该数据集可用于分类的 345 个类别的纯文本,例如 如“绵羊”,“头骨”,“甜甜圈”和“苹果”。
...@@ -227,7 +227,7 @@ strip_unused_nodes(name=Squeeze,type_for_name=int64,shape_for_name="8",name=Resh ...@@ -227,7 +227,7 @@ strip_unused_nodes(name=Squeeze,type_for_name=int64,shape_for_name="8",name=Resh
![](img/6cc9946c-dfb2-41de-af95-a35e47d405a7.png)Figure 7.6: Finding out nodes causing model loading error but not related to model inference ![](img/6cc9946c-dfb2-41de-af95-a35e47d405a7.png)Figure 7.6: Finding out nodes causing model loading error but not related to model inference
那么,如何摆脱`global_step`以及其他相关的 cond 节点,由于它们的隔离性,它们不会被变换图工具剥离掉? 幸运的是,`freeze_graph`脚本支持这一点–仅在其源代码中记录了 [https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/tools/freeze_graph.py](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/tools/freeze_graph.py) 。 我们可以为脚本使用`variable_names_blacklist`参数来指定应在冻结模型中删除的节点: 那么,如何摆脱`global_step`以及其他相关的 cond 节点,由于它们的隔离性,它们不会被变换图工具剥离掉? 幸运的是,`freeze_graph`脚本支持这一点[仅在其源代码中记录](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/tools/freeze_graph.py)。 我们可以为脚本使用`variable_names_blacklist`参数来指定应在冻结模型中删除的节点:
```py ```py
python tensorflow/python/tools/freeze_graph.py --input_graph=/tmp/graph.pbtxt --input_checkpoint=/tmp/model.ckpt-314576 --output_graph=/tmp/quickdraw_frozen_long_blacklist.pb --output_node_names="dense/BiasAdd,ArgMax" --variable_names_blacklist="IsVariableInitialized,global_step,global_step/Initializer/zeros,cond/pred_id,cond/read/Switch,cond/read,cond/Switch_1,cond/Merge" python tensorflow/python/tools/freeze_graph.py --input_graph=/tmp/graph.pbtxt --input_checkpoint=/tmp/model.ckpt-314576 --output_graph=/tmp/quickdraw_frozen_long_blacklist.pb --output_node_names="dense/BiasAdd,ArgMax" --variable_names_blacklist="IsVariableInitialized,global_step,global_step/Initializer/zeros,cond/pred_id,cond/read/Switch,cond/read,cond/Switch_1,cond/Merge"
...@@ -323,7 +323,7 @@ tensorflow/core/kernels/random_op.cc ...@@ -323,7 +323,7 @@ tensorflow/core/kernels/random_op.cc
我们现在准备单独处理`ViewController.mm`,以完成我们的任务。 我们现在准备单独处理`ViewController.mm`,以完成我们的任务。
1. 在按图 7.6 设置基本常量和变量以及两个函数原型之后,在`ViewController``viewDidLoad`中实例化`UIButton``UILabel``UIImageView`。 每个 UI 控件都设置有多个`NSLayoutConstraint`(有关完整的代码列表,请参见源代码回购)。 `UIImageView`的相关代码如下: 1. 在按图 7.6 设置基本常量和变量以及两个函数原型之后,在`ViewController``viewDidLoad`中实例化`UIButton``UILabel``UIImageView`。 每个 UI 控件都设置有多个`NSLayoutConstraint`(有关完整的代码列表,请参见源代码仓库)。 `UIImageView`的相关代码如下:
```py ```py
_iv = [[UIImageView alloc] init]; _iv = [[UIImageView alloc] init];
...@@ -570,7 +570,7 @@ std::string getDrawingClassification(NSMutableArray *allPoints) { ...@@ -570,7 +570,7 @@ std::string getDrawingClassification(NSMutableArray *allPoints) {
} }
``` ```
9. 最后,`normalizeScreenCoordinates`函数将其在触摸事件中捕获的屏幕坐标中的所有点转换为增量差异–这几乎是 [https:// github 中的 Python 方法`parse_line`的一部分。 com / tensorflow / models / blob / master / tutorials / rnn / quickdraw / create_dataset.py](https://github.com/tensorflow/models/blob/master/tutorials/rnn/quickdraw/create_dataset.py) 9. 最后,`normalizeScreenCoordinates`函数将其在触摸事件中捕获的屏幕坐标中的所有点转换为增量差异 – 这几乎是[这个页面](https://github.com/tensorflow/models/blob/master/tutorials/rnn/quickdraw/create_dataset.py)中的 Python 方法`parse_line`的一部分
```py ```py
void normalizeScreenCoordinates(NSMutableArray *allPoints, float *normalized) { void normalizeScreenCoordinates(NSMutableArray *allPoints, float *normalized) {
......
...@@ -40,13 +40,13 @@ The other type of RNN that solves the vanishing gradient problem nicely is calle ...@@ -40,13 +40,13 @@ The other type of RNN that solves the vanishing gradient problem nicely is calle
三种常用技术可以使 LSTM 模型表现更好: 三种常用技术可以使 LSTM 模型表现更好:
* 堆叠 LSTM 层并增加层中神经元的数量:如果不产生过度拟合,通常这将导致功能更强大,更准确的网络模型。 如果还没有,那么您绝对应该玩 TensorFlow Playground( [http://playground.tensorflow.org](http://playground.tensorflow.org)来体验一下。 * 堆叠 LSTM 层并增加层中神经元的数量:如果不产生过度拟合,通常这将导致功能更强大,更准确的网络模型。 如果还没有,那么您绝对应该玩 [TensorFlow Playground](http://playground.tensorflow.org)来体验一下。
* 使用辍学处理过度拟合。 删除意味着随机删除图层中的隐藏单元和输入单元。 * 使用辍学处理过度拟合。 删除意味着随机删除图层中的隐藏单元和输入单元。
* 使用双向 RNN 在两个方向(常规方向和反向方向)处理每个输入序列,希望检测出可能被常规单向 RNN 忽略的模式。 * 使用双向 RNN 在两个方向(常规方向和反向方向)处理每个输入序列,希望检测出可能被常规单向 RNN 忽略的模式。
所有这些技术已经实现,并且可以在 TensorFlow 和 Keras API 中轻松访问。 所有这些技术已经实现,并且可以在 TensorFlow 和 Keras API 中轻松访问。
那么,我们如何使用 RNN 和 LSTM 测试股价预测? 我们将在 [https://www.alphavantage.co](https://www.alphavantage.co) 上使用免费的 API 收集特定股票代码的每日股票价格数据,将其解析为训练集和测试集,并在每次输入时提供 对 RNN / LSTM 模型的一批训练输入(每个训练输入有 20 个时间步长,即,连续 20 天的价格),对模型进行训练,然后进行测试以查看模型在测试数据集中的准确性。 我们将同时使用 TensorFlow 和 Keras API 进行测试,并比较常规 RNN 和 LSTM 模型之间的差异。 我们还将测试三个略有不同的序列输入和输出,看看哪个是最好的: 那么,我们如何使用 RNN 和 LSTM 测试股价预测? 我们将在[这个页面](https://www.alphavantage.co)上使用免费的 API 收集特定股票代码的每日股票价格数据,将其解析为训练集和测试集,并在每次输入时提供 对 RNN / LSTM 模型的一批训练输入(每个训练输入有 20 个时间步长,即,连续 20 天的价格),对模型进行训练,然后进行测试以查看模型在测试数据集中的准确性。 我们将同时使用 TensorFlow 和 Keras API 进行测试,并比较常规 RNN 和 LSTM 模型之间的差异。 我们还将测试三个略有不同的序列输入和输出,看看哪个是最好的:
* 根据过去 N 天预测一天的价格 * 根据过去 N 天预测一天的价格
* 根据过去 N 天预测 M 天的价格 * 根据过去 N 天预测 M 天的价格
...@@ -62,7 +62,7 @@ The other type of RNN that solves the vanishing gradient problem nicely is calle ...@@ -62,7 +62,7 @@ The other type of RNN that solves the vanishing gradient problem nicely is calle
首先,您需要在 [https://www.alphavantage.co](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 ```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" curl -o daily_amzn.csv "https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=amzn&apikey=<your_api_key>&datatype=csv&outputsize=full"
...@@ -105,7 +105,7 @@ seq_len = 20 ...@@ -105,7 +105,7 @@ seq_len = 20
learning_rate = 0.001 learning_rate = 0.001
``` ```
numpy( [http://www.numpy.org](http://www.numpy.org) )是用于 n 维数组操作的最受欢迎的 Python 库,而 Matplotlib( [https://matplotlib.org](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`数组:
...@@ -317,7 +317,7 @@ pip install --upgrade https://storage.googleapis.com/tensorflow/mac/cpu/tensorfl ...@@ -317,7 +317,7 @@ pip install --upgrade https://storage.googleapis.com/tensorflow/mac/cpu/tensorfl
pip install keras pip install keras
``` ```
如果您的操作系统不是 Mac 或计算机具有 GPU,则您需要用正确的 URL 替换 TensorFlow Python 软件包 URL,您可以在 [https://www.tensorflow 上找到它。 org / install](https://www.tensorflow.org/install) 如果您的操作系统不是 Mac 或计算机具有 GPU,则您需要用正确的 URL 替换 TensorFlow Python 软件包 URL,您可以在[这个页面](https://www.tensorflow.org/install)上找到它
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
自 2012 年深度学习起步以来,有人认为 Ian Goodfellow 在 2014 年提出的**生成对抗网络****GAN** )比这更有趣或更有前途, *生成对抗网络*[https://arxiv.org/abs/1406.2661](https://arxiv.org/abs/1406.2661)。 实际上, Facebook AI 研究主管和之一,深度学习研究人员之一的 Yann LeCun 将 GAN 和对抗训练称为*,“这是近十年来机器学习中最有趣的想法。 ”* 因此,我们如何在这里不介绍它,以了解 GAN 为什么如此令人兴奋,以及如何构建 GAN 模型并在 iOS 和 Android 上运行它们? 自 2012 年深度学习起步以来,有人认为 Ian Goodfellow 在 2014 年提出的[**生成对抗网络**](https://arxiv.org/abs/1406.2661)**GAN** )比这更有趣或更有前途。 实际上, Facebook AI 研究主管和之一,深度学习研究人员之一的 Yann LeCun 将 GAN 和对抗训练称为*,“这是近十年来机器学习中最有趣的想法。 ”* 因此,我们如何在这里不介绍它,以了解 GAN 为什么如此令人兴奋,以及如何构建 GAN 模型并在 iOS 和 Android 上运行它们?
在本章中,我们将首先概述 GAN 是什么,它如何工作以及为什么它具有如此巨大的潜力。 然后,我们将研究两个 GAN 模型:一个基本的 GAN 模型可用于生成类似人的手写数字,另一个更高级的 GAN 模型可将低分辨率的图像增强为高分辨率的图像。 我们将向您展示如何在 Python 和 TensorFlow 中构建和训练此类模型,以及如何为移动部署准备模型。 然后,我们将提供带有完整源代码的 iOS 和 Android 应用程序,它们使用这些模型来生成手写数字并增强图像。 在本章的最后,您应该准备好进一步探索各种基于 GAN 的模型,或者开始构建自己的模型,并了解如何在移动应用程序中运行它们。 在本章中,我们将首先概述 GAN 是什么,它如何工作以及为什么它具有如此巨大的潜力。 然后,我们将研究两个 GAN 模型:一个基本的 GAN 模型可用于生成类似人的手写数字,另一个更高级的 GAN 模型可将低分辨率的图像增强为高分辨率的图像。 我们将向您展示如何在 Python 和 TensorFlow 中构建和训练此类模型,以及如何为移动部署准备模型。 然后,我们将提供带有完整源代码的 iOS 和 Android 应用程序,它们使用这些模型来生成手写数字并增强图像。 在本章的最后,您应该准备好进一步探索各种基于 GAN 的模型,或者开始构建自己的模型,并了解如何在移动应用程序中运行它们。
...@@ -47,7 +47,7 @@ If you're interested in knowing more about the Nash Equilibrium, Google *"khan a ...@@ -47,7 +47,7 @@ If you're interested in knowing more about the Nash Equilibrium, Google *"khan a
但是,由于生成器和鉴别器的动态或竞争目标,训练 GAN 达到 Nash 平衡状态是一个棘手且困难的问题。 实际上,这仍然是一个开放的研究问题–伊恩·古德费洛(Ian Goodfellow)在 2017 年 8 月对安德鲁·伍(Andrew Ng)进行的*深度学习英雄*采访中(YouTube 上的搜索 *ian goodfellow andrew ng* )说,如果我们 可以使 GAN 变得像深度学习一样可靠,我们将看到 GAN 取得更大的成功,否则我们最终将用其他形式的生成模型代替它们。 但是,由于生成器和鉴别器的动态或竞争目标,训练 GAN 达到 Nash 平衡状态是一个棘手且困难的问题。 实际上,这仍然是一个开放的研究问题–伊恩·古德费洛(Ian Goodfellow)在 2017 年 8 月对安德鲁·伍(Andrew Ng)进行的*深度学习英雄*采访中(YouTube 上的搜索 *ian goodfellow andrew ng* )说,如果我们 可以使 GAN 变得像深度学习一样可靠,我们将看到 GAN 取得更大的成功,否则我们最终将用其他形式的生成模型代替它们。
尽管在 GAN 的培训方面存在挑战,但是在培训期间您已经可以应用许多有效的已知技巧( [https://github.com/soumith/ganhacks](https://github.com/soumith/ganhacks) )–我们不会介绍 它们在这里,但是如果您有兴趣调整我们将在本章中描述的模型或许多其他 GAN 模型( [https://github.com/eriklindernoren/Keras-GAN](https://github.com/eriklindernoren/Keras-GAN) ),或构建自己的 GAN 模型。 尽管在 GAN 的培训方面存在挑战,但是在培训期间您已经可以应用[许多有效的已知技巧](https://github.com/soumith/ganhacks) – 我们在这里不会介绍它们,但是如果您有兴趣调整我们将在本章中描述的模型或[许多其他 GAN 模型](https://github.com/eriklindernoren/Keras-GAN) ),或构建自己的 GAN 模型。
...@@ -67,7 +67,7 @@ If you're interested in knowing more about the Nash Equilibrium, Google *"khan a ...@@ -67,7 +67,7 @@ If you're interested in knowing more about the Nash Equilibrium, Google *"khan a
手写数字的训练模型基于回购协议 [https://github.com/jeffxtang/generative-adversarial-networks](https://github.com/jeffxtang/generative-adversarial-networks) ,这是 [https://github.com/jonbruner 的分支 / generative-adversarial-networks](https://github.com/jonbruner/generative-adversarial-networks) ,并添加了显示生成的数字并使用输入占位符保存 TensorFlow 训练模型的脚本,因此我们的 iOS 和 Android 应用程序可以使用该模型。 是的您应该查看原始回购的博客 [https://www.oreilly.com/learning/generative-adversarial-networks-for-beginners](https://www.oreilly.com/learning/generative-adversarial-networks-for-beginners) 在继续之前,需要对具有代码的 GAN 模型有基本的了解。 手写数字的训练模型基于[仓库](https://github.com/jeffxtang/generative-adversarial-networks),这是[这个页面](https://github.com/jonbruner/generative-adversarial-networks)的分支,并添加了显示生成的数字并使用输入占位符保存 TensorFlow 训练模型的脚本,因此我们的 iOS 和 Android 应用程序可以使用该模型。 是的您应该查看[原始仓库的博客](https://www.oreilly.com/learning/generative-adversarial-networks-for-beginners)在继续之前,需要对具有代码的 GAN 模型有基本的了解。
在研究定义生成器和鉴别器网络并进行 GAN 训练的核心代码片段之前,让我们先运行脚本以在克隆存储库并转到 repo 目录之后训练和测试模型: 在研究定义生成器和鉴别器网络并进行 GAN 训练的核心代码片段之前,让我们先运行脚本以在克隆存储库并转到 repo 目录之后训练和测试模型:
...@@ -141,7 +141,7 @@ python tensorflow/python/tools/freeze_graph.py \ ...@@ -141,7 +141,7 @@ python tensorflow/python/tools/freeze_graph.py \
我们将用于增强低分辨率模糊图像的模型基于*使用条件对抗网络*[https://arxiv.org/abs/1611.07004](https://arxiv.org/abs/1611.07004) )及其 TensorFlow 实现 pix2pix( [https://affinelayer.com/pix2pix/](https://affinelayer.com/pix2pix/) )。 在仓库的分支中( [https://github.com/jeffxtang/pix2pix-tensorflow](https://github.com/jeffxtang/pix2pix-tensorflow),我们添加了两个脚本: 我们将用于增强低分辨率模糊图像的模型,基于论文[《使用条件对抗网络的图像到图像转换》](https://arxiv.org/abs/1611.07004)及其 TensorFlow 实现 [pix2pix](https://affinelayer.com/pix2pix/)[在仓库的分支中](https://github.com/jeffxtang/pix2pix-tensorflow),我们添加了两个脚本:
* `tools/convert.py` 从普通图像创建模糊图像 * `tools/convert.py` 从普通图像创建模糊图像
* `pix2pix_runinference.py`添加了一个用于低分辨率图像输入的占位符和一个用于返回增强图像的操作,并保存了新的检查点文件,我们将冻结这些文件以生成在移动设备上使用的模型文件。 * `pix2pix_runinference.py`添加了一个用于低分辨率图像输入的占位符和一个用于返回增强图像的操作,并保存了新的检查点文件,我们将冻结这些文件以生成在移动设备上使用的模型文件。
...@@ -164,7 +164,7 @@ git clone https://github.com/jeffxtang/pix2pix-tensorflow ...@@ -164,7 +164,7 @@ git clone https://github.com/jeffxtang/pix2pix-tensorflow
cd pix2pix-tensorflow cd pix2pix-tensorflow
``` ```
2. 创建一个新目录`photos/original`并复制一些图像文件-例如,我们从斯坦福狗数据集( [http://vision.stanford.edu/aditya86/ImageNetDogs](http://vision.stanford.edu/aditya86/ImageNetDogs),在[第 2 章](../Text/02.html)*中将带有转移学习*的图像分类到`photos/original`目录 2. 创建一个新目录`photos/original`并复制一些图像文件-例如,我们从[斯坦福狗数据集](http://vision.stanford.edu/aditya86/ImageNetDogs),在[第 2 章](../Text/02.html)*中将带有转移学习*的图像分类到`photos/original`目录
3. 运行脚本`python tools/process.py --input_dir photos/original --operation resize --output_dir photos/resized`调整`photo/original`目录中图像的大小并将调整后的图像保存到`photos/resized`目录中 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`的代码如下: 4. 运行`mkdir photos/blurry`,然后运行`python tools/convert.py`,以使用流行的 ImageMagick 的`convert`命令将调整大小的图像转换为模糊的图像。 `convert.py`的代码如下:
...@@ -791,7 +791,7 @@ void runPix2PixBlurryModel() { ...@@ -791,7 +791,7 @@ void runPix2PixBlurryModel() {
在本章中,我们快速浏览了 GAN 的美好世界。 我们介绍了 GAN 的含义以及它们为何如此有趣的原因-生成器和鉴别器相互竞争并尝试击败的方式听起来对大多数人来说很有吸引力。 然后,我们详细介绍了如何训练基本 GAN 模型和更高级的图像分辨率增强模型以及如何为移动设备准备它们的详细步骤。 最后,我们向您展示了如何使用这些模型构建 iOS 和 Android 应用程序。 如果您对整个过程和结果感到兴奋,那么您肯定会想进一步探索 GAN,这是一个快速发展的领域,在该领域中,新型 GAN 已经迅速开发出来,以克服先前模型的缺点; 例如,正如我们在*增强图像分辨率*小节的 GAN 高级模型中看到的那样,开发了需要配对图像进行训练的 pix2pix 模型的同一位研究人员提出了一种称为 CycleGAN( [https://junyanz.github.io/CycleGAN](https://junyanz.github.io/CycleGAN),删除了图像配对的要求。 如果您对我们生成的数字或增强的图像的质量不满意,则可能还应该进一步探索 GAN,以了解如何改进 GAN 模型。 正如我们之前提到的,GAN 仍很年轻,研究人员仍在努力稳定培训,如果可以稳定的话,将会取得更大的成功。 至少到目前为止,您已经获得了如何在移动应用中快速部署 GAN 模型的经验。 由您决定是关注最新,最出色的 GAN 并在移动设备上使用它们,还是暂时搁置您的移动开发人员的帽子,会全力以赴来构建新的或改进现有的 GAN 模型。 在本章中,我们快速浏览了 GAN 的美好世界。 我们介绍了 GAN 的含义以及它们为何如此有趣的原因-生成器和鉴别器相互竞争并尝试击败的方式听起来对大多数人来说很有吸引力。 然后,我们详细介绍了如何训练基本 GAN 模型和更高级的图像分辨率增强模型以及如何为移动设备准备它们的详细步骤。 最后,我们向您展示了如何使用这些模型构建 iOS 和 Android 应用程序。 如果您对整个过程和结果感到兴奋,那么您肯定会想进一步探索 GAN,这是一个快速发展的领域,在该领域中,新型 GAN 已经迅速开发出来,以克服先前模型的缺点; 例如,正如我们在*增强图像分辨率*小节的 GAN 高级模型中看到的那样,开发了需要配对图像进行训练的 pix2pix 模型的同一位研究人员提出了一种称为 [CycleGAN](https://junyanz.github.io/CycleGAN) 的模型,删除了图像配对的要求。 如果您对我们生成的数字或增强的图像的质量不满意,则可能还应该进一步探索 GAN,以了解如何改进 GAN 模型。 正如我们之前提到的,GAN 仍很年轻,研究人员仍在努力稳定培训,如果可以稳定的话,将会取得更大的成功。 至少到目前为止,您已经获得了如何在移动应用中快速部署 GAN 模型的经验。 由您决定是关注最新,最出色的 GAN 并在移动设备上使用它们,还是暂时搁置您的移动开发人员的帽子,会全力以赴来构建新的或改进现有的 GAN 模型。
如果 GAN 在深度学习社区中引起了极大的兴奋,那么 AlphaGo 在 2016 年和 2017 年击败最优秀的人类 GO 玩家的成就无疑令所有人都感到惊讶。 此外,在 2017 年 10 月,AlphaGo Zero(一种完全基于自学强化学习而无需任何人类知识的新算法)被推举为击败 AlphaGo 100-0,令人难以置信。 2017 年 12 月,与仅在 GO 游戏中定位的 AlphaGo 和 AlphaGo Zero 不同,AlphaZero(一种可在许多具有挑战性的领域实现*“超人表现”* 的算法)被发布。 在下一章中,我们将看到如何使用最新最酷的 AlphaZero 来构建和训练用于玩简单游戏的模型,以及如何在移动设备上运行该模型。 如果 GAN 在深度学习社区中引起了极大的兴奋,那么 AlphaGo 在 2016 年和 2017 年击败最优秀的人类 GO 玩家的成就无疑令所有人都感到惊讶。 此外,在 2017 年 10 月,AlphaGo Zero(一种完全基于自学强化学习而无需任何人类知识的新算法)被推举为击败 AlphaGo 100-0,令人难以置信。 2017 年 12 月,与仅在 GO 游戏中定位的 AlphaGo 和 AlphaGo Zero 不同,AlphaZero(一种可在许多具有挑战性的领域实现*“超人表现”* 的算法)被发布。 在下一章中,我们将看到如何使用最新最酷的 AlphaZero 来构建和训练用于玩简单游戏的模型,以及如何在移动设备上运行该模型。
......
...@@ -6,11 +6,11 @@ ...@@ -6,11 +6,11 @@
尽管现代**人工智能****AI** )的日益普及基本上是由 2012 年深度学习的突破引起的,但 Google DeepMind 的 AlphaGo 击败李·塞多尔(Lee Sedol)的历史性事件是[ 《 HTG4》(HTG5)在 2016 年 3 月以 4-1 击败了 GO 世界冠军,然后在 2017 年 5 月以 3-0 击败了目前排名第一的 GO 玩家 Ke Jie,这在很大程度上使 AI 成为了家庭 首字母缩写词。 由于 GO 游戏的复杂性,人们普遍认为无法实现 任务,或者至少再十年无法实现, 认为计算机程序会击败顶级 GO 玩家 。 尽管现代**人工智能****AI** )的日益普及基本上是由 2012 年深度学习的突破引起的,但 Google DeepMind 的 AlphaGo 击败李·塞多尔(Lee Sedol)的历史性事件是[ 《 HTG4》(HTG5)在 2016 年 3 月以 4-1 击败了 GO 世界冠军,然后在 2017 年 5 月以 3-0 击败了目前排名第一的 GO 玩家 Ke Jie,这在很大程度上使 AI 成为了家庭 首字母缩写词。 由于 GO 游戏的复杂性,人们普遍认为无法实现 任务,或者至少再十年无法实现, 认为计算机程序会击败顶级 GO 玩家 。
在 2017 年 5 月 AlphaGo 和 Ke Jie 的比赛之后,Google 退役了 AlphaGo; 谷歌(DeepMind)是 Google 因其开创性的深度强化学习技术而收购的创业公司,也是 AlphaGo 的开发商,决定将其 AI 研究重点放在其他领域。 然后,有趣的是,在 2017 年 10 月,DeepMind 在游戏上发表了另一篇论文 *GO:在没有人类知识的情况下掌握 GO 游戏*( [https://deepmind.com/research/publications/mastering- 无人游戏的游戏](https://deepmind.com/research/publications/mastering-game-go-without-human-knowledge)),它描述了一种称为 AlphaGo Zero 的改进算法,该算法仅通过自我强化学习来学习如何玩 GO,而无需依赖任何人类专家知识,例如 大量专业的 GO 游戏,AlphaGo 用来训练其模型。 令人惊讶的是,AlphaGo Zero 完全击败了 AlphaGo,后者在几个月前以 100-0 击败了世界上最好的人类 GO 玩家! 在 2017 年 5 月 AlphaGo 和 Ke Jie 的比赛之后,Google 退役了 AlphaGo; 谷歌(DeepMind)是 Google 因其开创性的深度强化学习技术而收购的创业公司,也是 AlphaGo 的开发商,决定将其 AI 研究重点放在其他领域。 然后,有趣的是,在 2017 年 10 月,DeepMind 在游戏上发表了另一篇论文[《GO:在没有人类知识的情况下掌握围棋游戏》](https://deepmind.com/research/publications/mastering-game-go-without-human-knowledge),它描述了一种称为 AlphaGo Zero 的改进算法,该算法仅通过自我强化学习来学习如何玩围棋,而无需依赖任何人类专家知识,例如 大量专业的围棋游戏,AlphaGo 用来训练其模型。 令人惊讶的是,AlphaGo Zero 完全击败了 AlphaGo,后者在几个月前以 100-0 击败了世界上最好的人类 GO 玩家!
事实证明,这只是朝着 Google 更雄心勃勃的目标迈出的一步,该目标是将 AlphaGo 背后的 AI 技术应用和改进到其他领域。 2017 年 12 月,DeepMind 发表了另一篇论文,即使用通用强化学习算法通过自学掌握国际象棋和将棋( [https://arxiv.org/pdf/1712.01815.pdf](https://arxiv.org/pdf/1712.01815.pdf),对 AlphaGo 进行了概括。 将零程序归类为一个称为 AlphaZero 的算法,并使用该算法从头开始快速学习如何玩象棋和将棋的游戏,从除了游戏规则之外没有任何领域知识的随机游戏开始,并在 24 小时内实现了超人级别并击败世界冠军。 事实证明,这只是朝着 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](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 章](../Text/08.html)*中使用 RNN* 预测股价的流行的高级深度学习库。 我们还将介绍如何使用训练有素的 AlphaZero 模型来获得训练有素的专家策略,以指导移动游戏的玩法,以及使用该模型玩 Connect 4 游戏的完整 iOS 和 Android 应用程序的源代码。
总之,本章将涵盖以下主题: 总之,本章将涵盖以下主题:
...@@ -51,9 +51,9 @@ If you're not familiar with reinforcement learning or MCTS, there's lots of info ...@@ -51,9 +51,9 @@ If you're not familiar with reinforcement learning or MCTS, there's lots of info
如果您从未玩过 Connect 4,则可以在 [http://www.connectfour.org](http://www.connectfour.org) 上免费玩它。 这是一个快速有趣的游戏。 基本上,两个播放器轮流从一列的顶部将不同颜色的光盘放入六行乘七列的网格中。 如果尚未在该列中放入任何光盘,则新放置的光盘将位于该列的底部,或者位于该列中最后放置的光盘的顶部。 谁先在三个可能的方向(水平,垂直,对角线)中的任何一个方向上拥有自己颜色的四个连续光盘赢得比赛。 如果您从未玩过 Connect 4,则可以在[这个页面](http://www.connectfour.org)上免费玩它。 这是一个快速有趣的游戏。 基本上,两个播放器轮流从一列的顶部将不同颜色的光盘放入六行乘七列的网格中。 如果尚未在该列中放入任何光盘,则新放置的光盘将位于该列的底部,或者位于该列中最后放置的光盘的顶部。 谁先在三个可能的方向(水平,垂直,对角线)中的任何一个方向上拥有自己颜色的四个连续光盘赢得比赛。
Connect 4 的 AlphaZero 模型基于 [https://github.com/jeffxtang/DeepReinforcementLearning](https://github.com/jeffxtang/DeepReinforcementLearning) 存储库,这是 [https://github.com/AppliedDataSciencePartners/DeepReinforcementLearning](https://github.com/AppliedDataSciencePartners/DeepReinforcementLearning) 的分支, 在*上有一个不错的博客,如何使用 Python 和 Keras 构建自己的 AlphaZero AI*[https://applied-data.science/blog/how-to-build-your-own-alphazero- ai-using-python-and-keras](https://applied-data.science/blog/how-to-build-your-own-alphazero-ai-using-python-and-keras),您可能应该在继续之前阅读它,因此以下步骤更有意义。 Connect 4 的 AlphaZero 模型基于[存储库](https://github.com/jeffxtang/DeepReinforcementLearning),这是[这个页面](https://github.com/AppliedDataSciencePartners/DeepReinforcementLearning)的分支, 有一个不错的博客,[如何使用 Python 和 Keras 构建自己的 AlphaZero AI](https://applied-data.science/blog/how-to-build-your-own-alphazero-ai-using-python-and-keras),您可能应该在继续之前阅读它,因此以下步骤更有意义。
...@@ -109,7 +109,7 @@ model.png 文件包含深度神经网络体系结构的详细视图。 卷积层 ...@@ -109,7 +109,7 @@ model.png 文件包含深度神经网络体系结构的详细视图。 卷积层
![](img/99dc16a9-52c9-4adf-bd8f-1a244504de79.png)Figure 10.1 The first layers of the deep residual network ![](img/99dc16a9-52c9-4adf-bd8f-1a244504de79.png)Figure 10.1 The first layers of the deep residual network
值得注意的是,神经网络称为残差网络(ResNet),由 Microsoft 于 2015 年在 ImageNet 和 COCO 2015 竞赛的获奖作品中引入。 在 ResNet 中,使用身份映射(图 10.1 右侧的箭头)可避免在网络越深时出现更高的训练错误。 有关 ResNet 的更多信息,您可以查看原始论文*用于图像识别的深度残差学习*[https://arxiv.org/pdf/1512.03385v1.pdf](https://arxiv.org/pdf/1512.03385v1.pdf) ), 以及博客*了解深度残留网络*-一个简单的模块化学习框架,它重新定义了构成最新技术的内容( [https://blog.waya.ai/deep-residual- 学习 9610bb62c355](https://blog.waya.ai/deep-residual-learning-9610bb62c355) 值得注意的是,神经网络称为残差网络(ResNet),由 Microsoft 于 2015 年在 ImageNet 和 COCO 2015 竞赛的获奖作品中引入。 在 ResNet 中,使用身份映射(图 10.1 右侧的箭头)可避免在网络越深时出现更高的训练错误。 有关 ResNet 的更多信息,您可以查看原始论文[《用于图像识别的深度残差学习》](https://arxiv.org/pdf/1512.03385v1.pdf), 以及博客[《了解深度残留网络》](https://blog.waya.ai/deep-residual-learning-9610bb62c355) - 一个简单的模块化学习框架,它重新定义了构成最新技术的内容
深度网络的最后一层如图 10.2 所示,您可以看到,在最后的残差块和具有批处理归一化和 ReLU 层的卷积层之后,将应用密集的全连接层以输出`value_head and policy_head`值: 深度网络的最后一层如图 10.2 所示,您可以看到,在最后的残差块和具有批处理归一化和 ReLU 层的卷积层之后,将应用密集的全连接层以输出`value_head and policy_head`值:
...@@ -226,7 +226,7 @@ playMatchesBetweenVersions(env, 1, 4, -1, 10, lg.logger_tourney, 0) ...@@ -226,7 +226,7 @@ playMatchesBetweenVersions(env, 1, 4, -1, 10, lg.logger_tourney, 0)
*`run.ipynb`(第二个代码块)Python 笔记本中运行模型几天。 在我们的测试中,该模型的版本 19 在较旧的 iMac 上运行了大约一天后,击败了版本 1 或 4 10:0(回想一下版本 1 和版本 4 处于相同水平) *`run.ipynb`(第二个代码块)Python 笔记本中运行模型几天。 在我们的测试中,该模型的版本 19 在较旧的 iMac 上运行了大约一天后,击败了版本 1 或 4 10:0(回想一下版本 1 和版本 4 处于相同水平)
* 为了提高 MCTS 评分公式的强度:MCTS 在模拟过程中使用上置信度树(UCT)评分来选择要做出的举动,并且回购中的公式是这样的(请参见博客 [http:// tim .hibal.org / blog / alpha-zero-how-and-why-it-works](http://tim.hibal.org/blog/alpha-zero-how-and-why-it-works) 以及 AlphaZero 官方论文以获取更多详细信息): * 为了提高 MCTS 评分公式的强度:MCTS 在模拟过程中使用上置信度树(UCT)评分来选择要做出的举动,并且仓库中的公式是这样的(请参见[博客](http://tim.hibal.org/blog/alpha-zero-how-and-why-it-works)以及 AlphaZero 官方论文以获取更多详细信息):
```py ```py
edge.stats['P'] * np.sqrt(Nb) / (1 + edge.stats['N']) edge.stats['P'] * np.sqrt(Nb) / (1 + edge.stats['N'])
......
...@@ -31,7 +31,7 @@ TensorFlow Lite( [https://www.tensorflow.org/mobile/tflite](https://www.tensor ...@@ -31,7 +31,7 @@ TensorFlow Lite( [https://www.tensorflow.org/mobile/tflite](https://www.tensor
You can also pick a prebuilt TensorFlow Lite model, such as the MobileNet models available at [https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet_v1.md](https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet_v1.md), which we used for retraining in [Chapter 2](../Text/02.html), *Classifying Images with Transfer Learning*. Each of the MobileNet model `tgz` files that you can download there contains a converted TensorFlow Lite model. For example, the `MobileNet_v1_1.0_224.tgz` file contains a `mobilenet_v1_1.0_224.tflite` file that you can use directly on mobile. If you use such a prebuilt TensorFlow Lite model, you can skip steps 2 and 3. You can also pick a prebuilt TensorFlow Lite model, such as the MobileNet models available at [https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet_v1.md](https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet_v1.md), which we used for retraining in [Chapter 2](../Text/02.html), *Classifying Images with Transfer Learning*. Each of the MobileNet model `tgz` files that you can download there contains a converted TensorFlow Lite model. For example, the `MobileNet_v1_1.0_224.tgz` file contains a `mobilenet_v1_1.0_224.tflite` file that you can use directly on mobile. If you use such a prebuilt TensorFlow Lite model, you can skip steps 2 and 3.
2. 构建 TensorFlow Lite 转换器工具。 如果您从 [https://github.com/tensorflow/tensorflow/releases](https://github.com/tensorflow/tensorflow/releases) 下载 TensorFlow 1.5 或 1.6 版本,则可以从 TensorFlow 源根目录在终端上运行`bazel build tensorflow/contrib/lite/toco:toco`。 如果您使用更高版本或获取最新的 TensorFlow 回购,您应该可以使用此`build`命令来执行此操作,但如果没有,请查看该新版本的文档。 2. 构建 TensorFlow Lite 转换器工具。 如果您从 [https://github.com/tensorflow/tensorflow/releases](https://github.com/tensorflow/tensorflow/releases) 下载 TensorFlow 1.5 或 1.6 版本,则可以从 TensorFlow 源根目录在终端上运行`bazel build tensorflow/contrib/lite/toco:toco`。 如果您使用更高版本或获取最新的 TensorFlow 仓库,您应该可以使用此`build`命令来执行此操作,但如果没有,请查看该新版本的文档。
3. 使用 TensorFlow Lite 转换器工具将 TensorFlow 模型转换为 TensorFlow Lite 模型。 在下一节中,您将看到一个详细的示例。 3. 使用 TensorFlow Lite 转换器工具将 TensorFlow 模型转换为 TensorFlow Lite 模型。 在下一节中,您将看到一个详细的示例。
4. 在 iOS 或 Android 上部署 TensorFlow Lite 模型-对于 iOS,使用 C ++ API 加载和运行模型; 对于 Android,请使用 Java API(围绕 C ++ API 的包装器)加载和运行模型。 与我们之前在 TensorFlow Mobile 项目中使用的`Session`类不同,C ++和 Java API 均使用 TensorFlow-lite 特定的`Interpreter`类来推断模型。 在接下来的两个部分中,我们将向您展示 iOS C ++代码和 Android Java 代码以使用`Interpreter` 4. 在 iOS 或 Android 上部署 TensorFlow Lite 模型-对于 iOS,使用 C ++ API 加载和运行模型; 对于 Android,请使用 Java API(围绕 C ++ API 的包装器)加载和运行模型。 与我们之前在 TensorFlow Mobile 项目中使用的`Session`类不同,C ++和 Java API 均使用 TensorFlow-lite 特定的`Interpreter`类来推断模型。 在接下来的两个部分中,我们将向您展示 iOS C ++代码和 Android Java 代码以使用`Interpreter`
...@@ -58,7 +58,7 @@ If you run a TensorFlow Lite model on Android, and if the Android device is Andr ...@@ -58,7 +58,7 @@ If you run a TensorFlow Lite model on Android, and if the Android device is Andr
有两个用于 iOS 的 TensorFlow Lite 示例应用程序,名为[simple and camera]的,类似于 TensorFlow Mobile iOS 应用程序 simple 和 camera,但在 TensorFlow 1.5-1.8 的官方版本中的 TensorFlow Lite API 中实现 [https://github.com/tensorflow/tensorflow/releases](https://github.com/tensorflow/tensorflow/releases) ,并且可能也在最新的 TensorFlow 回购中。 您可以运行以下命令来准备和运行这两个应用,类似地在[的“ iOS 演示应用”下进行了记录:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite) 有两个用于 iOS 的 TensorFlow Lite 示例应用程序,名为[simple and camera]的,类似于 TensorFlow Mobile iOS 应用程序 simple 和 camera,但在 TensorFlow 1.5-1.8 的官方版本中的 TensorFlow Lite API 中实现 [https://github.com/tensorflow/tensorflow/releases](https://github.com/tensorflow/tensorflow/releases) ,并且可能也在最新的 TensorFlow 仓库中。 您可以运行以下命令来准备和运行这两个应用,类似地在[的“ iOS 演示应用”下进行了记录:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite)
```py ```py
cd tensorflow/contrib/lite/examples/ios cd tensorflow/contrib/lite/examples/ios
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册