From ba9bf8e5cbb69b7fce73dccbb857f7825ea723a6 Mon Sep 17 00:00:00 2001 From: wizardforcel <562826179@qq.com> Date: Tue, 22 Dec 2020 23:02:30 +0800 Subject: [PATCH] 2020-12-22 23:02:30 --- new/handson-dl-img-tf/3.md | 2 +- new/intel-proj-py/02.md | 2 +- new/intel-proj-py/03.md | 6 +++--- new/intel-proj-py/05.md | 2 +- new/intel-proj-py/06.md | 2 +- new/intel-proj-py/07.md | 2 +- new/intel-proj-py/08.md | 6 +++--- new/whats-new-tf2/2.md | 6 +++--- new/whats-new-tf2/3.md | 10 +++++----- new/whats-new-tf2/4.md | 18 +++++++++--------- new/whats-new-tf2/5.md | 6 +++--- new/whats-new-tf2/6.md | 4 ++-- 12 files changed, 33 insertions(+), 33 deletions(-) diff --git a/new/handson-dl-img-tf/3.md b/new/handson-dl-img-tf/3.md index 5ad8259c..8c899908 100644 --- a/new/handson-dl-img-tf/3.md +++ b/new/handson-dl-img-tf/3.md @@ -113,7 +113,7 @@ ReLu 非线性函数-大于零。 在本节中,我们将实际构建神经网络模型,并使用`Dropout`和`Flatten`创建完整的神经网络。 -我们将从使用功能性 Keras 模型实际组装神经网络开始,查看输入和层堆栈以端对端组装神经网络。 然后,我们将解释为什么会有`Dropout`和`Flatten`,以及它们对您的模型有什么影响。 最后,我们将显示一个模型摘要:这是一种可视化机器学习模型中参数和层总数的方法。 +我们将从使用函数式 Keras 模型实际组装神经网络开始,查看输入和层堆栈以端对端组装神经网络。 然后,我们将解释为什么会有`Dropout`和`Flatten`,以及它们对您的模型有什么影响。 最后,我们将显示一个模型摘要:这是一种可视化机器学习模型中参数和层总数的方法。 在这里,我们使用的是 Keras 的功能模型。 您可以将神经网络视为一系列层,其中每个层均由函数定义。 该函数传递一组参数以配置该层,然后将其作为参数传递给网络中的上一层,以将它们全部链接在一起。 如下面的屏幕快照所示,这小段代码实际上是一个完整的神经网络: diff --git a/new/intel-proj-py/02.md b/new/intel-proj-py/02.md index 103633ea..5cb7647f 100644 --- a/new/intel-proj-py/02.md +++ b/new/intel-proj-py/02.md @@ -934,7 +934,7 @@ def read_data_test(path,dim): return np.array(test_X),test_files ``` -让我们定义推论: +让我们定义推理: ```py def inference_test(test_X,model_save_dest,n_class): diff --git a/new/intel-proj-py/03.md b/new/intel-proj-py/03.md index 071d76ff..d79915f0 100644 --- a/new/intel-proj-py/03.md +++ b/new/intel-proj-py/03.md @@ -224,9 +224,9 @@ NMT 与其他传统方法相比的一些优点如下: ![](img/c8e700f7-0973-4a7a-b1d8-1f00a2ef91e7.png) -图 3.4:基于编码器/解码器的神经机器翻译的推论 +图 3.4:基于编码器/解码器的神经机器翻译的推理 -在推论过程中,源语言输入序列被馈送到编码器网络并产生最终的隐藏状态和单元状态, `[h[f]; c[f]]`馈给解码器的隐藏状态和单元状态。 解码器被转换为单个时间步,馈送到解码器的第一个输入是伪`[START]`字。 因此,基于`[h[f]; c[f]]`和初始虚拟字`[START]`,解码器将输出一个字`w`,以及新的隐藏状态和单元格状态`[h[d]; c[d]]`。 这个单词`w`再次以新的隐藏状态和单元状态馈送到解码器。 `[h[d]; c[d]]`生成下一个单词。 重复此过程,直到遇到序列结束字符。 +在推理过程中,源语言输入序列被馈送到编码器网络并产生最终的隐藏状态和单元状态, `[h[f]; c[f]]`馈给解码器的隐藏状态和单元状态。 解码器被转换为单个时间步,馈送到解码器的第一个输入是伪`[START]`字。 因此,基于`[h[f]; c[f]]`和初始虚拟字`[START]`,解码器将输出一个字`w`,以及新的隐藏状态和单元格状态`[h[d]; c[d]]`。 这个单词`w`再次以新的隐藏状态和单元状态馈送到解码器。 `[h[d]; c[d]]`生成下一个单词。 重复此过程,直到遇到序列结束字符。 # 实现序列到序列的神经翻译机 @@ -921,7 +921,7 @@ python MachineTranslation_word2vec.py --path '/home/santanu/ML_DS_Catalog-/Machi python MachineTranslation.py --path '/home/santanu/ML_DS_Catalog/Machine Translation/fra-eng/fra.txt' --epochs 20 --batch_size 32 -latent_dim 128 --num_samples 40000 --outdir '/home/santanu/ML_DS_Catalog/Machine Translation/' --verbose 1 --mode train ``` -从嵌入向量方法获得的结果与单热编码词向量的结果相似。 这里提供了一些来自保持数据集推论的翻译: +从嵌入向量方法获得的结果与单热编码词向量的结果相似。 这里提供了一些来自保持数据集推理的翻译: ```py Input sentence: Where is my book? diff --git a/new/intel-proj-py/05.md b/new/intel-proj-py/05.md index a73a652a..7d5360c6 100644 --- a/new/intel-proj-py/05.md +++ b/new/intel-proj-py/05.md @@ -781,7 +781,7 @@ Epoch 99 is done. Saving the model ... return video, video_mask, generated_words, probs, embeds ``` -# 推论功能 +# 推理功能 在推理过程中,我们调用`build_generator`定义模型以及推理所需的其他 TensorFlow op,然后使用`tf.train.Saver.restoreutility`从训练后的模型中保存已保存的权重,以加载定义的模型。 一旦加载了模型并准备对每个测试视频进行推理,我们就从 CNN 中提取其对应的视频帧图像预处理特征并将其传递给模型进行推理: diff --git a/new/intel-proj-py/06.md b/new/intel-proj-py/06.md index 2f0763ca..58a0393d 100644 --- a/new/intel-proj-py/06.md +++ b/new/intel-proj-py/06.md @@ -664,7 +664,7 @@ RBM training Completed ! # 使用训练有素的 RBM 推理 -鉴于我们已经在训练过程中生成了带有所有预测的文件`pred_all_recs.csv`,因此针对 RBM 的推论非常简单。 我们要做的只是基于提供的测试文件从`pred_all_recs.csv`中提取测试记录。 另外,我们通过将`1`添加到它们的当前值来求助于原始的`userid`和`movieid`。 返回原始 ID 的目的是能够从`u.user`和`u.item`文件中添加用户和电影信息。 +鉴于我们已经在训练过程中生成了带有所有预测的文件`pred_all_recs.csv`,因此针对 RBM 的推理非常简单。 我们要做的只是基于提供的测试文件从`pred_all_recs.csv`中提取测试记录。 另外,我们通过将`1`添加到它们的当前值来求助于原始的`userid`和`movieid`。 返回原始 ID 的目的是能够从`u.user`和`u.item`文件中添加用户和电影信息。 推理块如下: diff --git a/new/intel-proj-py/07.md b/new/intel-proj-py/07.md index 2c87ec93..26fe6029 100644 --- a/new/intel-proj-py/07.md +++ b/new/intel-proj-py/07.md @@ -576,7 +576,7 @@ android:id="@+id/Review" # Android 应用程序的核心逻辑 -Android 应用程序的核心逻辑是处理用户请求以及传递的数据,然后将结果发送回用户。 作为此移动应用程序的一部分,核心逻辑将接受用户提供的电影评论,处理原始数据,并将其转换为经过训练的 LSTM 模型可以进行推理的格式。 Java 中的`OnClickListener`功能用于监视用户是否已提交处理请求。 在将输入直接输入经过优化的经过训练的 LSTM 模型进行推理之前,需要将提供的电影评论中的每个单词更改为其索引。 除了优化的 protobuf 模型之外,还为此目的存储了单词及其对应索引的字典。 `TensorFlowInferenceInterface` 方法用于对训练后的模型进行推论。 优化的 protobuf 模型和单词词典及其对应的索引存储在`assets`文件夹中。 总而言之,应用程序的核心逻辑执行的任务如下: +Android 应用程序的核心逻辑是处理用户请求以及传递的数据,然后将结果发送回用户。 作为此移动应用程序的一部分,核心逻辑将接受用户提供的电影评论,处理原始数据,并将其转换为经过训练的 LSTM 模型可以进行推理的格式。 Java 中的`OnClickListener`功能用于监视用户是否已提交处理请求。 在将输入直接输入经过优化的经过训练的 LSTM 模型进行推理之前,需要将提供的电影评论中的每个单词更改为其索引。 除了优化的 protobuf 模型之外,还为此目的存储了单词及其对应索引的字典。 `TensorFlowInferenceInterface` 方法用于对训练后的模型进行推理。 优化的 protobuf 模型和单词词典及其对应的索引存储在`assets`文件夹中。 总而言之,应用程序的核心逻辑执行的任务如下: 1. 将索引字典中的单词加载到`WordToInd` `HashMap`中。 词间索引字典是在训练模型之前,在文本的预处理过程中从分词器派生的。 2. 使用`OnClickListener`方法监视用户是否已提交电影评论以进行推断。 diff --git a/new/intel-proj-py/08.md b/new/intel-proj-py/08.md index 937547e8..65e886b0 100644 --- a/new/intel-proj-py/08.md +++ b/new/intel-proj-py/08.md @@ -10,7 +10,7 @@ 聊天机器人不是最近才出现的东西,其起源可以追溯到 1950 年代。 在第二次世界大战之后,艾伦·图灵(Alan Turing)开发了**图灵测试**,以查看人是否可以将人与机器区分开。 多年后的 1966 年,约瑟夫·魏曾鲍姆(Joseph Weizenbaum)开发了一些名为 *Eliza* 的软件,该软件模仿了心理治疗师的语言。 该工具仍位于[这个页面](http://psych.fullerton.edu/mbirnbaum/psych101/Eliza.htm)中。 -聊天机器人可以执行各种各样的任务,下面的列表中显示了其中的一些任务,以强调其多功能性: +聊天机器人可以执行各种各样的任务,下面的列表中显示了其中的一些任务,以强调其多函数式: * 回答有关产品的查询 * 向客户提供建议 @@ -63,7 +63,7 @@ 为了预测第一个单词,LSTM 将提供一个虚拟的起始关键字``,它代表句子的开头。 同样, ``虚拟关键字表示句子的结尾,并且一旦预测到该句,就应该停止输出生成。 -在训练每个目标词的序列到序列模型的过程中,我们知道`apriori`是先前的词,这是**解码器 LSTM** 的输入。 但是,在推论过程中,我们将没有这些目标词,因此我们必须将上一步作为输入。 +在训练每个目标词的序列到序列模型的过程中,我们知道`apriori`是先前的词,这是**解码器 LSTM** 的输入。 但是,在推理过程中,我们将没有这些目标词,因此我们必须将上一步作为输入。 # 建立序列到序列模型 @@ -173,7 +173,7 @@ RNN 的 LSTM 版本用于构建序列到序列模型。 这是因为 LSTM 在记 在此模型中,我们使用两个 LSTM。 第一个 LSTM 将输入推文编码为上下文向量。 该上下文向量不过是编码器 LSTM 的最后一个隐藏状态![](img/88e131cf-cc81-4f08-bb73-0bbb27ce18ed.png),`n`是隐藏状态向量的维。 输入推文![](img/ee42536a-7091-4d15-8ec9-ef97ead2b272.png)作为单词索引序列被馈送到编码器 LSTM,`k`就是输入推文的序列长度。 这些单词索引在馈送到 LSTM 之前已映射到单词嵌入`w ∈ R^m`。 单词嵌入包含在一个嵌入矩阵中`[W ∈ R^(m x N)]`,其中`N`表示词汇表中单词的数量。 -第二个 LSTM 用作解码器。 它试图将编码器 LSTM 创建的上下文向量![](img/4c8e1ab3-3b4e-4061-b674-5cbd46748052.png)解码为有意义的响应。 作为此方法的一部分,我们在每个时间步中将上下文向量与前一个单词一起馈入以生成当前单词。 在第一步中,我们没有任何先前的词可用于条件 LSTM,因此我们使用代理`START`词开始从解码器 LSTM 生成词序列的过程。 在推论过程中,我们在当前时间步输入前一个单词的方式与训练过程中使用的方法不同。 在训练中,由于我们在每个时间步都知道`apriori`之前的单词,因此相应地输入它们没有任何问题。 但是,在推论期间,由于我们在当前时间步上没有实际的前一个单词,因此会反馈前一个时间步上的预测单词。 每个时间步`t`的隐藏状态![](img/99084dfb-e5ab-4074-ad44-01bb8d36b1d3.png)在最终的最大 softmax`N`之前通过几个全连接层馈送。 在此 softmax 层中获得最大概率的单词是时间步长的预测单词。 然后将这个字输入到下一步的输入,即解码器 LSTM 的步骤`t + 1`。 +第二个 LSTM 用作解码器。 它试图将编码器 LSTM 创建的上下文向量![](img/4c8e1ab3-3b4e-4061-b674-5cbd46748052.png)解码为有意义的响应。 作为此方法的一部分,我们在每个时间步中将上下文向量与前一个单词一起馈入以生成当前单词。 在第一步中,我们没有任何先前的词可用于条件 LSTM,因此我们使用代理`START`词开始从解码器 LSTM 生成词序列的过程。 在推理过程中,我们在当前时间步输入前一个单词的方式与训练过程中使用的方法不同。 在训练中,由于我们在每个时间步都知道`apriori`之前的单词,因此相应地输入它们没有任何问题。 但是,在推理期间,由于我们在当前时间步上没有实际的前一个单词,因此会反馈前一个时间步上的预测单词。 每个时间步`t`的隐藏状态![](img/99084dfb-e5ab-4074-ad44-01bb8d36b1d3.png)在最终的最大 softmax`N`之前通过几个全连接层馈送。 在此 softmax 层中获得最大概率的单词是时间步长的预测单词。 然后将这个字输入到下一步的输入,即解码器 LSTM 的步骤`t + 1`。 Keras 中的`TimeDistributed`函数允许在解码器 LSTM 的每个时间步长获得预测的有效实现,如以下代码所示: diff --git a/new/whats-new-tf2/2.md b/new/whats-new-tf2/2.md index 46a44d74..2c72e8c3 100644 --- a/new/whats-new-tf2/2.md +++ b/new/whats-new-tf2/2.md @@ -39,7 +39,7 @@ Keras 是用明确的... 机器学习从根本上讲是一系列统计计算,这些统计计算可以实现最终目的。 这些核心统计组件可以封装为模型。 此外,一些标准计算可被视为与此核心的交互。 从程序员的角度来看,将模型看成一个包含大量数学方程的黑匣子可能会很有用。 然后,其他动作可以描述为与此黑匣子的一组交互。 -例如,给定一组输入记录,可以将**训练**模型理解为计算模型参数(或权重)的过程。 **推论**可以看作是一个过程,使用数学核心和学习到的参数来生成给定输入集的预测。 +例如,给定一组输入记录,可以将**训练**模型理解为计算模型参数(或权重)的过程。 **推理**可以看作是一个过程,使用数学核心和学习到的参数来生成给定输入集的预测。 Keras 大致采用了我们刚刚讨论的抽象范式,以帮助用户使用基于神经网络的模型轻松地构建,训练和预测。 在随后的小节中,我们将详细介绍 Keras 为上述任务中的每一项提供的选项。 我们还将探讨使 Keras 成为不可忽视的强大力量的其他辅助功能。 @@ -128,7 +128,7 @@ def get_layers(n): model_using_generator = tf.keras.Sequential(layers=get_layers(10)) ``` -# 使用功能性 API 建立高级模型 +# 使用函数式 API 建立高级模型 随着机器学习任务的日益成熟,具有多阶段输入和输出的模型变得越来越普遍。 大量实际使用案例涉及具有多阶段输入和输出的模型。 具有多个输入的真实世界模型的一个示例是文本分类模型,该模型可以查看输入文本中的单词和字符序列。 @@ -136,7 +136,7 @@ model_using_generator = tf.keras.Sequential(layers=get_layers(10)) # 训练模式 -**训练模型**指的是为不同网络组件学习权重的过程,这些过程在给定的一组示例中将损失函数降至最低。 简而言之,训练神经网络意味着找到网络价值的最佳组合。 如您所知,培训过程也与评估和预测过程紧密相关。 借助抽象的强大功能,Keras 提供了强大的高级界面来实现和管理端到端的培训过程。 让我们看一下它为使用顺序和功能性 API 创建的模型提供的训练 API。 它为此阶段提供的一些功能如下: +**训练模型**指的是为不同网络组件学习权重的过程,这些过程在给定的一组示例中将损失函数降至最低。 简而言之,训练神经网络意味着找到网络价值的最佳组合。 如您所知,培训过程也与评估和预测过程紧密相关。 借助抽象的强大功能,Keras 提供了强大的高级界面来实现和管理端到端的培训过程。 让我们看一下它为使用顺序和函数式 API 创建的模型提供的训练 API。 它为此阶段提供的一些功能如下: * `model.compile()`:此功能用于配置训练过程。 用户指定详细信息,例如优化器的类型(以及超参数(如果有的话)),损失函数的类型以及要评估的指标。 这些也是可以使用 TensorBoard 可视化的指标。 下面的示例代码片段描述了一个带有**随机梯度下降**(**SGD**)优化器,`CategoricalCrossentropy`损失函数和记录`Accuracy`指标的样本训练配置: diff --git a/new/whats-new-tf2/3.md b/new/whats-new-tf2/3.md index cdb729ea..d731e1d8 100644 --- a/new/whats-new-tf2/3.md +++ b/new/whats-new-tf2/3.md @@ -26,20 +26,20 @@ ML 模型训练的数据准备的关键特征之一是能够将现有数据分 最后,测试数据是... -# 创建 TFRecords +# 创建`TFRecords` -TFRecords 的创建是输入数据管道的核心,因此您可以创建`tf.data.Dataset`对象。 值得注意的是,您可以直接使用原始数据创建数据集,而无需创建 **TFRecords**(将在下一部分中进行说明)。 但是,推荐的方法是首先从原始(拆分)数据创建 **TFRecords** ,然后将其用于数据集管道。 这是 TF 2.0 输入数据管道设计的关键部分。 下图显示了 **TFRecords** 的创建流程: +TFRecords 的创建是输入数据管道的核心,因此您可以创建`tf.data.Dataset`对象。 值得注意的是,您可以直接使用原始数据创建数据集,而无需创建`TFRecords`(将在下一部分中进行说明)。 但是,推荐的方法是首先从原始(拆分)数据创建`TFRecords`,然后将其用于数据集管道。 这是 TF 2.0 输入数据管道设计的关键部分。 下图显示了`TFRecords`的创建流程: ![](img/41f35661-5631-45f1-8c96-42505714c4a3.png) -**TFRecords** 通过将数据序列化到磁盘来帮助我们有效地读取数据,并且可以存储在一组 **TFRecords** 文件中。 每个文件的建议大小为 100 MB 到 200 MB。 应该注意的是`TFRecord`是可以存储任何类型数据的二进制格式。 由于是二进制格式,因此它占用的磁盘空间更少,并且从磁盘存储进行复制或读取所需的时间也更少。 当训练数据太大而无法存储在内存服务器,GPU 和/或 TPU 中时,还需要 **TFRecords** 。 使用带有数据集的 **TFRecords** ,可以按批形式从磁盘按需加载数据(将在本章稍后的*批量*中对此进行解释) 部分)。 +`TFRecords`通过将数据序列化到磁盘来帮助我们有效地读取数据,并且可以存储在一组`TFRecords`文件中。 每个文件的建议大小为 100 MB 到 200 MB。 应该注意的是`TFRecord`是可以存储任何类型数据的二进制格式。 由于是二进制格式,因此它占用的磁盘空间更少,并且从磁盘存储进行复制或读取所需的时间也更少。 当训练数据太大而无法存储在内存服务器,GPU 和/或 TPU 中时,还需要`TFRecords`。 使用带有数据集的`TFRecords`,可以按批形式从磁盘按需加载数据(将在本章稍后的*批量*中对此进行解释) 部分)。 `TFRecords`有四个重要组成部分: * `TFRecord`格式,用于存储二进制记录或数据序列。 * [协议缓冲区](https://developers.google.com/protocol-buffers/)是跨平台的,并且具有跨语言库,用于以协议消息的形式对结构化数据进行有效的序列化。 * 协议消息是信息的小型逻辑记录,其中包含一系列名称/值对。 -* `tf.Example`是一种灵活的协议消息(也称为`protobuf`),旨在与 TensorFlow 一起使用。 **TensorFlow Extended**(**TFX**)是 TF 2.0 中的另一个重要功能,用于部署生产级 ML 管道,我们将在第 5 章中进行学习,[ “模型推理管道–多平台部署”。 +* `tf.Example`是一种灵活的协议消息(也称为`protobuf`),旨在与 TensorFlow 一起使用。 **TensorFlow 扩展**(**TFX**)是 TF 2.0 中的另一个重要功能,用于部署生产级 ML 管道,我们将在第 5 章中进行学习,[ “模型推理管道–多平台部署”。 请注意,在 TF 2.0 中,`tf.Examples`已在诸如 [TFX](https://www.tensorflow.org/tfx/) 的所有 TensorFlow 高级 API 中使用。。 @@ -480,7 +480,7 @@ import tensorflow_datasets as tfdstfds.list_builders() 总体流程可以概括为两个主要过程:原始数据管理和数据集处理。 原始数据管理处理原始数据; 将数据分为训练,验证和测试集; 并创建 TFRecords。 通常,这是一个一次性过程,其中还可以包括脱机数据转换。 数据集操作是一个在线转换过程,该过程创建数据集对象,应用转换,对数据进行混洗,然后重复进行此操作并通过预取创建一批数据; 稍后将它们输入模型。 -无论模型训练/推论的训练数据大小和生命周期如何,始终建议使用输入数据管道。 由于数据集对象在 2.0 版中是 Python 可迭代的,因此将它们馈送到模型中非常简单。 +无论模型训练/推理的训练数据大小和生命周期如何,始终建议使用输入数据管道。 由于数据集对象在 2.0 版中是 Python 可迭代的,因此将它们馈送到模型中非常简单。 在下一章中,我们将学习有关模型训练和使用 TensorBoard 的知识。 diff --git a/new/whats-new-tf2/4.md b/new/whats-new-tf2/4.md index 0daa03aa..1aba5f73 100644 --- a/new/whats-new-tf2/4.md +++ b/new/whats-new-tf2/4.md @@ -52,8 +52,8 @@ TensorFlow 建立深度学习模型并对其进行训练时的理念是,首先 在本节中,我们将学习`tf.keras` API 的三种主要类型,以定义神经网络层,即: * **顺序 API** :这些基于堆叠的 NN 层,可以是密集(前馈)层,卷积层或递归层) -* **功能性 API** :这些有助于构建复杂的模型 -* **模型子类** **API** :这些是完全可自定义的模型; 这些 API 灵活,需要谨慎编写 +* **函数式 API** :这些有助于构建复杂的模型 +* **模型子类 API** :这些是完全可自定义的模型; 这些 API 灵活,需要谨慎编写 下图显示了用于构建`tf.keras.Model`的这三个 API 的 Python 类层次结构: @@ -63,7 +63,7 @@ TensorFlow 建立深度学习模型并对其进行训练时的理念是,首先 # 顺序 API -顺序 API 是创建 TF 模型并提供大约 70-75% 模型类型的最简单方法。 您需要创建一个`tf.keras.models.Sequential(...)` Python 类并将所需的层顺序添加到模型中-这也称为**层堆叠**。 这些层可能是密集,卷积甚至是递归层。 您可能需要提供第一层的输入形状。 以下是使用顺序 API 创建 TF 模型的步骤: +顺序 API 是创建 TF 模型并提供大约 70-75% 模型类型的最简单方法。 您需要创建一个`tf.keras.models.Sequential(...)` Python 类并将所需的层顺序添加到模型中-这也称为**层栈**。 这些层可能是密集,卷积甚至是递归层。 您可能需要提供第一层的输入形状。 以下是使用顺序 API 创建 TF 模型的步骤: 1. 创建一个`Sequential`模型类: @@ -121,11 +121,11 @@ model.add(tf.keras.layers.Dense(units=num_classes, 请注意,使用`tf.keras.layers`代替`tf.layers`。 TensorFlow 2.0 明确建议使用`tf.keras.layers`。 使用`tf.keras.layers`,您可以指定权重,偏差,初始值设定项和正则化项。 使用`tf.layers`和`tf.keras.layers`时,权重初始化的方式以及获得确切的 API 定义的方式可能会有一些差异。 [建议在各个部分中查看](https://www.tensorflow.org/)。 -# 功能性 API +# 函数式 API -功能性 API 比顺序 API 可以构建更高级的模型。 例如,如果您需要一个具有多个输入和多个输出的模型,则无法使用顺序 API。 功能性 API 提供了这种灵活性。 另外,使用功能性 API,您可以定义具有共享层的模型。 此外,只能使用功能性 API 定义具有剩余连接的模型。 +函数式 API 比顺序 API 可以构建更高级的模型。 例如,如果您需要一个具有多个输入和多个输出的模型,则无法使用顺序 API。 函数式 API 提供了这种灵活性。 另外,使用函数式 API,您可以定义具有共享层的模型。 此外,只能使用函数式 API 定义具有剩余连接的模型。 -使用功能性 API 的神经网络层的创建是通过 Python 可调用对象(可调用的 Python 对象)进行的。 作为构建深度学习模型的一部分,深度学习模型通常是分层的,与顺序 API 相反,在顺序 API 中,您首先创建`tf.keras.Sequential`模型,然后在功能性 API 中逐层添加层... +使用函数式 API 的神经网络层的创建是通过 Python 可调用对象(可调用的 Python 对象)进行的。 作为构建深度学习模型的一部分,深度学习模型通常是分层的,与顺序 API 相反,在顺序 API 中,您首先创建`tf.keras.Sequential`模型,然后在函数式 API 中逐层添加层... # 模型子类化 API @@ -195,7 +195,7 @@ self.num_filters = 32 # 模型编制与培训 -神经网络对复杂的非线性函数建模,例如`sin(x)`,`x ** 2`和`x ** 3`,仅举几个简单的函数, 由层的网络(堆栈)组成。 这些层可以是卷积层,循环层或简单的前馈层的混合。 每层由神经元组成。 神经元有两种模型化非线性的成分:前一层的加权总和,然后是激活函数。 神经网络试图以迭代方式学习给定训练数据的分布。 一旦通过指定激活函数以层堆叠的形式构建了神经网络,就需要定义一个目标函数(也称为损失函数)以使用适当的模型来改善模型权重。 +神经网络对复杂的非线性函数建模,例如`sin(x)`,`x ** 2`和`x ** 3`,仅举几个简单的函数, 由层的网络(堆栈)组成。 这些层可以是卷积层,循环层或简单的前馈层的混合。 每层由神经元组成。 神经元有两种模型化非线性的成分:前一层的加权总和,然后是激活函数。 神经网络试图以迭代方式学习给定训练数据的分布。 一旦通过指定激活函数以层栈的形式构建了神经网络,就需要定义一个目标函数(也称为损失函数)以使用适当的模型来改善模型权重。 # compile()API @@ -570,7 +570,7 @@ for num_units in HP_NUM_UNITS.domain.values: # 假设工具 -TensorFlow 2.0 引入了一个非常强大的工具,即**假设工具**(**WIT**),该工具可在 TensorBoard 仪表板内部提供易于使用的界面。 但是,仅当使用 TensorFlow Serving 为模型提供服务时,才可以使用 WIT。 在第 5 章,“模型推理管道 – 多平台部署”中解释了 TensorFlow Serving。 另外,为了使用 WIT,推理数据集必须为`TFRecords`格式。 +TensorFlow 2.0 引入了一个非常强大的工具,即 **What-If 工具**(**WIT**),该工具可在 TensorBoard 仪表板内部提供易于使用的界面。 但是,仅当使用 TensorFlow Serving 为模型提供服务时,才可以使用 WIT。 在第 5 章,“模型推理管道 – 多平台部署”中解释了 TensorFlow Serving。 另外,为了使用 WIT,推理数据集必须为`TFRecords`格式。 WIT 的某些功能是可以将具有相同工作流程的多个模型进行比较,推理结果的可视化,基于相似度的数据排列以及通过编辑数据点执行模型的敏感性分析的能力。 @@ -592,7 +592,7 @@ WIT 的某些功能是可以将具有相同工作流程的多个模型进行比 查看本章,然后尝试找到答案。 -**我应何时使用`tf.keras`顺序和功能性 API? 为什么需要模型子类化?** +**我应何时使用`tf.keras`顺序和函数式 API? 为什么需要模型子类化?** 通常,对于更简单的模型,应使用`tf.keras`顺序。 大部分模型可以使用顺序 API 编写。 但是,对于那些需要多个输入和输出以及某些特定连接(例如剩余功能)的模型,应使用 Functional API。 对于真正定制的模型,可以使用模型子类化。 diff --git a/new/whats-new-tf2/5.md b/new/whats-new-tf2/5.md index 376bae54..54933ba8 100644 --- a/new/whats-new-tf2/5.md +++ b/new/whats-new-tf2/5.md @@ -1,6 +1,6 @@ # 模型推理管道-多平台部署 -训练完模型后您会怎么做? 用它? 如果答案是肯定的,那么您将如何使用它? 您正在寻找的答案是**推论**。 简而言之,推理过程是确保机器学习模型可用于满足实际用户需求的基础。 正式地说,推理是有效地计算经过训练的机器学习模型以满足用户需求的过程。 可以在各种硬件类型上进行推断,包括服务器以及最终用户设备(例如电话和 Web 浏览器)。 根据用户要求,它也可以在不同的操作系统上执行。 +训练完模型后您会怎么做? 用它? 如果答案是肯定的,那么您将如何使用它? 您正在寻找的答案是**推理**。 简而言之,推理过程是确保机器学习模型可用于满足实际用户需求的基础。 正式地说,推理是有效地计算经过训练的机器学习模型以满足用户需求的过程。 可以在各种硬件类型上进行推断,包括服务器以及最终用户设备(例如电话和 Web 浏览器)。 根据用户要求,它也可以在不同的操作系统上执行。 前几章重点介绍了如何... @@ -35,7 +35,7 @@ import tensorflow as tf 实现基于机器学习的应用程序的开发人员可以依靠的一件事是使生活变得轻松,无论所服务模型中的实际计算如何,向用户提供模型的过程或多或少都是相同的。 这意味着,如果实施正确,工程师可能不必在每次数据科学家更新模型时都重新构建部署管道。 这可以通过利用抽象的力量来实现。 这里的一个关键抽象是模型存储和加载的格式。 通过引入标准化格式,TF 2.0 使得在一个环境中训练模型然后在各个平台上使用它变得容易。 在 TF 2.0 中,执行此操作的标准方法是通过`SavedModel`格式。 这种标准化格式类似于软件开发管道中的构建工件。 读者可以将模型工件视为快照,可用于重新创建模型而无需访问创建模型的实际代码。 -实际上,在推论时,模型被简化为一个黑盒子,它具有一组预定义的输入和输出以及一个与底层模型进行交互的统一接口。 开发人员现在要做的就是建立在给定环境中实施和执行黑匣子所需的基础结构。 在以下各节中,我们将学习如何构建管道以服务于各种流行的软件和硬件环境中的模型。 +实际上,在推理时,模型被简化为一个黑盒子,它具有一组预定义的输入和输出以及一个与底层模型进行交互的统一接口。 开发人员现在要做的就是建立在给定环境中实施和执行黑匣子所需的基础结构。 在以下各节中,我们将学习如何构建管道以服务于各种流行的软件和硬件环境中的模型。 # 模型工件– SavedModel 格式 @@ -248,7 +248,7 @@ Result for output key output_0: # TensorFlow 服务 -**TensorFlow 服务**是 **TensorFlow Extended**(**TFX**)平台的组成部分。 顾名思义,它旨在用于服务于机器学习模型。 简而言之,它是专为生产环境设计的高性能服务系统。 TensorFlow Serving 的一个重要特征是它向下游用户公开了一致的 API,而与所服务模型的实际内容无关。 这使得快速进行实验和重新部署变得容易,而无需对其余软件堆栈进行任何其他更改。 它附带对 TensorFlow 模型的内置支持,并且可以扩展为服务于其他类型的模型。 +**TensorFlow 服务**是 **TensorFlow 扩展**(**TFX**)平台的组成部分。 顾名思义,它旨在用于服务于机器学习模型。 简而言之,它是专为生产环境设计的高性能服务系统。 TensorFlow Serving 的一个重要特征是它向下游用户公开了一致的 API,而与所服务模型的实际内容无关。 这使得快速进行实验和重新部署变得容易,而无需对其余软件堆栈进行任何其他更改。 它附带对 TensorFlow 模型的内置支持,并且可以扩展为服务于其他类型的模型。 在本节中,我们将详细介绍 TensorFlow 服务。 从基本的安装和设置开始,以下小节通过一系列动手示例描述如何设置服务器来为`SavedModel`服务。 我们还将简要介绍 TensorFlow Serving 提供的一些关键 API。 diff --git a/new/whats-new-tf2/6.md b/new/whats-new-tf2/6.md index 39e92e3f..3d3c6dae 100644 --- a/new/whats-new-tf2/6.md +++ b/new/whats-new-tf2/6.md @@ -1,6 +1,6 @@ # AIY 项目和 TensorFlow Lite -本章详细介绍如何在低功耗嵌入式系统(例如边缘设备,移动系统(例如 Android,iOS 和 Raspberry))上部署经过训练的 **TensorFlow 2.0**(**TF2.0**)模型 Pi),Edge TPU 和 NVIDIA Jetson Nano。 本章还介绍了自己动手工具包的训练和部署模型,例如 Google **人工智能自己的**(**AIY**)工具包。 本章涵盖的其他主题是如何将经过训练的 **TensorFlow**(**TF**)模型转换为 **TensorFlow Lite**([ **TFLite**)模型,主要区别 他们之间,以及两者的优势。 +本章详细介绍如何在低功耗嵌入式系统(例如边缘设备,移动系统(例如 Android,iOS 和 Raspberry))上部署经过训练的 **TensorFlow 2.0**(**TF2.0**)模型 Pi),Edge TPU 和 NVIDIA Jetson Nano。 本章还介绍了自己动手工具包的训练和部署模型,例如 Google **自己做人工智能**(**AIY**)工具包。 本章涵盖的其他主题是如何将经过训练的 **TensorFlow**(**TF**)模型转换为 **TensorFlow Lite**(**TFLite**)模型,主要区别 他们之间,以及两者的优势。 本章与前几章略有不同,从某种意义上说,它只是对 TF2.0 的更广泛关注的介绍。 也就是说,硬件领域... @@ -109,7 +109,7 @@ Edge TPU 是一种小型处理器,能够执行深度前馈网络,例如卷 TF 支持两种类型的量化。 第一种量化方式是**训练后量化**。 通过将模型优化属性设置为带有`tf.lite.Optimize.OPTIMIZE_FOR_SIZE`的列表,可以在将 TF 模型转换为 TFLite 模型时完成此操作。 这导致权重被转换为 8 位精度,从而将延迟增加了多达 3 倍。 网络中其他更多计算密集型操作将转换为具有定点操作但具有浮点内存的混合操作。 -另一种量化类型是**量化意识训练**,它使用伪造的量化节点来模拟前向和后向模型中量化的效果; 该量化是直接估计。 这是 Edge TPU 支持的唯一量化,并允许在其上运行 TFLite 模型。 +另一种量化类型是**量化感知训练**,它使用伪造的量化节点来模拟前向和后向模型中量化的效果; 该量化是直接估计。 这是 Edge TPU 支持的唯一量化,并允许在其上运行 TFLite 模型。 Edge TPU 有两种可用方式: -- GitLab