diff --git a/new/intel-mobi-proj-tf/00.md b/new/intel-mobi-proj-tf/00.md index f0fc758cca586bdd81003dd982ac73669b1848b7..e77dcbc36ae67e9663ff0a6d3591f99550256998 100644 --- a/new/intel-mobi-proj-tf/00.md +++ b/new/intel-mobi-proj-tf/00.md @@ -52,7 +52,7 @@ TensorFlow 是 Google 的开放源代码框架,用于构建机器学习 AI 应 第 9 章,“使用 GAN 生成和增强图像”,概述了 GAN 是什么以及为什么它具有如此大的潜力。 然后,它将探讨如何构建和训练可用于生成类似人的手写数字的基本 GAN 模型以及可以将低分辨率图像增强为高分辨率图像的更高级模型。 最后,我们将介绍如何在 iOS 和 Android 应用程序中使用两种 GAN 模型。 -第 10 章,“构建类似 AlphaZero 的手机游戏应用程序”,从最新和最酷的 AlphaZero 的工作原理以及如何训练和测试 AlphaZero 的模型开始 在 TensorFlow 作为后端的 Keras 中玩一个简单但有趣的游戏,名为 Connect 4。 然后,我们将向您展示完整的 iOS 和 Android 应用程序,以使用该模型并在您的移动设备上玩 Connect 4 游戏。 +第 10 章,“构建类似 AlphaZero 的手机游戏应用程序”,从最新和最酷的 AlphaZero 的工作原理以及如何训练和测试 AlphaZero 的模型开始 在 TensorFlow 作为后端的 Keras 中玩一个简单但有趣的游戏,名为 Connect4。 然后,我们将向您展示完整的 iOS 和 Android 应用程序,以使用该模型并在您的移动设备上玩 Connect4 游戏。 第 11 章,“在移动设备上使用 TensorFlow Lite 和 Core ML”演示 TensorFlow Lite,然后向您展示如何使用预先构建的 TensorFlow 模型(经过重新训练) TensorFlow Lite 的 TensorFlow 模型以及 iOS 中的自定义 TensorFlow Lite 模型。 我们还将向您展示如何在 Android 中使用 TensorFlow Lite。 之后,我们将概述 Apple 的 Core ML,并向您展示如何在使用 Scikit-Learn 的标准机器学习中使用 Core ML。 最后,我们将介绍如何在 TensorFlow 和 Keras 中使用 Core ML。 diff --git a/new/intel-mobi-proj-tf/10.md b/new/intel-mobi-proj-tf/10.md index ff4a421dd461931241c711d24eb2e9ffd55b24a3..7c1c3a2b49be660bbd1257a7dfe2c3162c2f214b 100644 --- a/new/intel-mobi-proj-tf/10.md +++ b/new/intel-mobi-proj-tf/10.md @@ -4,20 +4,20 @@ -尽管现代**人工智能**(**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 年深度学习的突破引起的,但 2016 年 3 月,Google DeepMind 的 AlphaGo 以 4-1 击败围棋世界冠军 Lee Sedol,然后在 2017 年 5 月以 3-0 击败了目前排名第一的围棋玩家 Ke Jie 的历史性事件,这在很大程度上使 AI 家喻户晓。 由于围棋游戏的复杂性,人们普遍认为任务无法实现,或者至少十年内计算机程序不可能击败顶级围棋玩家。 -在 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 玩家! +在 2017 年 5 月 AlphaGo 和 Ke Jie 的比赛之后,Google 退役了 AlphaGo; 谷歌(DeepMind)是 Google 因其开创性的深度强化学习技术而收购的创业公司,也是 AlphaGo 的开发商,决定将其 AI 研究重点放在其他领域。 然后,有趣的是,在 2017 年 10 月,DeepMind 在游戏上发表了另一篇论文[《围棋:在没有人类知识的情况下掌握围棋游戏》](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),对 AlphaGo 进行了概括。 将零程序归类为一个称为 AlphaZero 的算法,并使用该算法从头开始快速学习如何玩象棋和将棋的游戏,从除了游戏规则之外没有任何领域知识的随机游戏开始,并在 24 小时内实现了超人级别并击败世界冠军。 -在本章中,我们将带您浏览 AlphaZero 的最新最酷的部分,向您展示如何构建和训练类似 AlphaZero 的模型来玩一个简单而有趣的游戏,称为 [Connect 4](https://en.wikipedia.org/wiki/Connect_Four),在 TensorFlow 和 Keras 中使用,这是我们在第 8 章,“使用 RNN 预测股价”的流行的高级深度学习库。 我们还将介绍如何使用训练有素的 AlphaZero 模型来获得训练有素的专家策略,以指导移动游戏的玩法,以及使用该模型玩 Connect 4 游戏的完整 iOS 和 Android 应用程序的源代码。 +在本章中,我们将带您浏览 AlphaZero 的最新最酷的部分,向您展示如何构建和训练类似 AlphaZero 的模型来玩一个简单而有趣的游戏,称为 [Connect4](https://en.wikipedia.org/wiki/Connect_Four),在 TensorFlow 和 Keras 中使用,这是我们在第 8 章,“使用 RNN 预测股价”的流行的高级深度学习库。 我们还将介绍如何使用训练有素的 AlphaZero 模型来获得训练有素的专家策略,以指导移动游戏的玩法,以及使用该模型玩 Connect4 游戏的完整 iOS 和 Android 应用程序的源代码。 总之,本章将涵盖以下主题: * AlphaZero –它如何工作? -* 为 Connect 4 构建和训练类似于 AlphaZero 的模型 -* 在 iOS 中使用模型播放 Connect 4 -* 在 Android 中使用模型播放 Connect 4 +* 为 Connect4 构建和训练类似于 AlphaZero 的模型 +* 在 iOS 中使用模型播放 Connect4 +* 在 Android 中使用模型播放 Connect4 @@ -33,11 +33,11 @@ AlphaZero 算法包含三个主要组件: * 一种通用的强化学习算法,该算法通过自玩从头开始学习,除了游戏规则外,没有特定的领域知识。 通过自增强学习学习深度神经网络的参数,以使预测值与实际自游戏结果之间的损失最小,并使预测策略与搜索概率之间的相似性最大化,这来自以下算法。 * 一种通用(与域无关)的**蒙特卡洛树搜索**(**MCTS**)算法,该算法从头至尾模拟自玩游戏,并通过 考虑到从深度神经网络返回的预测值和策略概率值,以及访问节点的频率—有时,选择访问次数较少的节点称为强化学习中的探索(与采取较高预测值的举动相反) 价值和政策,这称为剥削)。 探索与开发之间的良好平衡可以带来更好的结果。 -强化学习的历史可以追溯到 1960 年代,当时该术语在工程文献中首次使用。 但是突破发生在 2013 年,当时 DeepMind 将强化学习与深度学习相结合,并开发了深度强化学习应用程序,该应用程序学会了从头开始玩 Atari 游戏,以原始像素为输入的,并随后击败了人类。 与监督学习不同,监督学习需要标记数据进行训练,就像我们在前几章中建立或使用的许多模型中所看到的那样,强化学习使用反复试验的方法来获得更好的效果:代理与环境交互并接收 对每个州采取的任何行动都会获得奖励(正面或负面)。 在 AlphaZero 下棋 象棋的示例中,只有在游戏结束后才能获得奖励,获胜的结果为+1,失败的为-1,平局为 0。强化学习 AlphaZero 中的算法对我们前面提到的损失使用梯度下降来更新 深层神经网络的 参数, 就像一个通用函数近似,可以学习和 编码游戏技巧。 +强化学习的历史可以追溯到 1960 年代,当时该术语在工程文献中首次使用。 但是突破发生在 2013 年,当时 DeepMind 将强化学习与深度学习相结合,并开发了深度强化学习应用程序,该应用程序学会了从头开始玩 Atari 游戏,以原始像素为输入的,并随后击败了人类。 与监督学习不同,监督学习需要标记数据进行训练,就像我们在前几章中建立或使用的许多模型中所看到的那样,强化学习使用反复试验的方法来获得更好的效果:代理与环境交互并接收 对每个州采取的任何行动都会获得奖励(正面或负面)。 在 AlphaZero 下棋 象棋的示例中,只有在游戏结束后才能获得奖励,获胜的结果为 +1,失败的为 -1,平局为 0。强化学习 AlphaZero 中的算法对我们前面提到的损失使用梯度下降来更新 深层神经网络的 参数, 就像一个通用函数近似,可以学习和 编码游戏技巧。 学习或训练过程的结果可以是由深度神经网络生成的策略,该策略说出对任何状态应采取的行动,或者是将每个状态以及该状态的每个可能动作映射到长期奖励的价值函数 。 -如果深层神经网络使用自我玩法强化学习所学习的策略是理想的,则我们可能无需让程序在游戏过程中执行任何 MCTS,而程序总是可以最大可能地选择移动。 但是在诸如 Chess 或 GO 的复杂游戏中,无法生成完美的策略,因此 MCTS 必须与训练有素的深度网络一起工作,以指导针对每种游戏状态的最佳可能动作的搜索。 +如果深层神经网络使用自我玩法强化学习所学习的策略是理想的,则我们可能无需让程序在游戏过程中执行任何 MCTS,而程序总是可以最大可能地选择移动。 但是在诸如象棋或围棋的复杂游戏中,无法生成完美的策略,因此 MCTS 必须与训练有素的深度网络一起工作,以指导针对每种游戏状态的最佳可能动作的搜索。 If you're not familiar with reinforcement learning or MCTS, there's lots of information about them on the internet. Consider checking out *Richard Sutton* and *Andrew Barto's* classic book, *Reinforcement Learning: An Introduction*, which is publicly available at [http://incompleteideas.net/book/the-book-2nd.html](http://incompleteideas.net/book/the-book-2nd.html). You can also watch the reinforcement learning course videos by *David Silver*, the technical lead for *AlphaGo* at *DeepMind*, on YouTube (search "reinforcement learning David Silver"). A fun and useful toolkit for reinforcement learning is OpenAI Gym ([https://gym.openai.com](https://gym.openai.com)). In the last chapter of the book, we'll go deeper into reinforcement learning and OpenAI Gym. For MCTS, check out its Wiki page, [https://en.wikipedia.org/wiki/Monte_Carlo_tree_search](https://en.wikipedia.org/wiki/Monte_Carlo_tree_search), as well as this blog: [http://tim.hibal.org/blog/alpha-zero-how-and-why-it-works](http://tim.hibal.org/blog/alpha-zero-how-and-why-it-works). @@ -47,13 +47,13 @@ If you're not familiar with reinforcement learning or MCTS, there's lots of info -# 训练和测试适用于 Connect 4 的类似 AlphaZero 的模型 +# 训练和测试适用于 Connect4 的类似 AlphaZero 的模型 -如果您从未玩过 Connect 4,则可以在[这个页面](http://www.connectfour.org)上免费玩它。 这是一个快速有趣的游戏。 基本上,两个播放器轮流从一列的顶部将不同颜色的光盘放入六行乘七列的网格中。 如果尚未在该列中放入任何光盘,则新放置的光盘将位于该列的底部,或者位于该列中最后放置的光盘的顶部。 谁先在三个可能的方向(水平,垂直,对角线)中的任何一个方向上拥有自己颜色的四个连续光盘赢得比赛。 +如果您从未玩过 Connect4,则可以在[这个页面](http://www.connectfour.org)上免费玩它。 这是一个快速有趣的游戏。 基本上,两个播放器轮流从一列的顶部将不同颜色的光盘放入六行乘七列的网格中。 如果尚未在该列中放入任何光盘,则新放置的光盘将位于该列的底部,或者位于该列中最后放置的光盘的顶部。 谁先在三个可能的方向(水平,垂直,对角线)中的任何一个方向上拥有自己颜色的四个连续光盘赢得比赛。 -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),您可能应该在继续之前阅读它,因此以下步骤更有意义。 +Connect4 的 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),您可能应该在继续之前阅读它,因此以下步骤更有意义。 @@ -105,7 +105,7 @@ pip install keras 带有`.h5`扩展名的文件是 HDF5 格式的 Keras 模型文件,每个文件主要包含模型架构定义,训练后的权重和训练配置。 稍后,您将看到如何使用 Keras 模型文件生成 TensorFlow 检查点文件,然后将其冻结为可在移动设备上运行的模型文件。 -model.png 文件包含深度神经网络架构的详细视图。 卷积层的许多残差块之后是批处理归一化和 ReLU 层,以稳定训练,它的深度非常大。 该模型的顶部如下图所示(中间部分很大,因此我们将不显示其中间部分,建议您打开 model.png 文件以供参考): +`model.png`文件包含深度神经网络架构的详细视图。 卷积层的许多残差块之后是批处理归一化和 ReLU 层,以稳定训练,它的深度非常大。 该模型的顶部如下图所示(中间部分很大,因此我们将不显示其中间部分,建议您打开`model.png`文件以供参考): ![](img/99dc16a9-52c9-4adf-bd8f-1a244504de79.png)Figure 10.1 The first layers of the deep residual network @@ -131,7 +131,7 @@ model.png 文件包含深度神经网络架构的详细视图。 卷积层的许 playMatchesBetweenVersions(env, 1, 1, 4, 10, lg.logger_tourney, 0) ``` -1,1,4,10 参数 的第一个值表示运行版本,因此 1 表示模型位于`run_archive/connect4`的`run0001/models`中。 第二个和第三个值是两个播放器的模型版本,因此 1 和 4 表示该模型的版本 1 将与版本 4 一起播放。10 是播放的次数或剧集。 +参数`1,1,4,10`的第一个值表示运行版本,因此 1 表示模型位于`run_archive/connect4`的`run0001/models`中。 第二个和第三个值是两个播放器的模型版本,因此 1 和 4 表示该模型的版本 1 将与版本 4 一起播放。10 是播放的次数或剧集。 运行`python play.py`脚本按照指定的方式玩游戏后,可以使用以下命令找出结果: @@ -154,7 +154,7 @@ grep WINS run/logs/logger_tourney.log |tail -10 2018-03-14 23:58:36,490 INFO player1 WINS! ``` -`config.py`中有一个设置`MCTS_SIMS = 50`(MCTS 的模拟次数)会对播放时间产生重大影响。 在每个状态下,MCTS 都会进行 MCTS_SIMS 次仿真,并与受过训练的网络一起提出最佳方案。 因此,将 MCTS_SIMS 设置为 50 会使`play.py` 脚本 运行更长的时间,但如果训练的模型不够好,并不一定会使播放器更强大。 在使用特定版本的模型时,可以将其更改为不同的值,以查看其如何影响其强度水平。 要手动播放一个特定版本,请将`play.py`更改为: +`config.py`中有一个设置`MCTS_SIMS = 50`(MCTS 的模拟次数)会对播放时间产生重大影响。 在每个状态下,MCTS 都会进行`MCTS_SIMS`次仿真,并与受过训练的网络一起提出最佳方案。 因此,将`MCTS_SIMS`设置为 50 会使`play.py` 脚本 运行更长的时间,但如果训练的模型不够好,并不一定会使播放器更强大。 在使用特定版本的模型时,可以将其更改为不同的值,以查看其如何影响其强度水平。 要手动播放一个特定版本,请将`play.py`更改为: ```py playMatchesBetweenVersions(env, 1, 4, -1, 10, lg.logger_tourney, 0) @@ -224,7 +224,7 @@ playMatchesBetweenVersions(env, 1, 4, -1, 10, lg.logger_tourney, 0) 这样便可以手动测试模型特定版本的强度。 了解前面板上的表示形式还可以帮助您稍后了解 iOS 和 Android 代码。 如果您过于轻易地击败模型,可以采取几种措施来尝试改善模型: -* 在`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)以及 AlphaZero 官方论文以获取更多详细信息): @@ -238,7 +238,7 @@ edge.stats['P'] * np.sqrt(Nb) / (1 + edge.stats['N']) edge.stats['P'] * np.sqrt(np.log(1+Nb) / (1 + edge.stats['N'])) ``` -然后,即使将 MCTS_SIMS 设置为 10,版本 19 仍以 10:0 完全击败版本 1。 +然后,即使将`MCTS_SIMS`设置为 10,版本 19 仍以 10:0 完全击败版本 1。 * 微调深度神经网络模型以尽可能接近地复制 AlphaZero @@ -308,7 +308,7 @@ Tensor("policy_head/MatMul:0", shape=(?, 42), dtype=float32) -首先,我们需要创建 TensorFlow 检查点文件–只需取消注释`funcs.py`中 player1 和 player2 的两行,然后再次运行`python play.py`: +首先,我们需要创建 TensorFlow 检查点文件–只需取消注释`funcs.py`中`player1`和`player2`的两行,然后再次运行`python play.py`: ```py if player1version > 0: @@ -346,17 +346,17 @@ python tensorflow/python/tools/freeze_graph.py \ --input_binary=true ``` -为简单起见,由于它是小型模型,因此我们不会我们不会进行图变换和内存映射变换,就像第 6 章,“用自然语言描述图像”和第 9 章,“用 GAN 生成和增强图像”。 现在,我们准备在移动设备上使用该模型并编写代码以在 iOS 和 Android 设备上播放 Connect 4。 +为简单起见,由于它是小型模型,因此我们不会我们不会进行图变换和内存映射变换,就像第 6 章,“用自然语言描述图像”和第 9 章,“用 GAN 生成和增强图像”。 现在,我们准备在移动设备上使用该模型并编写代码以在 iOS 和 Android 设备上播放 Connect4。 -# 在 iOS 中使用模型播放 Connect 4 +# 在 iOS 中使用模型播放 Connect4 -对于新冻结的,可选的经过转换和映射的模型,您始终可以将其与 TensorFlow 吊舱一起尝试,以查看是否有幸能够以简单的方式使用它。 在我们的案例中,当使用 TensorFlow pod 加载它时,我们生成的`alphazero19.pb` 模型 会导致以下错误: +对于新冻结的,可选的经过转换和映射的模型,您始终可以将其与 TensorFlow 吊舱一起尝试,以查看是否有幸能够以简单的方式使用它。 在我们的案例中,当使用 TensorFlow Pod 加载它时,我们生成的`alphazero19.pb` 模型 会导致以下错误: ```py Couldn't load model: Invalid argument: No OpKernel was registered to support Op 'Switch' with these attrs. Registered devices: [CPU], Registered kernels: @@ -370,7 +370,7 @@ Couldn't load model: Invalid argument: No OpKernel was registered to support Op [[Node: batch_normalization_13/cond/Switch = Switch[T=DT_BOOL, _output_shapes=[[], []]](batch_normalization_1/keras_learning_phase, batch_normalization_1/keras_learning_phase)]] ``` -您应该已经知道如何解决这种类型的错误,因为前面的章节已经对此进行了讨论。 回顾一下,只需确保`tensorflow/contrib/makefile/tf_op_files.txt`文件中包含 Switch op 的内核文件。 您可以通过运行`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 应用程序,则该库已经不错,您不需要或不想再次运行耗时的命令。 +您应该已经知道如何解决这种类型的错误,因为前面的章节已经对此进行了讨论。 回顾一下,只需确保`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 所示: @@ -443,8 +443,7 @@ string playGame(bool withMCTS) { else binary[PIECES_NUM+i] = 0; ``` -例如,如果板阵列为[0 1 1 -1 1 -1 0 0 1 -1 -1 -1 -1 1 0 0 1 -1 1 -1 1 0 0 -1 -1 --1 1 -1 0 1 1 1 -1 -1 -1 -1 1 1 1 -1 1 1 -1 []代表以下板状态(“ X”表示 1,“ O”表示-1,“-”表示 0): +例如,如果板阵列为`[0 1 1 -1 1 -1 0 0 1 -1 -1 -1 -1 1 0 0 1 -1 1 -1 1 0 0 -1 -1 -1 1 -1 0 1 1 1 -1 -1 -1 -1 1 1 1 -1 1 1 -1]`,代表以下板状态(`X`表示 1,`O`表示 -1,`-`表示 0): ```py ['-', 'X', 'X', 'O', 'X', 'O', '-'] @@ -475,9 +474,9 @@ string playGame(bool withMCTS) { } ``` -我们将所有`probs`数组元素初始化为-100.0 的原因是,在`getProbs`方法内部(我们将很快显示),`probs`数组将仅针对允许的操作更改为值(所有小 在政策中返回了-1.0 到 1.0 之间的值),因此所有非法行为的`probs`值将保持为-100.0,并且在`softmax`函数之后,这使得非法移动的可能性基本为零,我们可以使用 法律行动的可能性。 +我们将所有`probs`数组元素初始化为 -100.0 的原因是,在`getProbs`方法内部(我们将很快显示),`probs`数组将仅针对允许的操作更改为值(所有小 在政策中返回了 -1.0 到 1.0 之间的值),因此所有非法行为的`probs`值将保持为 -100.0,并且在`softmax`函数之后,这使得非法移动的可能性基本为零,我们可以使用 法律行动的可能性。 -我们仅使用最大概率值来指导 AI 的移动,而不使用 MCTS,如果我们希望 AI 在象棋或 GO 这样的复杂游戏中真正强大,这将是必要的。 如前所述,如果从经过训练的模型返回的策略是完美的,则无需使用 MCTS。 我们将在书的源代码存储库中保留 MCTS 实现,以供您参考,而不是显示 MCTS 的所有实现细节。 +我们仅使用最大概率值来指导 AI 的移动,而不使用 MCTS,如果我们希望 AI 在象棋或围棋这样的复杂游戏中真正强大,这将是必要的。 如前所述,如果从经过训练的模型返回的策略是完美的,则无需使用 MCTS。 我们将在书的源代码存储库中保留 MCTS 实现,以供您参考,而不是显示 MCTS 的所有实现细节。 `playGame`方法中的其余代码根据模型返回的所有合法动作中的最大概率,以选定的动作来更新木板,将`printBoard` 辅助方法 称为 在 Xcode 输出面板上打印板以进行更好的调试,将动作添加到 `aiMoves` 向量中,以便可以正确重绘板,并在游戏结束时返回正确的状态信息。 通过将 `aiTurn` 设置为 `false` ,您将很快看到的触摸事件处理程序将接受人类的触摸手势,作为人类打算采取的动作; 如果 `aiTurn` 为 `true` ,则触摸处理程序将忽略所有触摸手势: @@ -707,9 +706,7 @@ int winners[69][4] = { } ``` -其余触摸处理程序通过调用`createBoardImageInRect`, -重绘 ImageView,该 -使用`BezierPath`绘制或重绘棋盘和所有已玩过的棋子,检查游戏状态并在游戏结束时返回结果,或者继续 玩游戏,如果没有: +其余触摸处理程序通过调用`createBoardImageInRect`来重绘`ImageView`,它使用`BezierPath`绘制或重绘棋盘和所有已玩过的棋子,检查游戏状态并在游戏结束时返回结果,或者继续 玩游戏,如果没有: ```py _iv.image = [self createBoardImageInRect:_iv.frame]; @@ -821,11 +818,11 @@ int winners[69][4] = { 现在运行该应用程序,您将看到类似于图 10.4 的屏幕: -![](img/fa949c2a-3114-4a56-9041-9acb069b1ff4.png)Figure 10.4 Playing with Connect 4 on iOS +![](img/fa949c2a-3114-4a56-9041-9acb069b1ff4.png)Figure 10.4 Playing with Connect4 on iOS 使用 AI 玩一些游戏,图 10.5 显示了一些可能的最终游戏: -![](img/1e45df24-e772-462b-aef9-67c8f49bed67.png)Figure 10.5 Some game results of Connect 4 on iOS +![](img/1e45df24-e772-462b-aef9-67c8f49bed67.png)Figure 10.5 Some game results of Connect4 on iOS 在我们暂停之前,让我们快速看一下使用该模型并玩游戏的 Android 代码。 @@ -833,7 +830,7 @@ int winners[69][4] = { -# 在 Android 中使用模型播放 Connect 4 +# 在 Android 中使用模型播放 Connect4 @@ -1310,7 +1307,7 @@ void softmax(float vals[], int count) { ![](img/2d40ca7c-5d3d-4586-9034-2b2ae1c71ecb.png)Figure 10.6 Showing the game board and some results on Android -当您使用前面的代码在 iOS 和 Android 上玩游戏时,很快就会发现该模型返回的策略并不强大-主要原因是 MCTS(由于范围限制[HTG0 不会与深度神经网络模型一起使用。 强烈建议您自己研究和实现 MCTS,或者在源代码存储库中使用我们的实现作为参考。 您还应该将网络模型和 MCTS 应用于您感兴趣的其他游戏-毕竟,AlphaZero 使用了通用 MCTS 和无领域知识的自我强化学习,从而使超人学习轻松移植到其他问题领域。 通过将 MCTS 与深度神经网络模型结合,您可以实现 AlphaZero 所做的事情。 +当您使用前面的代码在 iOS 和 Android 上玩游戏时,很快就会发现该模型返回的策略并不强大-主要原因是 MCTS 没有出现在这里,由于范围限制,不会与深度神经网络模型一起使用。 强烈建议您自己研究和实现 MCTS,或者在源代码存储库中使用我们的实现作为参考。 您还应该将网络模型和 MCTS 应用于您感兴趣的其他游戏-毕竟,AlphaZero 使用了通用 MCTS 和无领域知识的自我强化学习,从而使超人学习轻松移植到其他问题领域。 通过将 MCTS 与深度神经网络模型结合,您可以实现 AlphaZero 所做的事情。 @@ -1320,7 +1317,7 @@ void softmax(float vals[], int count) { -在本章中,我们介绍了 AlphaZero 的惊人世界,这是 DeepMind 截至 2017 年 12 月的最新和最大成就。我们向您展示了如何使用功能强大的 Keras API 和 TensorFlow 后端为 Connect 4 训练类似 AlphaZero 的模型,以及 如何测试并可能改善这种模型。 然后,我们冻结了该模型,并详细介绍了如何构建 iOS 和 Android 应用程序以使用该模型,以及如何使用基于模型的 AI 玩 Connect 4。 尚不能完全击败人类象棋或 GO 冠军的确切 AlphaZero 模型,但我们希望本章为您提供扎实的基础,并激发您继续进行工作,以复制 AlphaZero 最初所做的工作并将其进一步扩展到其他问题领域。 这将需要很多努力,但完全值得。 +在本章中,我们介绍了 AlphaZero 的惊人世界,这是 DeepMind 截至 2017 年 12 月的最新和最大成就。我们向您展示了如何使用功能强大的 Keras API 和 TensorFlow 后端为 Connect4 训练类似 AlphaZero 的模型,以及 如何测试并可能改善这种模型。 然后,我们冻结了该模型,并详细介绍了如何构建 iOS 和 Android 应用程序以使用该模型,以及如何使用基于模型的 AI 玩 Connect4。 尚不能完全击败人类象棋或 GO 冠军的确切 AlphaZero 模型,但我们希望本章为您提供扎实的基础,并激发您继续进行工作,以复制 AlphaZero 最初所做的工作并将其进一步扩展到其他问题领域。 这将需要很多努力,但完全值得。 如果最新的 AI 进展(例如 AlphaZero)使您兴奋不已,那么您还可能会发现由 TensorFlow 驱动的最新移动平台解决方案或工具包令人兴奋。 如我们在第 1 章“移动 TensorFlow 入门”中提到的,TensorFlow Lite 是 TensorFlow Mobile 的替代解决方案,我们 在前面的所有章节中都有介绍。 根据 Google 的说法,TensorFlow Lite 将成为 TensorFlow 在移动设备上的未来,尽管在此时和可预见的将来,TensorFlow Mobile 仍应用于生产场合。 diff --git a/new/intel-mobi-proj-tf/12.md b/new/intel-mobi-proj-tf/12.md index 1730a01b6d298dda7ffecdd397c7eb5958ca1774..a773860a3ef5d3b8a8bf822a207627e95efb177e 100644 --- a/new/intel-mobi-proj-tf/12.md +++ b/new/intel-mobi-proj-tf/12.md @@ -1032,7 +1032,7 @@ pi@raspberrypi:~/mobiletf/ch12 $ python nn_pg.py 因此,该说再见了。 在本书中,我们从三个经过预先训练的 TensorFlow 模型开始,这些模型分别是图像分类,对象检测和神经样式转换,并详细讨论了如何重新训练模型并在 iOS 和 Android 应用中使用它们。 然后,我们介绍了使用 Python 构建的 TensorFlow 教程中的三个有趣的模型(音频识别,图像字幕和快速绘制),并展示了如何在移动设备上重新训练和运行这些模型。 -之后,我们从零开始开发了用于预测 TensorFlow 和 Keras 中的股价的 RNN 模型,两个用于数字识别和像素转换的 GAN 模型以及一个用于 Connect 4 的类似于 AlphaZero 的模型,以及使用所有这些 TensorFlow 模型的完整 iOS 和 Android 应用 。 然后,我们介绍了如何将 TensorFlow Lite 以及 Apple 的 Core ML 与标准机器学习模型和转换后的 TensorFlow 模型一起使用,展示了它们的潜力和局限性。 最后,我们探索了如何使用 TensorFlow 构建 Raspberry Pi 机器人,该机器人可以使用强大的强化学习算法来移动,观看,聆听,讲话和学习。 +之后,我们从零开始开发了用于预测 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 模型时遇到的问题。