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