提交 cda0b838 编写于 作者: W wizardforcel

2020-12-26 17:14:29

上级 3a4b203c
......@@ -6,7 +6,7 @@
–拉里·特斯勒(Larry Tesler)
在 1996 年 IBM 电脑 Deep Blue 击败 Gary Kasparov 之前,一直认为构建能下象棋的智能系统是 AI。类似地,曾经将视觉,言语和自然语言方面的问题视为复杂问题,但是由于 AI 的影响,它们现在可以 仅被视为计算而非真正的 AI。 近来,人工智能已经能够解决复杂的数学问题,创作音乐和创作抽象绘画,并且人工智能的这些功能正在不断增加。 科学家将 AI 系统在未来等同于人类智能水平的点称为 **AI 奇点**。 机器是否会真正达到人类的智能水平这个问题非常令人着迷。
在 1996 年 IBM 电脑 Deep Blue 击败 Gary Kasparov 之前,一直认为构建能下象棋的智能系统是 AI。类似地,曾经将视觉,言语和自然语言方面的问题视为复杂问题,但是由于 AI 的影响,它们现在仅被视为计算而非真正的 AI。 近来,人工智能已经能够解决复杂的数学问题,创作音乐和创作抽象绘画,并且人工智能的这些功能正在不断增加。 科学家将 AI 系统在未来等同于人类智能水平的点称为 **AI 奇点**。 机器是否会真正达到人类的智能水平这个问题非常令人着迷。
许多人会认为机器永远无法达到人类的智能水平,因为用来学习或执行智能任务的 AI 逻辑是由人类编程的,并且它们缺乏人类所拥有的意识和自我意识。 但是,一些研究人员提出了另一种想法,即人类意识和自我意识就像无限循环程序,可以通过反馈从周围的环境中学习。 因此,也有可能将意识和自我意识编程到机器中。 但是,就目前而言,我们将把 AI 的这一哲学方面再留一天,并简单地讨论我们所知道的 AI。
......@@ -310,7 +310,7 @@ ReLU 的限制条件之一是其输入负值的零梯度。 这可能会减慢
![](img/a5818e53-89c6-4a7a-8f79-f71fdfc2535d.png)
对于 RNN,函数`f[2]`通常为 Sigmoid 或 tanh,其饱受饱和度的困扰,即具有超出指定输入值范围的低梯度。 现在,由于`f[2]`的导数彼此相乘,因此,如果激活函数的输入在饱和区工作,则`∂h[t]^(i)/∂h[k]^(i)`的斜率可以变为零,即使相对`tk`的中等值。 即使`f[2]`函数在饱和区中不起作用,但 Sigmoids 的`f[2]`函数的梯度始终较小 比`1`,因此很难学习序列中单词之间的远距离依存关系。 同样,可能会由于`u[ii]^(t - k)`因子而出现爆炸性梯度问题。 假设步`t``k`之间的距离约为`10`,而重量`u[ii]`,大约两点。 在这种情况下,梯度将被放大两倍,即`2 ^ 10 = 1024`,从而导致爆炸梯度问题。
对于 RNN,函数`f[2]`通常为 Sigmoid 或 tanh,其饱受饱和度的困扰,即具有超出指定输入值范围的低梯度。 现在,由于`f[2]`的导数彼此相乘,因此,如果激活函数的输入在饱和区工作,则`∂h[t]^(i)/∂h[k]^(i)`的斜率可以变为零,即使相对`tk`的中等值。 即使`f[2]`函数在饱和区中不起作用,但 Sigmoids 的`f[2]`函数的梯度始终`1`,因此很难学习序列中单词之间的远距离依存关系。 同样,可能会由于`u[ii]^(t - k)`因子而出现爆炸性梯度问题。 假设步`t``k`之间的距离约为`10`,而重量`u[ii]`,大约两点。 在这种情况下,梯度将被放大两倍,即`2 ^ 10 = 1024`,从而导致爆炸梯度问题。
# 长短期记忆(LSTM)单元
......@@ -376,7 +376,7 @@ ReLU 的限制条件之一是其输入负值的零梯度。 这可能会减慢
Figure 1.14: GAN architecture 
鉴别器最小化的成本函数是二进制交叉熵,用于区分生成器生成的假数据 属于概率分布`P(x)`的真实数据点`z`
鉴别器最小化的成本函数是二进制交叉熵,用于区分生成器生成的假数据,和属于概率分布`P(x)`的真实数据点`z`
![](img/b9cb9aa1-7eac-4174-983d-cb5be41b1eff.png)
......@@ -532,7 +532,7 @@ Figure 1.14: GAN architecture 
# 汽车编码器
与 RBM 十分相似,**自编码器**是一类无监督的学习算法,旨在发现数据中的隐藏结构。 在**主成分分析****PCA**)中,我们尝试捕获输入变量之间的线性关系,并尝试通过(输入的)线性组合来表示降维空间中的数据 变量),这说明了数据的大部分差异。 但是,PCA 无法捕获输入变量之间的非线性关系。
与 RBM 十分相似,**自编码器**是一类无监督的学习算法,旨在发现数据中的隐藏结构。 在**主成分分析****PCA**)中,我们尝试捕获输入变量之间的线性关系,并尝试通过(输入变量的)线性组合来在降维空间中表示数据,这说明了数据的大部分差异。 但是,PCA 无法捕获输入变量之间的非线性关系。
自编码器是一种神经网络,可以捕获输入变量之间的非线性相互作用,同时在隐藏层中以不同维度表示输入。 在大多数情况下,隐藏层的尺寸小于输入的尺寸。 假设存在高维数据固有的低维结构,我们跳过了这一点。 例如,高维图像可以由低维流形表示,并且自编码器通常用于发现该结构。 下图说明了自编码器的神经架构:
......
......@@ -355,7 +355,7 @@ RBM 的参数是可见层单位`i`与隐藏层单位之间的广义权重连接`
如上图所示(“图 6.7”),我们从可见的输入`v^(t)`开始,并对隐藏层进行采样 根据条件概率分布`P(h / v = v^(t))`激活`h'`。 再次,使用条件概率分布`P(v / h = h')`,我们对`v'`进行采样。 根据条件概率分布`P(h / v = v')`对隐藏单元的下一次采样给出`h_bar`,然后使用`P(v/h = h_bar)`对可见单元激活进行采样 给我们`v_bar`。 对于`v``h`,即`P(v, h/Θ)`的整个联合概率分布,将样本`(v_bar, h_bar)`取为代表性样本。 相同的用于计算包含`v``h`的任何表达式的期望。 这种采样过程称为对比散度。
从可见输入开始,然后从条件分布`P(v / h)``P(v / h)`连续采样构成吉布斯采样的一个步骤,并为我们提供了一个样本 联合分布中的`v / h`。 代替在吉布斯采样的每个步骤中选择样本`v / h`,我们可以选择从条件概率分布中进行几次连续的采样迭代后再选择样本。 如果在吉布斯采样的`k`个步骤之后,选择了代表元素,则将对比散度称为`CD-k`。 “图 6.7”中所示的对比散度可以称为`CD-2`,因为我们是在经过两步吉布斯采样后才选择样本的。
从可见输入开始,然后从条件分布`P(v / h)``P(v / h)`连续采样构成吉布斯采样的一个步骤,并为我们提供了联合分布中的样本`v / h`。 代替在吉布斯采样的每个步骤中选择样本`v / h`,我们可以选择从条件概率分布中进行几次连续的采样迭代后再选择样本。 如果在吉布斯采样的`k`个步骤之后,选择了代表元素,则将对比散度称为`CD-k`。 “图 6.7”中所示的对比散度可以称为`CD-2`,因为我们是在经过两步吉布斯采样后才选择样本的。
# 使用 RBM 的协同过滤
......@@ -709,7 +709,7 @@ test RMSE : 1.1999306704742303
从前面的屏幕快照(“图 6.9”)中的预测可以看出,RBM 在预测`userid` `1`的电影的保留集方面做得很好。
建议您将最终收视率预测作为对每个电影收视率预测的多项式概率分布的收视率的期望值,并与采用最高收视率的方法进行比较,了解其效果如何 多项式分布的概率。 可以在[这个页面](https://www.cs.toronto.edu/~rsalakhu/papers/rbmcf.pdf)上找到用于协同过滤的 RBM 论文。受限玻尔兹曼机有关的代码位于[这里](https://github.com/PacktPublishing/Intelligent-Projects-using-Python/blob/master/Chapter06/rbm.py)
建议您将最终收视率预测作为对每个电影收视率预测的多项式概率分布的收视率的期望值,并与采用最高收视率的方法进行比较,了解多项式分布的概率的效果如何。 可以在[这个页面](https://www.cs.toronto.edu/~rsalakhu/papers/rbmcf.pdf)上找到用于协同过滤的 RBM 论文。受限玻尔兹曼机有关的代码位于[这里](https://github.com/PacktPublishing/Intelligent-Projects-using-Python/blob/master/Chapter06/rbm.py)
# 概要
......
......@@ -406,7 +406,7 @@ if __name__ == '__main__':
```
正如您在前面的代码中看到的那样,我们首先通过引用在声明模型时定义的名称来声明输入张量和输出张量。 使用输入和输出张量以及`model.pbtxt``model_ckpt` 文件,通过使用`freeze_graph` 函数冻结模型 来自`tensorflow.python.tools`。 下一步,使用`tensorflow.python.tools`中的`optimize_for_inference_lib`函数创建名为`optimized_model.pb`的原型泡沫模型,进一步优化了冻结模型。 经过优化的 protobuf 模型`optimized_model.pb`将与 Android 应用集成,以进行推理。
正如您在前面的代码中看到的那样,我们首先通过引用在声明模型时定义的名称来声明输入张量和输出张量。 使用输入和输出张量以及`model.pbtxt``model_ckpt` 文件,通过使用来自`tensorflow.python.tools``freeze_graph`函数冻结模型。 下一步,使用`tensorflow.python.tools`中的`optimize_for_inference_lib`函数创建名为`optimized_model.pb`的原型泡沫模型,进一步优化了冻结模型。 经过优化的 protobuf 模型`optimized_model.pb`将与 Android 应用集成,以进行推理。
可以调用`freeze_code.py`模型来创建 protobuf 格式文件,如下所示:
......@@ -740,7 +740,7 @@ org.tensorflow:tensorflow-android:1.7.0
我们将使用以下两部电影的评论测试该移动应用程序: 《阿凡达》和《星际穿越》。 《阿凡达》电影评论来自[这里](https://www.rogerebert.com/reviews/avatar-2009),其内容如下:
> “看着《阿凡达》,我感觉与 1977 年看到《星球大战》时的感觉差不多。那是另一部我充满不确定性的电影。詹姆斯·卡梅隆的电影一直是毫无疑问的超前嗡嗡声的主题,就像他的《泰坦尼克号》一样 再次,他只是通过制作一部非凡的电影而使怀疑者们保持沉默,好莱坞仍然至少有一个人知道如何花费 2.5 亿美元,或者明智地花费 3 亿美元。
> “看着《阿凡达》,我感觉与 1977 年看到《星球大战》时的感觉差不多。那是另一部我充满不确定性的电影。詹姆斯·卡梅隆的电影一直是毫无疑问的超前嗡嗡声的主题,就像他的《泰坦尼克号》一样再次,他只是通过制作一部非凡的电影而使怀疑者们保持沉默,好莱坞仍然至少有一个人知道如何花费 2.5 亿美元,或者明智地花费 3 亿美元。
> “阿凡达》不仅是一种令人震撼的娱乐活动,而且还是一项技术突破。它具有鲜明的绿色和反战信息。它注定要发动一场邪教。它包含如此直观的细节, 像《指环王》一样,它发明了一种新的语言 Na'vi,尽管我很仁慈地怀疑这种语言可以被人类甚至青少年使用,它创造了新的电影明星。 在那些电影中,您觉得必须跟上对话的步伐。”
......@@ -754,7 +754,7 @@ org.tensorflow:tensorflow-android:1.7.0
> “星际大片代表了导演兼导演克里斯托弗·诺兰(Christopher Nolan)所期待的更多激动人心,发人深省,视觉上灿烂的电影制作人,即使其知识渊博超出了人们的理解范围。”
该影片在*烂番茄*上的平均评分为 7/10,如果将其缩放为 5,则得分为 3.5/5,而移动应用预测的评分为 3.37,如下图所示 屏幕截图(“图 7.5”):
该影片在*烂番茄*上的平均评分为 7/10,如果将其缩放为 5,则得分为 3.5/5,而移动应用预测的评分为 3.37,如下图所示(“图 7.5”):
![](img/e35227a8-c487-43ee-934b-08186678ae3a.png)
......
......@@ -57,7 +57,7 @@
图 8.2:使用 LSTM 的序列到序列模型
从上图(“图 8.2”)中可以看出,**编码器 LSTM** 接受单词的输入序列,并将其编码为隐藏状态向量`h`和单元状态 向量`c`。 向量`h``c`是 LSTM 编码器最后一步的隐藏状态和单元状态。 它们本质上将捕获整个输入句子的上下文。
从上图(“图 8.2”)中可以看出,**编码器 LSTM** 接受单词的输入序列,并将其编码为隐藏状态向量`h`和单元状态向量`c`。 向量`h``c`是 LSTM 编码器最后一步的隐藏状态和单元状态。 它们本质上将捕获整个输入句子的上下文。
然后,以`h``c`形式的编码信息作为其初始隐藏状态和单元状态被馈送到**解码器 LSTM** 。 每个步骤中的**解码器 LSTM** 尝试预测以当前单词为条件的下一个单词。 这意味着,**解码器 LSTM** 的每个步骤的输入都是当前字。
......@@ -73,7 +73,7 @@
图 8.3:序列到序列模型
与其将编码器最后一步的隐藏状态`h`和单元状态`c`馈送到**解码器 LSTM** 的初始隐藏状态和单元状态,我们将隐藏状态`h`馈入 解码器的每个输入步骤。 为了预测目标词`w[t]`在任何步骤`t`中,输入是先前的目标词`w[t-1]``t-1`和隐藏状态`h`
与其将编码器最后一步的隐藏状态`h`和单元状态`c`馈送到**解码器 LSTM** 的初始隐藏状态和单元状态,我们将隐藏状态`h`馈入解码器的每个输入步骤。 为了预测目标词`w[t]`在任何步骤`t`中,输入是先前的目标词`w[t-1]``t-1`和隐藏状态`h`
# Twitter 上的客户支持
......
......@@ -61,7 +61,7 @@ Q 值表也通过迭代`t`进行索引,因为代理只能查看到目前为止
在这里,`γ`是折扣因子。 如我们所见,长期奖励结合了即时奖励`r[t]`和基于所展示的下一状态`s[t + 1]`的累积未来奖励。
根据计算出的长期奖励,状态动作对`(s[t], a[t])`的现有 Q 值更新如下:
根据计算出的长期奖励,状态动作对`(s[t], a[t])`的现有 Q 值更新如下:
![](img/c1ed9edd-cd0e-46df-9288-f79abf7ed4e5.png)
......@@ -134,7 +134,7 @@ Q 值表也通过迭代`t`进行索引,因为代理只能查看到目前为止
# 实施自动驾驶汽车
现在,我们将研究实现一种自动驾驶的无人驾驶赛车,该赛车使用深度 Q 网络学习如何在赛道上自行驾驶。 驾驶员和汽车将充当代理,赛车场及其周围环境将充当环境。 我们将使用 OpenAI Gym `CarRacing-v0`框架作为环境。 状态和奖励将由环境呈现给代理,而代理将通过采取适当的行动对代理采取行动。 这些状态采用从汽车前面的摄像头拍摄的图像的形式。 环境接受的动作为三维矢量`a ∈ R^3`的形式,其中第一个分量用于左转,第二个分量用于前移 第三部分用于向右移动。 该代理将与环境交互并将交互转换为`(s, a, r, s'), i = 1 -> m`形式的元组。 这些交互元组将用作我们的训练数据。
现在,我们将研究实现一种自动驾驶的无人驾驶赛车,该赛车使用深度 Q 网络学习如何在赛道上自行驾驶。 驾驶员和汽车将充当代理,赛车场及其周围环境将充当环境。 我们将使用 OpenAI Gym `CarRacing-v0`框架作为环境。 状态和奖励将由环境呈现给代理,而代理将通过采取适当的行动对代理采取行动。 这些状态采用从汽车前面的摄像头拍摄的图像的形式。 环境接受的动作为三维矢量`a ∈ R^3`的形式,其中第一个分量用于左移,第二个分量用于前移,第三部分用于右移。 该代理将与环境交互并将交互转换为`(s, a, r, s'), i = 1 -> m`形式的元组。 这些交互元组将用作我们的训练数据。
该架构将类似于我们在图右侧所示的架构(“图 9.4A”和“图 9.4B”)。
......
......@@ -398,11 +398,11 @@ SVHN 是一个现实世界的数据集,由于它在对象识别算法中的使
![](img/ae36b54b-0a7c-4c94-8c4b-4e5209859d44.png)
在前面的表达式中`D(.)`是鉴别函数,其输出表示将图像标记为实数的可能性。`P[z](z)`表示随机变量噪声`z`的分布,而`P[X](x)`表示真实门牌号图像的分布。`G(.)``D(.)`分别表示生成器网络功能和鉴别器网络功能。 这些参数可以通过网络的权重进行参数化,而网络的权重是我们为表示法的混乱而方便地跳过的。 如果我们用`θ`表示发生器网络权重的参数,用`φ`表示鉴别器网络的权重,则鉴别器将学会使`(1)`相对于`φ`的损失最小化,而 生成器将旨在使`(1)``θ`的损失相同。 我们可以将`(1)`中优化的损耗称为效用函数,发生器和鉴别器都在参数方面进行了优化。 实用函数`U`可以根据生成器和鉴别器的参数来编写,如下所示:
在前面的表达式中`D(.)`是鉴别函数,其输出表示将图像标记为实数的可能性。`P[z](z)`表示随机变量噪声`z`的分布,而`P[X](x)`表示真实门牌号图像的分布。`G(.)``D(.)`分别表示生成器网络功能和鉴别器网络功能。 这些参数可以通过网络的权重进行参数化,而网络的权重是我们为表示法的混乱而方便地跳过的。 如果我们用`θ`表示发生器网络权重的参数,用`φ`表示鉴别器网络的权重,则鉴别器将学会使`(1)`相对于`φ`的损失最小化,而生成器将旨在使`(1)``θ`的损失相同。 我们可以将`(1)`中优化的损耗称为效用函数,发生器和鉴别器都在参数方面进行了优化。 实用函数`U`可以根据生成器和鉴别器的参数来编写,如下所示:
![](img/e18dcc4f-da73-459c-ae45-a767f0e05be9.png)
从博弈论的角度来看,生成器`G`和鉴别器`D`相互之间具有效用函数`U(θ, φ)`的零和最小极大值游戏,并且最小极大值游戏的优化问题可以 然后表示为:
从博弈论的角度来看,生成器`G`和鉴别器`D`相互之间具有效用函数`U(θ, φ)`的零和最小极大值游戏,并且最小极大值游戏的优化问题可以表示为:
![](img/b7879b3d-3991-4996-9a1e-a84f53d47c9c.png)
......@@ -517,7 +517,7 @@ def discriminator(img_dim,alpha=0.2):
生成器`g`创建`d`鉴别器将评估的伪造图像,并尝试将其标记为伪造。
`g_d`网络中,`g`生成器创建伪造的图像,然后尝试欺骗`d`鉴别器,使其相信它们是真实的。 鉴别器网络使用二进制交叉熵损失进行编译,并且针对鉴别器参数`φ`优化了损失,而`g_d`网络则针对`g`发生器的参数`θ`进行了编译 为了欺骗歧视者。 因此,`g_d`网络损失是与鉴别器将所有伪造图像标记为真实图像有关的二进制交叉熵损失。 在每个小型批量中,基于与`g_d``d`网络相关的损耗的优化来更新生成器和鉴别器权重:
`g_d`网络中,`g`生成器创建伪造的图像,然后尝试欺骗`d`鉴别器,使其相信它们是真实的。 鉴别器网络使用二进制交叉熵损失进行编译,并且针对鉴别器参数`φ`优化了损失,而`g_d`网络则针对`g`发生器的参数`θ`进行了编译,以便欺骗判别器。 因此,`g_d`网络损失是与鉴别器将所有伪造图像标记为真实图像有关的二进制交叉熵损失。 在每个小型批量中,基于与`g_d``d`网络相关的损耗的优化来更新生成器和鉴别器权重:
```py
def train(dest_train,outdir,
......
......@@ -377,7 +377,7 @@ RFE 是我们将使用`RandomForestClassifier`模型的第三种技术,请记
![](img/ba4c0671-5d52-4204-806c-85b9c4ecfcd9.png)
现在,**不可减少的误差**项是该随机项的方差。 您对此词没有任何控制权。 总会有一个不可减少的错误成分。 因此,您的模型总是会出错; 无论您拥有多少个特征和数据点,您的模型都不能总是 100% 正确的。 我们必须尝试使用​​更好和更复杂的方法来执行特征工程,并尝试将我们的估计近似为真实函数。 仅仅因为您使用的是更复杂的模型或您有更多的数据,您的模型就不会是完美的,并且您将无法准确预测`y`是什么,因为几乎所有过程都存在随机性 与您一起工作。 这是一个非常有趣的部分的结尾。
现在,**不可减少的误差**项是该随机项的方差。 您对此词没有任何控制权。 总会有一个不可减少的错误成分。 因此,您的模型总是会出错; 无论您拥有多少个特征和数据点,您的模型都不能总是 100% 正确的。 我们必须尝试使用​​更好和更复杂的方法来执行特征工程,并尝试将我们的估计近似为真实函数。 仅仅因为您使用的是更复杂的模型或您有更多的数据,您的模型就不会是完美的,并且您将无法准确预测`y`是什么,因为几乎所有过程都存在需要处理的随机性。 这是一个非常有趣的部分的结尾。
# 概要
......
......@@ -221,7 +221,7 @@ pip install --ignore-installed --upgrade tensorflow
![](img/ef618ce1-282e-41fd-9b3f-55b6317130f4.png)
在前面的屏幕截图中,我们看到了通过计算图流到图中不同节点的值。 因此,在第一个节点中,将值`3`分配给`x`,在另一个节点中,将值`2`分配给`y`。 现在,`x`的值流到一个运算节点,在该运算节点上平方,该节点的结果流到另一个运算,在运算上与`y`的值相乘。 我们还有另一个节点,其中`y`的值乘以`4``x``y`乘法节点的结果以及`y`乘法节点的结果流到最终节点,即加法节点,这使我们 最终输出`26`。 因此,这基本上就是 TensorFlow 的工作方式。 节点之间流动的是张量。
在前面的屏幕截图中,我们看到了通过计算图流到图中不同节点的值。 因此,在第一个节点中,将值`3`分配给`x`,在另一个节点中,将值`2`分配给`y`。 现在,`x`的值流到一个运算节点,在该运算节点上平方,该节点的结果流到另一个运算,在运算上与`y`的值相乘。 我们还有另一个节点,其中`y`的值乘以`4``x``y`乘法节点的结果以及`y`乘法节点的结果流到最终节点,即加法节点,这为我们产生最终输出`26`。 因此,这基本上就是 TensorFlow 的工作方式。 节点之间流动的是张量。
我们在 TensorFlow 中使用以下其他对象:
......
......@@ -2,7 +2,7 @@
TensorFlow 是最受欢迎的机器学习框架之一,其新版本 TensorFlow 2.0 改善了其简单性和易用性。 本书将帮助您了解和利用最新的 TensorFlow 功能。
《TensorFlow 2.0 的新增功能》首先关注高级概念,例如新的 TensorFlow Keras API,渴望执行和高效的分发策略,这些策略可帮助您在多个 GPU 和 TPU 上运行机器学习模型。 本书随后将引导您完成构建数据摄取和培训管道的过程,并提供建议和最佳实践,以将数据提供给使用新`tf.keras` API 创建的模型。 您将探索使用 TensorFlow 服务和其他多平台部署构建推理管道的过程,然后再继续探索新发布的 AIY(本质上是自己动手的 AI)。 本书深入研究了核心 API,可帮助您构建统一的卷积层和循环层,并使用 TensorBoard 通过假设分析来可视化深度学习模型。
《TensorFlow 2.0 的新增功能》首先关注高级概念,例如新的 TensorFlow Keras API,急切执行和高效的分发策略,这些策略可帮助您在多个 GPU 和 TPU 上运行机器学习模型。 本书随后将引导您完成构建数据摄取和培训管道的过程,并提供建议和最佳实践,以将数据提供给使用新`tf.keras` API 创建的模型。 您将探索使用 TensorFlow 服务和其他多平台部署构建推理管道的过程,然后再继续探索新发布的 AIY(本质上是自己动手的 AI)。 本书深入研究了核心 API,可帮助您构建统一的卷积层和循环层,并使用 TensorBoard 通过假设分析来可视化深度学习模型。
到这本书的结尾,您将了解 TensorFlow 2.0 和 TensorFlow 1.x 之间的兼容性,并将能够平稳地迁移到 TensorFlow 2.0。
......
......@@ -13,7 +13,7 @@
# 什么是新的?
TF 2.0 的理念基于简单性和易用性。 主要更新包括使用`tf.keras`轻松构建模型并渴望执行,可在任何平台上进行生产和商业使用的强大模型部署,强大的实验技术和研究工具,以及用于简化 API 的 API 简化。
TF 2.0 的理念基于简单性和易用性。 主要更新包括使用`tf.keras`轻松构建模型并急切执行,可在任何平台上进行生产和商业使用的强大模型部署,强大的实验技术和研究工具,以及用于简化 API 的 API 简化。
下图简化了 TF 2.0 的新组织:
......@@ -245,4 +245,4 @@ TF 2.0 还将默认的高级 API 从 TF 1.x 中的估计器转移到 TF 2.0 中
本章还包括参差不齐的张量,这对于存储具有可变长度和形状以及分层输入的数据很有用。 这意味着参差不齐的张量对于存储语言和序列数据很有用。
在下一章中,我们将了解 Keras 的默认集成和渴望执行的知识。
\ No newline at end of file
在下一章中,我们将了解 Keras 的默认集成和急切执行的知识。
\ No newline at end of file
# Keras 默认集成和急切执行
本章涵盖了两个高级 **TensorFlow 2.0****TF 2.0**)API,即 Keras 和估计器。 本章重点关注惰性评估和渴望执行的概念,重点介绍如何在 **TensorFlow 1.x****TF 1.x**)和 TF 2.0 中评估基础计算图之间的差异 。 本章还提供了有关使用诸如 Keras 之类的高级 API 构建自定义模型(使用自定义低级操作)的详细指南。
本章涵盖了两个高级 **TensorFlow 2.0****TF 2.0**)API,即 Keras 和估计器。 本章重点关注惰性评估和急切执行的概念,重点介绍如何在 **TensorFlow 1.x****TF 1.x**)和 TF 2.0 中评估基础计算图之间的差异 。 本章还提供了有关使用诸如 Keras 之类的高级 API 构建自定义模型(使用自定义低级操作)的详细指南。
本章将涵盖以下主题:
......@@ -400,7 +400,7 @@ TensorFlow 的中心思想是,要求程序员创建计算图以指定需要执
TF 2.0 旨在通过更改评估和计算基础计算图的方式来解决此问题。 用一个句子,TF ...
# 延迟加载与渴望执行
# 延迟加载与急切执行
**延迟加载**是一种编程范例,其中直到实际需要数量才计算数量的值。 换句话说,在没有明确请求之前,不会初始化对象。 这样做的主要好处是,当按需计算数量值时,无需使用额外的内存来存储计算结果。 如果正确使用,这将导致非常有效的内存使用并提高速度。
......
......@@ -58,7 +58,7 @@ import tensorflow as tf
# tf.function API
正如我们在第 1 章中看到的那样,第 2 章“TensorFlow 2.0 入门”, “Keras 默认集成和急切执行”,渴望 默认情况下启用执行是 TF 2.0 中引入的主要更改之一。 第 1 章和 “TensorFlow 2.0 入门”还简要提到了 TF 2.0 与 Python 编程语言更紧密地结合在一起。 此更改的核心是低级`tf.function` API。 实际上,这是通过使用户能够从 Python 函数创建 TensorFlow 图而将 TensorFlow 1.x 的功能与渴望执行的优点相结合。 它既可以用作可调用函数,也可以用作装饰器。 在本节中,我们将简要介绍一下如何在每个人中使用它。
正如我们在第 1 章中看到的那样,第 2 章“TensorFlow 2.0 入门”, “Keras 默认集成和急切执行”,默认情况下启用急切执行是 TF 2.0 中引入的主要更改之一。 第 1 章和 “TensorFlow 2.0 入门”还简要提到了 TF 2.0 与 Python 编程语言更紧密地结合在一起。 此更改的核心是低级`tf.function` API。 实际上,这是通过使用户能够从 Python 函数创建 TensorFlow 图而将 TensorFlow 1.x 的功能与急切执行的优点相结合。 它既可以用作可调用函数,也可以用作装饰器。 在本节中,我们将简要介绍一下如何在每个人中使用它。
# `tf.autograph`函数
......@@ -127,7 +127,7 @@ def compute_square(number):
```
到目前为止,我们已经成功实现了一个 TensorFlow 计算图,该图可以计算给定一维张量的平方。 现在唯一要做的就是以`SavedModel`格式将此图形导出到磁盘。 您可能还记得,`tf.saved_model`模块中提供了用于`SavedModel`的 API。 [在阅读该模块的文档](https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/saved_model)时,我们发现`save`方法可能会有所帮助 给我们。 一个粗糙的边缘是`tf.saved_model.save`方法仅适用于`Trackable`类型的对象,而我们所拥有的是`tf.function()`对象(属于`Trackable`类型或其子类)。 为了克服这个问题,我们只需将代码包装在实现`Trackable`接口的类中:
到目前为止,我们已经成功实现了一个 TensorFlow 计算图,该图可以计算给定一维张量的平方。 现在唯一要做的就是以`SavedModel`格式将此图形导出到磁盘。 您可能还记得,`tf.saved_model`模块中提供了用于`SavedModel`的 API。 [在阅读该模块的文档](https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/saved_model)时,我们发现`save`方法可能会对我们有所帮助。 一个粗糙的边缘是`tf.saved_model.save`方法仅适用于`Trackable`类型的对象,而我们所拥有的是`tf.function()`对象(属于`Trackable`类型或其子类)。 为了克服这个问题,我们只需将代码包装在实现`Trackable`接口的类中:
```py
class Square(tf.Module):
......
# AIY 项目和 TensorFlow Lite
本章详细介绍如何在低功耗嵌入式系统(例如边缘设备,移动系统(例如 Android,iOS 和 Raspberry Pi),Edge TPU 和 NVIDIA Jetson Nano 上部署经过训练的 **TensorFlow 2.0****TF2.0**)模型。 本章还介绍了自己动手工具包的训练和部署模型,例如 Google **自己做人工智能****AIY**)工具包。 本章涵盖的其他主题是如何将经过训练的 **TensorFlow****TF**)模型转换为 **TensorFlow Lite****TFLite**)模型,主要区别 他们之间,以及两者的优势。
本章详细介绍如何在低功耗嵌入式系统(例如边缘设备,移动系统(例如 Android,iOS 和 Raspberry Pi),Edge TPU 和 NVIDIA Jetson Nano 上部署经过训练的 **TensorFlow 2.0****TF2.0**)模型。 本章还介绍了自己动手工具包的训练和部署模型,例如 Google **自己做人工智能****AIY**)工具包。 本章涵盖的其他主题是如何将经过训练的 **TensorFlow****TF**)模型转换为 **TensorFlow Lite****TFLite**)模型,他们之间的主要区别,以及两者的优势。
本章与前几章略有不同,从某种意义上说,它只是对 TF2.0 的更广泛关注的介绍。 也就是说,硬件领域...
......@@ -124,7 +124,7 @@ USB 加速器与任何具有运行 Debian 的 USB 端口的 Linux 计算机兼
![](img/ee7dff88-2f0b-4a1a-86b9-966f0c8ce1d7.png)
但是,Edge TPU 有两个约束。 如前所述,必须使用量化感知训练对`Tensor`参数进行量化。 张量大小必须恒定(这样就不能有动态大小); 模型参数必须恒定; 张量必须是一维,二维或三维张量,或者是三个最里面的尺寸大于 3 维的张量,并且只能包含 Edge TPU 支持的那些操作。 如果不满足这些要求,那么将仅编译某些模型。 模型图中发生不支持的操作的第一点是编译器将图分为两部分:一部分包含 Edge TPU 可以计算的所有操作,另一部分包含它不能计算的操作,这些部分将运行 在 CPU 上:
但是,Edge TPU 有两个约束。 如前所述,必须使用量化感知训练对`Tensor`参数进行量化。 张量大小必须恒定(这样就不能有动态大小); 模型参数必须恒定; 张量必须是一维,二维或三维张量,或者是三个最里面的尺寸大于 3 维的张量,并且只能包含 Edge TPU 支持的那些操作。 如果不满足这些要求,那么将仅编译某些模型。 模型图中发生不支持的操作的第一点是编译器将图分为两部分:一部分包含 Edge TPU 可以计算的所有操作,另一部分包含它不能计算的操作,这些部分将运行在 CPU 上:
![](img/aedc0f8e-e06f-4917-ad0a-41abe07ad00b.png)
......
......@@ -16,7 +16,7 @@
TF 2.0 中的许多 API 都已被删除或移动。 主要更改包括删除`tf.app``tf.flags``tf.logging`,以支持其他 Python 模块,例如`absl-py`和内置的日志记录系统。
TF 2.0 在代码方面所做的最大更改之一就是渴望执行。 TF 1.x 要求用户使用`tf.*`调用来手工拼接抽象语法树,以构建计算图,该图将与`session.run()`一起运行。 这意味着 TF 2.0 代码逐行运行,因此不再需要`tf.control_dependancies()`
TF 2.0 在代码方面所做的最大更改之一就是急切执行。 TF 1.x 要求用户使用`tf.*`调用来手工拼接抽象语法树,以构建计算图,该图将与`session.run()`一起运行。 这意味着 TF 2.0 代码逐行运行,因此不再需要`tf.control_dependancies()`
TF 1.x 中的`session.run()`调用与...非常相似。
......@@ -389,4 +389,4 @@ TensorFlow Medium 博客还提供有关 TensorFlow 库和服务状态的许多
本章介绍了两种将 TF 1.x 代码转换为 TF 2.0 代码的方法。 第一种方法是使用随附的升级脚本,该脚本会将所有 API 调用从`tf.x`更改为`tf.compat.v1.x`。 这允许 TF 1.x 代码在 TF 2.0 中运行,但不会从 TF 2.0 中带来的升级中受益。 第二种方法是将 TF 1.x 更改为惯用的 TF 2.0 代码,这涉及两个步骤。 第一步是将所有模型创建代码更改为 TF 2.0 代码,这涉及使用对函数的`sess.run`调用,以及将占位符和字典馈入函数的参数来更改张量。 使用`tf.layers` API 创建的模型与`tf.keras.layers`具有一对一的比较。 第二步是通过使用`tf.keras.Model.fit`或带有`tf.GradientTape`的自定义训练循环来升级训练管道。
TF 2.0 改变了 TensorFlow 代码的编写和组织方式。 TF 2.0 中的一些主要更改是对主模块中 API 的重组和清理。 这包括删除`tf.contrib`模块。 其他更改包括增加了代码范围内的急切执行,以简化调试和使用范围。 由于渴望执行,因此在 TF 2.0 中创建的变量的行为类似于普通的 Python 变量。 这意味着用于处理全局变量的 TF 1.x API 已过时,因此已在 TF 2.0 中删除。 这使我们到书的结尾!
\ No newline at end of file
TF 2.0 改变了 TensorFlow 代码的编写和组织方式。 TF 2.0 中的一些主要更改是对主模块中 API 的重组和清理。 这包括删除`tf.contrib`模块。 其他更改包括增加了代码范围内的急切执行,以简化调试和使用范围。 由于急切执行,因此在 TF 2.0 中创建的变量的行为类似于普通的 Python 变量。 这意味着用于处理全局变量的 TF 1.x API 已过时,因此已在 TF 2.0 中删除。 这使我们到书的结尾!
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册