提交 93c1f499 编写于 作者: W wizardforcel

2020-12-14 22:10:54

上级 5ee73c6b
......@@ -79,7 +79,7 @@ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
sudo pip install --upgrade /tmp/tensorflow_pkg/tensorflow-1.4.0-cp27-cp27m-macosx_10_12_intel.whl
```
老实说,如果您在此过程中遇到任何错误,则搜索错误消息应该是修复该错误的最佳方法,因为我们打算在本书中重点介绍从我们长期积累的技巧和知识,而这些技巧和知识在其他地方不易获得 数小时的构建和调试实用的移动 TensorFlow 应用程序。 运行`sudo pip install`命令时,您可能会看到的一个特定错误是`Operation not permitted`错误。 要解决此问题,您可以通过重新启动 Mac 并点击`Cmd + R`键来禁用 Mac 的**系统完整性保护****SIP**) 要进入恢复模式,请在实用程序终端下,在重新启动 Mac 之前运行`csrutil disable`。 如果您对禁用 SIP 不满意,可以按照 TensorFlow 文档尝试使用更复杂的安装方法之一,例如 VirtualEnv。
老实说,如果您在此过程中遇到任何错误,则搜索错误消息应该是修复该错误的最佳方法,因为我们打算在本书中重点介绍从我们长期积累的技巧和知识,从数小时的构建和调试实用的移动 TensorFlow 应用程序中获取,它们在其他地方不易获得。 运行`sudo pip install`命令时,您可能会看到的一个特定错误是`Operation not permitted`错误。 要解决此问题,您可以通过重新启动 Mac 并点击`Cmd + R`键来禁用 Mac 的**系统完整性保护****SIP**) 要进入恢复模式,请在实用程序终端下,在重新启动 Mac 之前运行`csrutil disable`。 如果您对禁用 SIP 不满意,可以按照 TensorFlow 文档尝试使用更复杂的安装方法之一,例如 VirtualEnv。
如果一切顺利,则应该能够在终端窗口,Python 或最好在 IPython 上运行,然后运行`import tensorflow as tf``tf.__version__`将 1.4.0 作为输出。
......@@ -219,7 +219,7 @@ Android Studio 是开发 Android 应用程序的最佳工具,并且 TensorFlow
图 1.4:Android SDK Manager,用于安装 SDK 工具和 NDK
最后,由于 TensorFlow Android 应用程序使用 C++ 中的本机 TensorFlow 库来加载和运行 TensorFlow 模型,因此您需要安装 Android **本机开发套件****NDK**),您可以执行以下任一操作 从上一个屏幕快照中显示的 Android SDK Manager 中获取,或者直接从[这里](https://developer.android.com/ndk/downloads/index.html)下载 NDK。 NDK 版本 r16b 和 r15c 均已通过测试可运行本书中的 Android 应用。 如果直接下载 NDK,则在打开项目并选择 Android Studio 的`File | Project Structure`后,您可能还需要设置 Android NDK 位置,如以下屏幕截图所示:
最后,由于 TensorFlow Android 应用程序使用 C++ 中的本机 TensorFlow 库来加载和运行 TensorFlow 模型,因此您需要安装 Android **本机开发套件****NDK**),您可以执行以下任一操作从上一个屏幕快照中显示的 Android SDK Manager 中获取,或者直接从[这里](https://developer.android.com/ndk/downloads/index.html)下载 NDK。 NDK 版本 r16b 和 r15c 均已通过测试可运行本书中的 Android 应用。 如果直接下载 NDK,则在打开项目并选择 Android Studio 的`File | Project Structure`后,您可能还需要设置 Android NDK 位置,如以下屏幕截图所示:
![](img/1f6a2d74-0be0-4f36-9796-2cf66eb1694f.png)
......@@ -251,7 +251,7 @@ Android Studio 是开发 Android 应用程序的最佳工具,并且 TensorFlow
在本章的最后两部分中,我们将测试运行 TensorFlow 1.4 随附的三个示例 iOS 应用程序和四个示例 Android 应用程序,以确保您正确设置了移动 TensorFlow 开发环境并快速预览了其中的一些内容 TensorFlow 移动应用程序可以做到。
三个示例 TensorFlow iOS 应用程序的源代码位于`tensorflow/examples/ios: simple``camera``benchmark`。 为了成功运行这些样本,您需要首先下载一个由 Google 训练的深度学习模型,称为 [Inception](https://github.com/tensorflow/models/tree/master/research/inception),用于 图像识别。 Inception 有多个版本:v1 到 v4,在每个较新的版本中准确性更高。 在这里,我们将使用 Inception v1 作为为其开发的示例。 下载模型文件后,将与模型相关的文件复制到每个样本的`data`文件夹中:
三个示例 TensorFlow iOS 应用程序的源代码位于`tensorflow/examples/ios: simple``camera``benchmark`。 为了成功运行这些样本,您需要首先下载一个由 Google 训练的深度学习模型,称为 [Inception](https://github.com/tensorflow/models/tree/master/research/inception),用于图像识别。 Inception 有多个版本:v1 到 v4,在每个较新的版本中准确性更高。 在这里,我们将使用 Inception v1 作为为其开发的示例。 下载模型文件后,将与模型相关的文件复制到每个样本的`data`文件夹中:
```py
curl -o ~/graphs/inception5h.zip https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip
......@@ -291,7 +291,7 @@ open tf_benchmark_example.xcworkspace
`tensorflow/examples/android`中有四个样本 TensorFlow Android 应用,分别为 TF 分类,TF 检测,TF 语音和 TF 风格化。 运行这些示例的最简单方法是使用 Android Studio 在前面的文件夹中打开项目,如“设置 Android Studio”部分中所示,然后通过编辑项目的`build.gradle`文件进行单个更改 并将`def nativeBuildSystem = 'bazel'`更改为`def nativeBuildSystem = 'none'`
`tensorflow/examples/android`中有四个样本 TensorFlow Android 应用,分别为 TF 分类,TF 检测,TF 语音和 TF 风格化。 运行这些示例的最简单方法是使用 Android Studio 在前面的文件夹中打开项目,如“设置 Android Studio”部分中所示,然后通过编辑项目的`build.gradle`文件进行单个更改并将`def nativeBuildSystem = 'bazel'`更改为`def nativeBuildSystem = 'none'`
现在,将 Android 设备连接到您的计算机,然后通过选择 Android Studio 的`Run | Run 'android'`构建,安装和运行该应用。这会在您的设备上安装四个名称为“TF 分类”,“TF 检测”,“TF 语音”和“TF 风格化”的 Android 应用。 “TF 分类”就像 iOS 相机应用程序一样,使用 TensorFlow Inception v1 模型对设备相机进行实时对象分类。 “TF 检测”使用另一种模型,称为**单发多框检测器****SSD**)和 MobileNet,这是 Google 发布的一组新的深度学习模型,专门针对移动和嵌入式设备, 要执行对象检测,请在检测到的对象上绘制矩形。 “TF 语音”使用另一种不同的深度学习(语音识别)模型来收听和识别一小部分单词,例如`Yes``No``Left``Right``Stop``Start`。 “TF 风格化”使用另一种模型来更改相机看到的图像样式。 有关这些应用程序的更多详细信息,您可以在[这个页面](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android)中查看 TensorFlow Android 示例文档。
......
......@@ -28,9 +28,9 @@
我们人类不会从头开始学习新事物。 取而代之的是,无论是否有意识地,我们都充分利用所学到的知识。 人工智能中的迁移学习试图做同样的事情-这种技术通常只需要训练的大型模型中的一小块,然后将其重新用于相关任务的新模型中,而无需访问大型训练数据和计算资源 训练原始模型。 总体而言,迁移学习仍然是 AI 中的一个开放问题,因为在许多情况下,仅需人类反复尝试几个例子,然后再学习掌握新事物,就会花很多时间来训练和学习 AI。 但是,在图像识别领域,迁移学习已被证明是非常有效的。
我们人类不会从头开始学习新事物。 取而代之的是,无论是否有意识地,我们都充分利用所学到的知识。 人工智能中的迁移学习试图做同样的事情-这种技术通常只需要训练的大型模型中的一小块,然后将其重新用于相关任务的新模型中,而无需访问大型训练数据和计算资源训练原始模型。 总体而言,迁移学习仍然是 AI 中的一个开放问题,因为在许多情况下,仅需人类反复尝试几个例子,然后再学习掌握新事物,就会花很多时间来训练和学习 AI。 但是,在图像识别领域,迁移学习已被证明是非常有效的。
用于图像识别的现代深度学习模型通常是深度神经网络,或更具体地说,是具有许多层的深度**卷积神经网络****CNN**)。 这种 CNN 的较低层负责学习和识别较低层的功能,例如图像的边缘,轮廓和零件,而最后一层则确定图像的类别。 对于不同类型的对象,例如犬种或花朵类型,我们不需要重新学习网络较低层的参数或权重。 实际上,从头开始需要花费数周的训练来学习用于图像识别的现代 CNN 的所有权重,通常是数百万甚至更多。 传输 在图像分类的情况下,学习使我们能够使用特定的图像集重新训练此类 CNN 的最后一层,通常不到一小时,而 所有其他层都保持不变,并且达到了几乎相同的精度,就像我们从头开始训练整个网络数周一样。
用于图像识别的现代深度学习模型通常是深度神经网络,或更具体地说,是具有许多层的深度**卷积神经网络****CNN**)。 这种 CNN 的较低层负责学习和识别较低层的功能,例如图像的边缘,轮廓和零件,而最后一层则确定图像的类别。 对于不同类型的对象,例如犬种或花朵类型,我们不需要重新学习网络较低层的参数或权重。 实际上,从头开始需要花费数周的训练来学习用于图像识别的现代 CNN 的所有权重,通常是数百万甚至更多。 在图像分类的情况下,迁移学习使我们能够使用特定的图像集重新训练此类 CNN 的最后一层,通常不到一小时,而所有其他层都保持不变,并且达到了几乎相同的精度,就像我们从头开始训练整个网络数周一样。
迁移学习的第二个主要好处是,我们只需要少量的训练数据就可以重新训练 CNN 的最后一层。 如果必须从头开始训练深层 CNN 的数百万个参数,则需要大量的训练数据。 例如,对于我们的狗品种再训练,我们只需要为每个狗品种提供 100 幅以上的图像,即可建立一个比原始图像分类模型更好的狗品种分类模型。
......@@ -96,7 +96,7 @@ INFO:tensorflow:Final test accuracy = 91.0% (N=2109)
```
训练精度是神经网络用于训练的图像上的分类精度,而验证精度是神经网络未用于训练的图像上的验证精度。 因此,验证准确度是衡量模型准确度的一种更可靠的度量,并且通常应该比训练准确度小一点,但是如果训练收敛并进行得很好,也就是说,如果训练的模型是 既不适合也不适合。
训练精度是神经网络用于训练的图像上的分类精度,而验证精度是神经网络未用于训练的图像上的验证精度。 因此,验证准确度是衡量模型准确度的一种更可靠的度量,并且通常应该比训练准确度小一点,但是如果训练收敛并进行得很好,也就是说,训练的模型是否既不欠拟合也不过拟合。
如果火车精度很高,但验证精度仍然很低,则意味着模型过拟合。 如果火车精度仍然很低,则表明模型不适合。 同样,交叉熵是损失函数值,如果再训练顺利进行,则总体上应该越来越小。 最后,测试准确性取决于尚未用于训练或验证的图像。 通常,这是我们可以说出的关于重新训练模型的最准确的值。
......
......@@ -45,7 +45,7 @@
在本部分中,我们将向您展示如何使用带有 TensorFlow 的快速神经样式传输算法训练模型。 执行以下步骤来训练这样的模型:
1. 在 Mac 的终端上,或者最好在 GPU 驱动的 Ubuntu 上,运行`git clone https://github.com/jeffxtang/fast-style-transfer`,这是 Johnson 的快速样式传输的 TensorFlow 实现的一个很好的分支,已修改为允许在 iOS 或 Android 应用中使用经过训练的模型。
2. `cd`到快速样式迁移目录,然后运行`setup.sh`脚本下载预先训练的 VGG-19 模型文件以及 MS COCO 训练数据集,我们在上一章中提到过-注意 下载大文件可能需要几个小时。
2. `cd`到快速样式迁移目录,然后运行`setup.sh`脚本下载预先训练的 VGG-19 模型文件以及 MS COCO 训练数据集,我们在上一章中提到过,注意下载大文件可能需要几个小时。
3. 运行以下命令,使用名为`starry_night.jpg`的样式图像和名为`ww1.jpg`的内容图像进行训练,以创建检查点文件:
```py
......@@ -97,9 +97,9 @@ bazel-bin/tensorflow/tools/quantization/quantize_graph \
这会将冻结的图形文件大小从 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) 进行查看,以及 希望更好,样式迁移效果
这就是使用样式图像和输入图像来训练和量化快速神经传递模型的全部步骤。 您可以在步骤 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) 进行查看,以及希望样式迁移效果更好
在了解如何在 iOS 和 Android 应用程序中使用这些模型之前,重要的一点是,您需要记下指定为`--in-path` 值的图像的确切图像宽度和高度 ]在第 5 步中使用 参数,并在 iOS 或 Android 代码中使用图像的宽度和高度值(您会看到多久了),否则会出现 `Conv2DCustomBackpropInput: Size of out_backprop doesn't match computed` 错误 在应用中运行模型时
在了解如何在 iOS 和 Android 应用程序中使用这些模型之前,重要的一点是,您需要记下在第 5 步中使用的,指定为`--in-path`值的图像的确切图像宽度和高度参数,并在 iOS 或 Android 代码中使用图像的宽度和高度值(您会看到多久了),否则在应用中运行模型时,会出现 `Conv2DCustomBackpropInput: Size of out_backprop doesn't match computed`错误
......@@ -615,7 +615,7 @@ for (int i=0; i < intValues.length; ++i) {
}
```
注意,多样式模型返回浮点数数组`outputValues` ,它们的范围都在 0.0 到 1.0 之间,因此我们需要将它们相乘 在应用左位移操作以获取红色和绿色值之前,先进行 255 乘以 255,然后对 `intValues` 数组的每个元素应用按位“或”设置最终 ARGB 值。
注意,多样式模型返回浮点数数组`outputValues`,它们的范围都在 0.0 到 1.0 之间,因此我们需要将它们相乘。在应用左位移操作以获取红色和绿色值之前,先进行 255 乘以 255,然后对 `intValues` 数组的每个元素应用按位“或”设置最终 ARGB 值。
这就是将酷炫的多样式模型添加到独立的 Android 应用程序所需的全部工作。 现在,让我们运行该应用程序,并使用不同的测试图像,但使用与 iOS 应用程序中相同的三种样式值组合。
......
......@@ -6,7 +6,7 @@
如今,语音服务(例如 Apple Siri,Amazon Alexa,Google Assistant 和 Google Translate)已变得越来越流行,因为语音是我们在某些情况下查找信息或完成任务的最自然和有效的方法。 这些语音服务中的许多服务都是基于云的,因为用户语音可能会很长而且很自由,并且**自动语音识别****ASR**)非常复杂,并且需要大量的计算能力。 实际上,得益于深度学习的突破,仅在最近几年,在自然和嘈杂的环境中 ASR 才变得可行。
但是在某些情况下,能够离线识别设备上的简单语音命令是有意义的。 例如,要控制 Raspberry-Pi 驱动的机器人的运动,您不需要复杂的语音命令,不仅设备上的 ASR 比基于云的解决方案还快,而且即使在 没有网络访问的环境。 设备上的简单语音命令识别还可以通过仅在发出某些明确的用户命令时才向服务器发送复杂的用户语音来节省网络带宽。
但是在某些情况下,能够离线识别设备上的简单语音命令是有意义的。 例如,要控制 Raspberry-Pi 驱动的机器人的运动,您不需要复杂的语音命令,不仅设备上的 ASR 比基于云的解决方案还快,而且即使在没有网络访问的环境。 设备上的简单语音命令识别还可以通过仅在发出某些明确的用户命令时才向服务器发送复杂的用户语音来节省网络带宽。
在本章中,我们将首先概述 ASR 技术,涵盖基于最新的深度学习系统和顶级开源项目。 然后,我们将讨论如何训练和重新训练 TensorFlow 模型,以识别简单的语音命令,例如`"left", "right", "up", "down", "stop", "go"`。 接下来,我们将使用训练有素的模型来构建一个简单的 Android 应用程序,然后再构建两个完整的 iOS 应用程序,一个由 Objective-C 实现,另一个由 Swift 实现。 在前两章中我们没有介绍使用 TensorFlow 模型的基于 Swift 的 iOS 应用,而本章是回顾和加强我们对构建基于 Swift 的 TensorFlow iOS 应用的理解的好地方。
......@@ -32,7 +32,7 @@
RNN 允许我们处理输入和/或输出的序列,因为根据设计,网络可以存储输入序列中的先前项目或可以生成输出序列。 这使RNN更适用于语音识别(输入是用户说出的单词序列),图像标题(输出是由一系列单词组成的自然语言句子),文本生成和时间序列预测 。 如果您不熟悉 RNN,则一定要查看 Andrey Karpathy 的博客,[循环神经网络的不合理有效性](http://karpathy.github.io/2015/05/21/rnn-effectiveness)。 在本书的后面,我们还将介绍一些详细的 RNN 模型。
[关于 RNN 端到端语音识别的第一篇研究论文发表于 2014 年](http://proceedings.mlr.press/v32/graves14.pdf),使用的是**连接主义的时间分类****CTC**)层。 2014 年下半年,百度发布了 [Deep Speech](https://arxiv.org/abs/1412.5567),这是第一个使用基于 CTC 的端到端 RNN 构建但拥有庞大数据集的商业系统之一 ,并在嘈杂的环境中实现了比传统 ASR 系统更低的错误率。 如果您有兴趣,可以查看[深度语音的 TensorFlow 实现](https://github.com/mozilla/DeepSpeech),但是生成的模型会 由于此类基于 CTC 的系统存在问题,因此需要太多的资源才能在手机上运行。 在部署期间,它需要一个大型语言模型来纠正部分由 RNN 的性质引起的生成的文本错误(如果您想知道为什么,请阅读前面链接的 RNN 博客以获取一些见识)。
[关于 RNN 端到端语音识别的第一篇研究论文发表于 2014 年](http://proceedings.mlr.press/v32/graves14.pdf),使用的是**连接主义的时间分类****CTC**)层。 2014 年下半年,百度发布了 [Deep Speech](https://arxiv.org/abs/1412.5567),这是第一个使用基于 CTC 的端到端 RNN 构建但拥有庞大数据集的商业系统之一 ,并在嘈杂的环境中实现了比传统 ASR 系统更低的错误率。 如果您有兴趣,可以查看[深度语音的 TensorFlow 实现](https://github.com/mozilla/DeepSpeech),但是由于此类基于 CTC 的系统存在问题,生成的模型需要太多的资源才能在手机上运行。 在部署期间,它需要一个大型语言模型来纠正部分由 RNN 的性质引起的生成的文本错误(如果您想知道为什么,请阅读前面链接的 RNN 博客以获取一些见识)。
在 2015 年和 2016 年,较新的语音识别系统使用了类似的端到端 RNN 方法,但将 CTC 层替换为[基于注意力的模型](https://arxiv.org/pdf/1508.01211.pdf),因此 运行模型时不需要大型语言模型,因此可以在内存有限的移动设备上进行部署。 在本书的此版本中,我们将不会探讨这种可能性,而将介绍如何在移动应用中使用最新的高级 ASR 模型。 相反,我们将从一个更简单的语音识别模型开始,我们知道该模型肯定会在移动设备上很好地工作。
......
......@@ -76,7 +76,7 @@ git clone https://github.com/jeffxtang/generative-adversarial-networks
cd generative-adversarial-networks
```
该派生向`gan-script-fast.py`脚本添加了检查点保存代码,还添加了新脚本`gan-script-test.py`以使用随机输入的占位符测试和保存新的检查点–因此,新检查点冻结的模型可以在 iOS 和 Android 中使用 应用。
该派生向`gan-script-fast.py`脚本添加了检查点保存代码,还添加了新脚本`gan-script-test.py`以使用随机输入的占位符测试和保存新的检查点–因此,使用新检查点冻结的模型可以在 iOS 和 Android 应用中使用。
运行命令`python gan-script-fast.py`训练模型,在 Ubuntu 上的 GTX-1070 GPU 上花费不到一小时。 训练完成后,检查点文件将保存在模型目录中。 现在运行`python gan-script-test.py`来查看一些生成的手写数字。 该脚本还从模型目录读取检查点文件,并在运行`gan-script-fast.py`时保存该文件,然后将更新的检查点文件以及随机输入占位符重新保存在`newmodel`目录中:
......@@ -100,7 +100,7 @@ images = sess.run(generated_images, {z_placeholder: z_batch})
saver.save(sess, "newmodel/ckpt")
```
`gan-script-fast.py`脚本中,方法`def discriminator(images, reuse_variables=None)`定义了一个判别器网络,该网络使用一个真实的手写图像输入或由生成器生成的一个手写输入,经过一个典型的小型 CNN 网络,该网络具有两层`conv2d`层,每一层都遵循 通过`relu`激活和平均池化层以及两个完全连接的层来输出一个标量值,该标量值将保持输入图像为真或假的概率。 另一种方法`def generator(batch_size, z_dim)`定义了生成器网络,该网络采用随机输入的图像向量并将其转换为具有 3 个`conv2d`层的`28 x 28`图像。
`gan-script-fast.py`脚本中,方法`def discriminator(images, reuse_variables=None)`定义了一个判别器网络,该网络使用一个真实的手写图像输入或由生成器生成的一个手写输入,经过一个典型的小型 CNN 网络,该网络具有两层`conv2d`层,每一层都带有`relu`激活和平均池化层以及两个完全连接的层来输出一个标量值,该标量值将保持输入图像为真或假的概率。 另一种方法`def generator(batch_size, z_dim)`定义了生成器网络,该网络采用随机输入的图像向量并将其转换为具有 3 个`conv2d`层的`28 x 28`图像。
现在可以使用这两种方法来定义三个输出:
......@@ -155,7 +155,7 @@ python tensorflow/python/tools/freeze_graph.py \
* 图像损坏到原始图像
* 从低分辨率图像到高分辨率图像
在所有情况下,生成器都将输入图像转换为输出图像,试图使输出看起来像真实的目标图像,判别器将训练集中的样本或生成器的输出作为输入,并尝试 告诉它是真实图像还是生成器生成的图像。 自然,与模型相比,pix2pix 中的生成器和判别器网络以更复杂的方式构建以生成手写数字,并且训练还应用了一些技巧来使过程稳定-有关详细信息,您可以阅读本文或 TensorFlow 实现链接 较早提供。 我们在这里仅向您展示如何设置训练集和训练 pix2pix 模型以增强低分辨率图像。
在所有情况下,生成器都将输入图像转换为输出图像,试图使输出看起来像真实的目标图像,判别器将训练集中的样本或生成器的输出作为输入,并尝试告诉它是真实图像还是生成器生成的图像。 自然,与模型相比,pix2pix 中的生成器和判别器网络以更复杂的方式构建以生成手写数字,并且训练还应用了一些技巧来使过程稳定-有关详细信息,您可以阅读本文或较早提供的 TensorFlow 实现链接。 我们在这里仅向您展示如何设置训练集和训练 pix2pix 模型以增强低分辨率图像。
1. 通过在终端上运行来克隆仓库:
......@@ -547,7 +547,7 @@ No OpKernel was registered to support Op 'FIFOQueueV2' with these attrs. Registe
图 9.3:显示 GAN 模型选择和生成的手写数字结果
这些数字看起来很像真实的人类手写数字,都是在训练了基本 GAN 模型之后完成的。 如果您返回并查看进行训练的代码,并且停下来思考一下 GAN 的工作原理,一般来说,则生成器和判别器如何相互竞争,以及 尝试达到稳定的纳什均衡状态,在这种状态下,生成器可以生成区分器无法分辨出真实还是伪造的真实假数据,您可能会更欣赏 GAN 的魅力。
这些数字看起来很像真实的人类手写数字,都是在训练了基本 GAN 模型之后完成的。 如果您返回并查看进行训练的代码,并且停下来思考一下 GAN 的工作原理,一般来说,则生成器和判别器如何相互竞争,以及尝试达到稳定的纳什均衡状态,在这种状态下,生成器可以生成区分器无法分辨出真实还是伪造的真实假数据,您可能会更欣赏 GAN 的魅力。
现在,让我们选择`Enhance Image`选项,您将在图 9.4 中看到结果,该结果与图 9.1 中的 Python 测试代码生成的结果相同:
......
此差异已折叠。
......@@ -72,7 +72,7 @@ pod install
open simple.xcworkspace
```
现在,您将有两个 Xcode iOS 项目,分别是 simple 和 camera(在 Xcode 中分别命名为 `tflite_simple_example``tflite_camera_example`),并启动了,您可以在其中安装和运行它们 您的 iOS 设备(简单的应用程序也可以在您的 iOS 模拟器上运行)。
现在,您将有两个 Xcode iOS 项目,分别是 simple 和 camera(在 Xcode 中分别命名为 `tflite_simple_example``tflite_camera_example`),并启动了,您可以在您的 iOS 设备中安装和运行它们(简单的应用程序也可以在您的 iOS 模拟器上运行)。
`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.
......@@ -290,7 +290,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 格式。
但是至少到目前为止,对于使用 TensorFlow 或 Keras 构建的自定义复杂模型,很可能您将无法成功进行 TensorFlow Lite 转换,因此您应该继续使用 TensorFlow Mobile,如前几章所述 现在,除非您致力于使它们与 TensorFlow Lite 一起使用,并且不介意帮助添加更多由 TensorFlow Lite 支持的操作-毕竟 TensorFlow 是一个开源项目。
但是至少到目前为止,对于使用 TensorFlow 或 Keras 构建的自定义复杂模型,很可能您将无法成功进行 TensorFlow Lite 转换,因此您应该继续使用 TensorFlow Mobile,如前几章所述现在,除非您致力于使它们与 TensorFlow Lite 一起使用,并且不介意帮助添加更多由 TensorFlow Lite 支持的操作-毕竟 TensorFlow 是一个开源项目。
在完成 TensorFlow Lite 的介绍之前,我们将看一下如何在 Android 中使用 TensorFlow Lite。
......@@ -307,7 +307,7 @@ bazel-bin/tensorflow/contrib/lite/toco/toco \
现在执行以下步骤来创建一个新的 Android 应用程序,并添加 TensorFlow Lite 支持以对图像进行分类,就像我们在第 2 章,“通过迁移学习对图像进行分类”中的 HelloTensorFlow Android 应用程序一样:
1. 创建一个新的 Android Studio 项目,并将应用命名为`HelloTFLite`。 将最低 SDK 设置为 API 15:Android 4.0.3,并接受所有其他默认设置。
2. 创建一个新的`assets`文件夹,从演示应用程序`tensorflow/contrib/lite/java/demo/app/src/main/assets`文件夹中拖放`mobilenet_quant_v1_224.tflite` TensorFlow Lite 文件和`labels.txt`文件,以及测试图像 到 HelloTFLite 应用程序的`assets`文件夹中。
2. 创建一个新的`assets`文件夹,从演示应用程序`tensorflow/contrib/lite/java/demo/app/src/main/assets`文件夹中拖放`mobilenet_quant_v1_224.tflite` TensorFlow Lite 文件和`labels.txt`文件,以及测试图像到 HelloTFLite 应用程序的`assets`文件夹中。
3.`ImageClassifier.java`文件从`tensorflow/contrib/lite/java/demo/app/src/main/java/com/example/android/tflitecamerademo`文件夹拖放到 Android Studio 中的 HelloTFLite 应用。 `ImageClassifier.java`包含使用 TensorFlow Lite Java API 加载和运行 TensorFlow Lite 模型的所有代码,我们将在稍后详细介绍。
4. 打开应用的`build.gradle`文件,在 `dependencies` 部分的末尾添加`compile 'org.tensorflow:tensorflow-lite:0.1'` ,然后在 `buildTypes` 部分的以下三行中添加[ `android` :
......@@ -468,7 +468,7 @@ pip install scikit-learn
pip install pandas
```
现在,输入以下代码以读取并解析`RealEstate.csv`文件,将第 4 到第 6 列(卧室,浴室和大小)下的所有行用作输入数据,并使用第 3 列(价格)的所有行作为目标 输出:
现在,输入以下代码以读取并解析`RealEstate.csv`文件,将第 4 到第 6 列(卧室,浴室和大小)下的所有行用作输入数据,并使用第 3 列(价格)的所有行作为目标输出:
```py
from sklearn.linear_model import LinearRegression
......@@ -541,7 +541,7 @@ coreml_model.save("HouseSVM.mlmodel")
图 11.7:显示 Swift iOS 项目和线性回归 Core ML 模型
其他`HouseSVM.mlmodel` 模型 看起来完全一样,只是机器学习模型名称和模型类从`HouseLR`更改为`HouseSVM`
其他`HouseSVM.mlmodel`模型看起来完全一样,只是机器学习模型名称和模型类从`HouseLR`更改为`HouseSVM`
将以下代码添加到`ViewController.swift`中的`class ViewController`中:
......@@ -626,7 +626,7 @@ coreml_model.save('Stock.mlmodel')
图 11.9:在 Swift 应用中显示从 Keras 和 TensorFlow 转换而来的股票预测 Core ML 模型
要在 Objective-C 中使用该模型,请创建具有指定数据类型和形状的`Stock`对象和`MLMultiArray`对象,然后使用一些输入数据填充数组对象,并使用`StockInput`调用`predictionFromFeatures`方法`MLMultiArray`数据初始化的实例:
要在 Objective-C 中使用该模型,请创建具有指定数据类型和形状的`Stock`对象和`MLMultiArray`对象,然后使用一些输入数据填充数组对象,并使用`StockInput`调用`predictionFromFeatures`方法`MLMultiArray`数据初始化的实例:
```py
#import "ViewController.h"
......
......@@ -4,11 +4,11 @@
根据 Wikipedia 的说法,“ Raspberry Pi 是 Raspberry Pi 基金会在英国开发的一系列小型单板计算机,旨在促进学校和发展中国家的基础计算机科学教学。” [Raspberry Pi 的官方网站](https://www.raspberrypi.org)将其描述为“一种小型且价格合理的计算机,可以用来学习编程。” 如果您以前从未听说过或使用过 Raspberry Pi,请访问其网站,然后您很快就会爱上这个很棒的小东西。 几乎没有什么功能-实际上,TensorFlow 的开发人员从 2016 年中期开始在早期版本的 Raspberry Pi 上提供了 TensorFlow,因此我们可以在微型计算机上运行复杂的 TensorFlow 模型,您只需花费 35 美元即可购买到。 这可能超出了“基础计算机科学的教学”或“学习编程”的范围,但另一方面,如果我们考虑过去几年中移动设备的所有飞速发展,那么看到这一点我们就不会感到惊讶 如何在越来越小的设备中实现越来越多的功能
根据 Wikipedia 的说法,“ Raspberry Pi 是 Raspberry Pi 基金会在英国开发的一系列小型单板计算机,旨在促进学校和发展中国家的基础计算机科学教学。” [Raspberry Pi 的官方网站](https://www.raspberrypi.org)将其描述为“一种小型且价格合理的计算机,可以用来学习编程。” 如果您以前从未听说过或使用过 Raspberry Pi,请访问其网站,然后您很快就会爱上这个很棒的小东西。 几乎没有什么功能-实际上,TensorFlow 的开发人员从 2016 年中期开始在早期版本的 Raspberry Pi 上提供了 TensorFlow,因此我们可以在微型计算机上运行复杂的 TensorFlow 模型,您只需花费 35 美元即可购买到。 这可能超出了“基础计算机科学的教学”或“学习编程”的范围,但另一方面,如果我们考虑过去几年中移动设备的所有飞速发展,那么看到如何在越来越小的设备中实现越来越多的功能,我们就不会感到惊讶
在本章中,我们将进入 Raspberry Pi 的有趣世界,Raspberry Pi 是 TensorFlow 正式支持的最小设备。 我们将首先介绍如何获取和设置新的 Raspberry Pi 3B 板,包括本章中使用的所有必要配件,以使其能够看,听和说。 然后,我们将介绍如何使用 [GoPiGo 机器人基础套件](https://www.dexterindustries.com/shop/gopigo3-robot-base-kit),将 Raspberry Pi 板变成一个可以移动的机器人。 之后,我们将提供最简单的工作步骤,以便在 Raspberry Pi 上设置 TensorFlow 1.6 并构建其示例 Raspberry Pi 应用程序。 我们还将讨论如何集成图像分类,这是我们在第 2 章,“通过迁移学习对图像进行分类”时使用的模型,并通过文字转语音功能使机器人告诉我们它可以识别的内容 以及如何集成音频识别,这是我们在第 5 章,“了解简单语音命令”中使用的模型以及 GoPiGo API,可让您使用语音命令来控制机器人的运动 。
在本章中,我们将进入 Raspberry Pi 的有趣世界,Raspberry Pi 是 TensorFlow 正式支持的最小设备。 我们将首先介绍如何获取和设置新的 Raspberry Pi 3B 板,包括本章中使用的所有必要配件,以使其能够看,听和说。 然后,我们将介绍如何使用 [GoPiGo 机器人基础套件](https://www.dexterindustries.com/shop/gopigo3-robot-base-kit),将 Raspberry Pi 板变成一个可以移动的机器人。 之后,我们将提供最简单的工作步骤,以便在 Raspberry Pi 上设置 TensorFlow 1.6 并构建其示例 Raspberry Pi 应用程序。 我们还将讨论如何集成图像分类,这是我们在第 2 章,“通过迁移学习对图像进行分类”时使用的模型,并通过文字转语音功能使机器人告诉我们它可以识别的内容以及如何集成音频识别,这是我们在第 5 章,“了解简单语音命令”中使用的模型以及 GoPiGo API,可让您使用语音命令来控制机器人的运动 。
最后,我们将向您展示如何使用 TensorFlow 和 OpenAI Gym,这是一个用于开发和比较强化学习算法的 Python 工具包,如何在模拟环境中实现强大的强化学习算法,以使我们的机器人能够在真实的身体中移动和平衡 环境
最后,我们将向您展示如何使用 TensorFlow 和 OpenAI Gym,这是一个用于开发和比较强化学习算法的 Python 工具包,如何在模拟环境中实现强大的强化学习算法,以使我们的机器人能够在真实环境中移动和平衡身体
在 Google I/O 2016 中,有一个名为“如何使用 Cloud Vision 和 Speech API 构建智能的 RasPi Bot”的会话(您可以在 YouTube 上观看视频)。 它使用 Google 的 Cloud API 执行图像分类以及语音识别和合成。 在本章中,我们将了解如何在设备上离线实现演示中的任务以及增强学习,从而展示 TensorFlow 在 Raspberry Pi 上的强大功能。
......@@ -35,7 +35,7 @@
* [USHONK USB 微型扬声器](https://www.amazon.com/gp/product/B075M7FHM1)约合 12 美元,可以播放合成声音。
* [Arducam 5 Megapixels 1080p 传感器 OV5647 微型相机](https://www.amazon.com/gp/product/B012V1HEP4)约合 14 美元,以支持图像分类。
* [16GB MicroSD 和适配器](https://www.amazon.com/gp/product/B00TDBLTWK),价格约为 10 美元,用于存储 Raspbian(Raspberry Pi 的官方操作系统)的安装文件,并用作 安装后的硬盘驱动器。
* [16GB MicroSD 和适配器](https://www.amazon.com/gp/product/B00TDBLTWK),价格约为 10 美元,用于存储 Raspbian(Raspberry Pi 的官方操作系统)的安装文件,并用作安装后的硬盘驱动器。
* 一个 USB 磁盘,例如 [SanDisk 32GB USB Drive](https://www.amazon.com/gp/product/B008AF380Q),售价 9 美元,将用作交换分区(有关详细信息,请参阅下一节) 因此我们可以手动构建 TensorFlow 库,这是构建和运行 TensorFlow C++ 代码所必需的。
* 售价 110 美元的 [GoPiGo 机器人基础套件](https://www.amazon.com/gp/product/B00NYB3J0A)[官方网站](https://www.dexterindustries.com/shop),将 Raspberry Pi 板变成可以移动的机器人。
......@@ -58,7 +58,7 @@
1. 为 Windows 或 Mac 下载并安装 [SD 格式化程序](https://www.sdcard.org/downloads/formatter_4/index.html)
2. 使用 SD 格式化程序格式化 MicroSD 卡。
3.[这个页面](https://www.raspberrypi.org/downloads/noobs)上下载 Raspbian 的官方简易安装程序 New Out Of Box Software(NOOBS)的离线 ZIP 版本,将其解压缩,然后拖动并 将提取的`NOOBS`文件夹中的所有文件拖放到格式化的 MicroSD 卡中。
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 机器人-当移动时,您不想或不能将键盘,鼠标和显示器与板子一起使用。
......@@ -417,7 +417,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 应用程序中使用过。
在之前的章节中,我们主要使用 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)
在之前的章节中,我们主要使用 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)
要使用 GoPiGo Python API 使机器人根据您的语音命令移动,请首先在`listen.py`中添加以下两行:
......@@ -486,7 +486,7 @@ INFO:audio:stop
[OpenAI Gym](https://gym.openai.com)是一个开源 Python 工具包,提供了许多模拟环境来帮助您开发,比较和训练强化学习算法,因此 您无需购买所有传感器并在实际环境中训练您的机器人,这在时间和金钱上都是昂贵的。 在本部分中,我们将向您展示如何在 TenAI 健身房的称为 [CartPole](https://gym.openai.com/envs/CartPole-v0)
[OpenAI Gym](https://gym.openai.com)是一个开源 Python 工具包,提供了许多模拟环境来帮助您开发,比较和训练强化学习算法,因此您无需购买所有传感器并在实际环境中训练您的机器人,这在时间和金钱上都是昂贵的。 在本部分中,我们将向您展示如何在 TenAI 健身房的称为 [CartPole](https://gym.openai.com/envs/CartPole-v0)
要安装 OpenAI Gym,请运行以下命令:
......@@ -577,7 +577,7 @@ while not done:
#[ 0.18298552 1.77178219 -0.25898254 -2.87789912]
```
现在,让我们手动执行从头到尾的一系列操作,并打印出观测值的第一个值(水平位置)和第三个值(极点与垂直方向的度数),因为这两个值确定一个情节是否为 完成。
现在,让我们手动执行从头到尾的一系列操作,并打印出观测值的第一个值(水平位置)和第三个值(极点与垂直方向的度数),因为这两个值确定一个情节是否为完成。
首先,重置环境并正确加速购物车几次:
......@@ -629,7 +629,7 @@ obs[0], obs[2]*360/np.pi
# (0.039465670006712444, -1.5760901885345346)
```
首先,您可能会惊讶于 0 动作导致位置(`obs[0]`)连续变大几次,但请记住,手推车以一定速度运动,并且一个或多个动作将手推车移至另一个 方向不会立即降低位置值。 但是,如果您继续将购物车向左移动,如前两个步骤所示,您会看到购物车的位置开始变小(向左)。 现在继续执行 0 动作,您会看到位置越来越小,负值表示推车进入中心的左侧,而杆的角度越来越大:
首先,您可能会惊讶于 0 动作导致位置(`obs[0]`)连续变大几次,但请记住,手推车以一定速度运动,并且一个或多个动作将手推车移至另一个方向不会立即降低位置值。 但是,如果您继续将购物车向左移动,如前两个步骤所示,您会看到购物车的位置开始变小(向左)。 现在继续执行 0 动作,您会看到位置越来越小,负值表示推车进入中心的左侧,而杆的角度越来越大:
```py
obs, reward, done, info = env.step(0)
......@@ -845,7 +845,7 @@ with tf.Session() as sess:
现在,我们都准备探索如何在此基础上实现策略梯度方法,以使我们的神经网络性能更好,获得的奖励要大几倍。
策略梯度的基本思想是,为了训练神经工作以生成更好的策略,当所有代理从环境中知道的都是从任何给定状态采取行动时所能获得的奖励(这意味着我们不能 使用监督学习进行训练),我们可以采用两种新机制:
策略梯度的基本思想是,为了训练神经工作以生成更好的策略,当所有代理从环境中知道的都是从任何给定状态采取行动时所能获得的奖励(这意味着我们不能使用监督学习进行训练),我们可以采用两种新机制:
* 折扣奖励:每个动作的价值都需要考虑其未来动作的奖励。 例如,一个动作获得立即奖励 1,但是在两个动作(步骤)之后结束情节的长期奖励应该比获得立即奖励 1 但在 10 个步骤之后结束情节的动作具有较少的长期奖励。 动作的折现奖励的典型公式是其立即奖励加上其每个未来奖励的倍数和由未来步骤提供动力的折现率的总和。 因此,如果一个动作序列在剧集结束前有 1、1、1、1、1 个奖励,则第一个动作的折扣奖励为`1+(1*discount_rate)+(1*discount_rate**2)+(1*discount_rate**3)+(1*discount_rate**4)`
......@@ -868,7 +868,7 @@ def normalized_discounted_rewards(rewards):
return (dr - dr.mean()) / dr.std()
```
例如,如果`discount_rate`为 0.95,则奖励列表`[1,1,1]`中第一个动作的折扣奖励为`1 + 1 * 0.95 + 1 * 0.95 ** 2 = 2.8525`,并且折扣奖励 第二和最后一个元素是 1.95 和 1; 奖励列表`[1,1,1,1,1]`中第一个动作的折扣奖励为`1 + 1 * 0.95 + 1 * 0.95 ** 2 + 1 * 0.95 ** 3 + 1 * 0.95 ** 4 = 4.5244`,其余动作为 3.7099、2.8525、1.95 和 1 。` [1,1,1]``[1,1,1,1,1]`的归一化折扣奖励为`[1.2141, 0.0209, -1.2350]``[1.3777, 0.7242, 0.0362, -0.6879, -1.4502]`。 每个规范化的折扣清单按降序排列,这意味着动作持续的时间越长(在情节结束之前),其奖励就越大。
例如,如果`discount_rate`为 0.95,则奖励列表`[1,1,1]`中第一个动作的折扣奖励为`1 + 1 * 0.95 + 1 * 0.95 ** 2 = 2.8525`,并且第二和最后一个折扣奖励是 1.95 和 1; 奖励列表`[1,1,1,1,1]`中第一个动作的折扣奖励为`1 + 1 * 0.95 + 1 * 0.95 ** 2 + 1 * 0.95 ** 3 + 1 * 0.95 ** 4 = 4.5244`,其余动作为 3.7099、2.8525、1.95 和 1 。` [1,1,1]``[1,1,1,1,1]`的归一化折扣奖励为`[1.2141, 0.0209, -1.2350]``[1.3777, 0.7242, 0.0362, -0.6879, -1.4502]`。 每个规范化的折扣清单按降序排列,这意味着动作持续的时间越长(在情节结束之前),其奖励就越大。
接下来,创建 CartPole 体育馆环境,定义`learning_rate``discount_rate`超参数,并像以前一样使用四个输入神经元,四个隐藏神经元和一个输出神经元构建网络:
......@@ -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))。
现在,玩一些游戏并保存奖励和渐变值:
......@@ -1011,7 +1011,7 @@ pi@raspberrypi:~/mobiletf/ch12 $ python nn_pg.py
199.116
```
现在,您已经拥有了一个强大的基于神经网络的策略模型,可以帮助您的机器人保持平衡,并在模拟环境中进行了全面测试,在将模拟环境的 API 返回值替换为真实环境数据后,您可以将其部署在真实的物理环境中 当然,但是用于构建和训练神经网络强化学习模型的代码当然可以轻松地重用。
现在,您已经拥有了一个强大的基于神经网络的策略模型,可以帮助您的机器人保持平衡,并在模拟环境中进行了全面测试,在将模拟环境的 API 返回值替换为真实环境数据后,您可以将其部署在真实的物理环境中当然,但是用于构建和训练神经网络强化学习模型的代码当然可以轻松地重用。
......@@ -1037,7 +1037,7 @@ pi@raspberrypi:~/mobiletf/ch12 $ python nn_pg.py
我们还展示了同时使用 TensorFlow Pod 和手动构建的 TensorFlow 库的 Objective-C 和 Swift iOS 应用程序,以及使用即用型 TensorFlow 库和手动构建库的 Android 应用程序,以修复您可能遇到的各种错误 在移动设备上部署和运行 TensorFlow 模型时遇到的问题。
我们已经介绍了很多,但是还有很多要讲的。 TensorFlow 的新版本已经快速发布。 已经构建并实现了采用最新研究论文的新 TensorFlow 模型。 本书的主要目的是向您展示使用各种智能 TensorFlow 模型的足够的 iOS 和 Android 应用程序,以及所有实用的故障排除和调试技巧,以便您可以在移动设备上快速部署和运行自己喜欢的 TensorFlow 模型,以供下一次使用 杀手级移动 AI 应用程序
我们已经介绍了很多,但是还有很多要讲的。 TensorFlow 的新版本已经快速发布。 已经构建并实现了采用最新研究论文的新 TensorFlow 模型。 本书的主要目的是向您展示使用各种智能 TensorFlow 模型的足够的 iOS 和 Android 应用程序,以及所有实用的故障排除和调试技巧,以便您可以在移动设备上为你的下一个杀手级移动 AI 应用程序快速部署和运行自己喜欢的 TensorFlow 模型
如果您想使用 TensorFlow 或 Keras 构建自己的出色模型,实现最令您兴奋的算法和网络,则需要在本书结束后继续学习,因为我们没有详细介绍如何做到这一点, 但希望我们能激发您足够的动力来开始这一旅程,并从书中获得保证,一旦您构建并训练了模型,便知道如何快速,随时随地在移动设备上部署和运行它们。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册