提交 63877f73 编写于 作者: W wizardforcel

2020-08-04 21:26:30

上级 b18a1db6
# 一、TensorFlow 101
TensorFlow 是解决机器学习和深度学习问题的流行库之一。在开发供 Google 内部使用后,它作为开源发布供公众使用和开发。让我们理解 TensorFlow 的三个模型**数据模型****编程模型****执行模型**
TensorFlow 是解决机器学习和深度学习问题的流行库之一。在开发供 Google 内部使用后,它作为开源发布供公众使用和开发。让我们理解 TensorFlow 的三个模型**:数据模型****编程模型****执行模型**
TensorFlow 数据模型由张量组成,编程模型由数据流图或计算图组成。 TensorFlow 执行模型包括基于依赖条件从序列中触发节点,从依赖于输入的初始节点开始。
......@@ -94,7 +94,7 @@ print(tfs.run(hello))
**张量**是 TensorFlow 中计算的基本元素和基本数据结构。可能是您需要学习使用 TensorFlow 的唯一数据结构。张量是由维度,形状和类型标识的 n 维数据集合。
**Rank** 是张量的维数,**形状**是表示每个维度的大小的列表。张量可以具有任意数量的尺寸。您可能已经熟悉零维集合(标量),一维集合(向量),二维集合(矩阵)的数量,以及多维集合。
**阶数**是张量的维数,**形状**是表示每个维度的大小的列表。张量可以具有任意数量的尺寸。您可能已经熟悉零维集合(标量),一维集合(向量),二维集合(矩阵)的数量,以及多维集合。
标量值是等级 0 的张量,因此具有[1]的形状。向量或一维数组是秩 1 的张量,并且具有[列]或[行]的形状。矩阵或二维数组是秩 2 的张量,并且具有[行,列]的形状。三维数组将是秩 3 的张量,并且以相同的方式,n 维数组将是秩`n`的张量。
......@@ -655,7 +655,7 @@ TensorFlow 为我们提供了生成填充随机值分布的张量的函数。
生成的分布受图级别或操作级别种子的影响。使用`tf.set_random_seed`设置图级种子,而在所有随机分布函数中给出操作级种子作为参数`seed`。如果未指定种子,则使用随机种子。
有关TensorFlow中随机种子的更多详细信息,请访问[此链接](https://www.tensorflow.org/api_docs/python/tf/set_random_seed)
有关 TensorFlow 中随机种子的更多详细信息,请访问[此链接](https://www.tensorflow.org/api_docs/python/tf/set_random_seed)
下表列出了一些张量生成函数,用于使用随机值分布填充张量元素:
......@@ -739,13 +739,13 @@ b = tf.get_variable(name='b',shape=[1],dtype=tf.float32,initializer=[-.3])
在分布式 TensorFlow 中,我们可以跨机器运行代码,`tf.get_variable()`为我们提供了全局变量。要获取局部变量,TensorFlow 具有类似签名的函数:`tf.get_local_variable()`
**共享或重用变量:**获取已定义的变量可促进重用。但是,如果未使用`tf.variable_scope.reuse_variable()``tf.variable.scope(reuse=True)`设置重用标志,则会抛出异常。
**共享或重用变量**获取已定义的变量可促进重用。但是,如果未使用`tf.variable_scope.reuse_variable()``tf.variable.scope(reuse=True)`设置重用标志,则会抛出异常。
现在您已经学会了如何定义张量,常量,运算,占位符和变量,让我们了解 TensorFlow 中的下一级抽象,它将这些基本元素组合在一起形成一个基本的计算单元,即数据流图或计算图。
# 数据流图或计算图
**数据流图****计算图**是 TensorFlow 中的基本计算单元。从现在开始,我们将它们称为**计算** **图**。计算图由节点和边组成。每个节点代表一个操作(`tf.Operation`),每个边代表一个在节点之间传递的张量(`tf.Tensor`)。
**数据流图****计算图**是 TensorFlow 中的基本计算单元。从现在开始,我们将它们称为**计算图**。计算图由节点和边组成。每个节点代表一个操作(`tf.Operation`),每个边代表一个在节点之间传递的张量(`tf.Tensor`)。
TensorFlow 中的程序基本上是计算图。您可以使用表示变量,常量,占位符和操作的节点创建图,并将其提供给 TensorFlow。 TensorFlow 找到它可以触发或执行的第一个节点。触发这些节点会导致其他节点触发,依此类推。
......
......@@ -165,7 +165,7 @@ TFLearn 与 TensorFlow Learn 软件包不同,后者也称为 TF Learn(TF 和
pip3 install tflearn
```
要在其他环境或源中安装TFLearn,请参阅[此链接](http://tflearn.org/installation/)
要在其他环境或源中安装 TFLearn,请参阅[此链接](http://tflearn.org/installation/)
TFLearn 中的简单工作流程如下:
......@@ -252,7 +252,7 @@ TFLearn 在`tflearn.layers.conv`模块中提供以下层:
| `avg_pool_1d` | 该层计算 1D 平均池 |
| `avg_pool_2d` | 该层计算 2D 平均池 |
| `upsample_2d` | 该层应用行和列 2-D 重复操作 |
| `upscore_layer` | 该层实现了 <http://arxiv.org/abs/1411.4038> 中规定的最高分。 |
| `upscore_layer` | 该层实现了[这个页面](http://arxiv.org/abs/1411.4038)中规定的最高分。 |
| `global_max_pool` | 该层实现全局最大池操作 |
| `global_avg_pool` | 该层实现全局平均池操作 |
| `residual_block` | 该层实现剩余块以创建深度残留网络 |
......@@ -553,7 +553,7 @@ Test loss : 192.8847198486328
| 高级库 | 文档链接 | 源代码链接 | pip3 安装包 |
| --- | --- | --- | --- |
| TF Estimator | <https://www.tensorflow.org/get_started/estimator> | <https://github.com/tensorflow/tensorflow/tree/master/tensorflow/python/estimator> | 预先安装了 TensorFlow |
| TF Slim | <https://github.com/tensorflow/tensorflow/tree/r1.4/tensorflow/contrib/slim> | [https://github.com/tensorflow/tensorflow/tree/r1.4/tensorflow/contrib/slim](https://github.com/tensorflow/tensorflow/tree/r1.4/tensorflow/contrib/slim/python/slim) | preinstalled with TensorFlow |
| TF Slim | <https://github.com/tensorflow/tensorflow/tree/r1.4/tensorflow/contrib/slim> | <https://github.com/tensorflow/tensorflow/tree/r1.4/tensorflow/contrib/slim/python/slim> | preinstalled with TensorFlow |
| TFLearn | <http://tflearn.org/> | <https://github.com/tflearn/tflearn> | `tflearn` |
| PrettyTensor | <https://github.com/google/prettytensor/tree/master/docs> | <https://github.com/google/prettytensor> | `prettytensor` |
| Sonnet | <https://deepmind.github.io/sonnet/> | <https://github.com/deepmind/sonnet> | `dm-sonnet` |
......
......@@ -109,7 +109,7 @@ Keras 核心层实现基本操作,几乎用于各种网络架构。下表给
| **层名称** | **描述** |
| --- | --- |
| `Dense` | 这是一个简单的完全连接的神经网络层。该层生成以下函数的输出:`激活(输入 x 权重 + 偏差)`,其中激活是指传递给层的激活函数,默认为`None`。 |
| `Activation` | 该层将指定的激活函数应用于输出。该层生成以下函数的输出**`激活(输入)`,其中激活是指传递给该层的激活函数。以下激活函数可用于实例化层:`softmax``elu``selu``softplus``softsign``relu``tanh``sigmoid``hard_sigmoid``linear` |
| `Activation` | 该层将指定的激活函数应用于输出。该层生成以下函数的输出**`激活(输入)`,其中激活是指传递给该层的激活函数。以下激活函数可用于实例化层:`softmax``elu``selu``softplus``softsign``relu``tanh``sigmoid``hard_sigmoid``linear` |
| `Dropout` | 该层以指定的 dropout 率将 dropout 正则化应用于输入。 |
| `Flatten` | 该层使输入变平,即对于三维输入,它变平并产生一维输出。 |
| `Reshape` | 此层将输入转换为指定的形状。 |
......
......@@ -42,7 +42,7 @@
* 简单的线性回归
* 多元回归
* 正则化回归
* 套索正则化
* LASSO 正则化
* 岭正则化
* ElasticNet 正则化
* 分类
......@@ -135,7 +135,7 @@ b = tf.Variable(tf.zeros([num_outputs]),
* `x_tensor`被定义为具有可变行和`num_inputs`列的形状,并且在我们的示例中列数仅为 1
* `y_tensor`定义为具有可变行和`num_outputs`列的形状,列数在我们的示例中只有一个
* `w`被定义为维度`num_inputs` x `num_outputs`的变量,在我们的例子中是 **1 x 1**
* `w`被定义为维度`num_inputs` x `num_outputs`的变量,在我们的例子中是`1 x 1`
* `b`被定义为维度`num_outputs`的变量,在我们的例子中是一个
# 定义模型
......@@ -148,11 +148,11 @@ model = tf.matmul(x_tensor, w) + b
# 定义损失函数
接下来,我们使用**均方误差** **MSE** )定义损失函数。 MSE 定义如下:
接下来,我们使用**均方误差****MSE**)定义损失函数。 MSE 定义如下:
有关 MSE 的更多详细信息,[请访问此链接](http://www.statisticshowto.com/mean-squared-error/)
`y`的实际值和估计值的差异称为**残**。损失函数计算残差平方的平均值。我们通过以下方式在 TensorFlow 中定义它:
`y`的实际值和估计值的差异称为**残**。损失函数计算残差平方的平均值。我们通过以下方式在 TensorFlow 中定义它:
```py
loss = tf.reduce_mean(tf.square(model - y_tensor))
......@@ -162,7 +162,7 @@ loss = tf.reduce_mean(tf.square(model - y_tensor))
* `tf.square(model - y_tensor)`计算每个残差的平方
* `tf.reduce_mean( ... )`最终计算在前一步骤中计算的平方均值
我们还定义**均方误差** **mse** )和 **r 平方****rs** )函数来评估训练模型。我们使用单独的`mse`函数,因为在接下来的章节中,损失函数将改变但`mse`函数将保持不变。
我们还定义**均方误差****mse**)和 **r 平方****rs**)函数来评估训练模型。我们使用单独的`mse`函数,因为在接下来的章节中,损失函数将改变但`mse`函数将保持不变。
```py
# mse and R2 functions
......@@ -438,15 +438,15 @@ For test data : MSE = 30.48501778, R2 = 0.64172244
该惩罚项称为**正则化**项,由此获得的回归模型称为正则化回归模型。正则化模型有三种主要类型:
* **套索回归**:在套索正则化中,也称为 L1 正则化,正则化项是套索参数`α`乘以权重`w`绝对值之和。因此,损失函数如下:
* **LASSO 回归**:在 LASSO 正则化中,也称为 L1 正则化,正则化项是 LASSO 参数`α`乘以权重`w`绝对值之和。因此,损失函数如下:
![](img/662a9855-a00c-41ad-8b0e-2b65dbfbdd69.png)
* **岭回归**:在脊正则化中,也称为 L2 正则化,正则化项是脊参数`α`乘以`i-th`权重`w`的平方和。因此,损失函数如下:
* **岭回归**:在岭正则化中,也称为 L2 正则化,正则化项是岭参数`α`乘以`i-th`权重`w`的平方和。因此,损失函数如下:
![](img/b6aba15b-577d-4a22-a559-bd6f1f2e0d1b.png)
* **ElasticNet 回归**:当我们添加套索和脊正则化项时,得到的正则化称为 ElasticNet 正则化。因此,损失函数如下:
* **ElasticNet 回归**:当我们添加 LASSO 和岭正则化项时,得到的正则化称为 ElasticNet 正则化。因此,损失函数如下:
![](img/f6144fe6-9175-4d26-9e6b-f07fb0cd3212.png)
......@@ -456,7 +456,7 @@ For test data : MSE = 30.48501778, R2 = 0.64172244
现在让我们看看在 TensorFlow 中实现的这些正则化损失函数。我们将继续使用前面示例中使用的 Boston 数据集。
# 套索正则化
# LASSO 正则化
我们将 lasso 参数定义为值 0.8:
......@@ -465,7 +465,7 @@ lasso_param = tf.Variable(0.8, dtype=tf.float32)
lasso_loss = tf.reduce_mean(tf.abs(w)) * lasso_param
```
套索参数设置为零意味着没有正则化,因为该项变为零。正则化项的值越高,惩罚越高。以下是套索正则化回归的完整代码,用于训练模型以预测波士顿房屋定价:
LASSO 参数设置为零意味着没有正则化,因为该项变为零。正则化项的值越高,惩罚越高。以下是 LASSO 正则化回归的完整代码,用于训练模型以预测波士顿房屋定价:
下面的代码假定训练和测试数据集已按照前面的示例进行拆分。
......@@ -647,7 +647,7 @@ For test data : MSE = 30.64177132, R2 = 0.63988018
![](img/56fd975b-a22b-44b4-83aa-dc0d38ad77ce.png)
让我们来看看套索和岭正则化方法的组合。
让我们来看看 LASSO 和岭正则化方法的组合。
# ElasticNet 正则化
......
......@@ -6,7 +6,7 @@
* 感知机(人工神经元)
* 前馈神经网络
* **MultiLayer Perceptron****MLP** )用于图像分类
* **多层感知机****MLP**)用于图像分类
* 基于 TensorFlow 的 MLP 用于 MNIST 图像分类
* 基于 Keras 的 MLP 用于 MNIST 分类
* 基于 TFLearn 的 MLP 用于 MNIST 分类
......@@ -14,7 +14,7 @@
# 感知机
让我们了解神经网络的最基本构建块,**感知机,**也称为**人工神经元**。感知机的概念起源于 Frank Rosenblatt 于 1962 年的作品。
让我们了解神经网络的最基本构建块,**感知机**也称为**人工神经元**。感知机的概念起源于 Frank Rosenblatt 于 1962 年的作品。
您可能希望阅读以下工作来探索神经网络的起源:
......@@ -38,13 +38,13 @@ Frank Rosenblatt,神经动力学原理:感知器和脑机制理论,斯巴
![](img/6c2085db-a65d-495c-96b9-4524ba54eacf.png) Simple perceptron with weights and bias
到目前为止,神经元是一个线性函数。为了使这个神经元产生非线性决策边界,通过称为 **a** **ctiva** 或传递函数的非线性函数运行求和输出。有许多流行的激活函数可用:
到目前为止,神经元是一个线性函数。为了使这个神经元产生非线性决策边界,通过称为**激活**或传递函数的非线性函数运行求和输出。有许多流行的激活函数可用:
* `ReLU`**整流线性单元**,将值平滑到范围`(0, x)`
![](img/7538f31f-444e-4922-9d11-7ae37e375e4f.png)
* `sigmoid` **Sigmoid** 将值平滑到`(0, 1)`
* `sigmoid`**Sigmoid** 将值平滑到`(0, 1)`
![](img/5433180b-4099-4c59-ad7d-9ca67d6deff1.png)
......@@ -68,7 +68,7 @@ Frank Rosenblatt,神经动力学原理:感知器和脑机制理论,斯巴
![](img/ba2849d1-c6bf-42c2-a9d3-d50f9d49de08.png)Neural network with one neuron
我们连接神经元,使得一层的输出成为下一层的输入,直到最后一层的输出成为最终输出。这种神经网络被称为**前馈神经网络(FFNN)**。由于这些 FFNN 由连接在一起的神经元层组成,因此它们被称为 **MultiLayer** **感知机(MLP)****深度神经网络(DNN)**
我们连接神经元,使得一层的输出成为下一层的输入,直到最后一层的输出成为最终输出。这种神经网络被称为**前馈神经网络(FFNN)**。由于这些 FFNN 由连接在一起的神经元层组成,因此它们被称为**多层感知机(MLP)****深度神经网络(DNN)**
作为示例,下图中描绘的 MLP 具有三个特征作为输入:两个隐藏层,每个神经元包含五个神经元,一个输出 y。神经元完全连接到下一层的神经元。这些层也称为致密层或仿射层,并且这种模型也称为顺序模型。
......
# 六、使用 TensorFlow 和 Keras 的 RNN
在涉及有序数据序列的问题中,例如**时间序列预测****自然语言处理**,上下文对于预测输出非常有价值。可以通过摄取整个序列而不仅仅是最后一个数据点来确定这些问题的上下文。因此,先前的输出成为当前输入的一部分,并且当重复时,最后的输出结果是所有先前输入的结果以及最后一个输入。 **循环神经网络** **RNN** )架构是用于处理涉及序列的机器学习问题的解决方案。
在涉及有序数据序列的问题中,例如**时间序列预测****自然语言处理**,上下文对于预测输出非常有价值。可以通过摄取整个序列而不仅仅是最后一个数据点来确定这些问题的上下文。因此,先前的输出成为当前输入的一部分,并且当重复时,最后的输出结果是所有先前输入的结果以及最后一个输入。 **循环神经网络****RNN**)架构是用于处理涉及序列的机器学习问题的解决方案。
**循环神经网络** **RNN** )是一种用于处理顺序数据的专用神经网络架构。顺序数据可以是一段时间内的观察序列,如时间序列数据,或字符序列,单词和句子,如文本数据。
**循环神经网络****RNN**)是一种用于处理顺序数据的专用神经网络架构。顺序数据可以是一段时间内的观察序列,如时间序列数据,或字符序列,单词和句子,如文本数据。
标准神经网络的一个假设是,输入数据的排列方式是一个输入不依赖于另一个输入。然而,对于时间序列数据和文本数据,该假设不成立,因为序列中稍后出现的值通常受到之前出现的值的影响。
......@@ -15,7 +15,7 @@
* 简单的循环神经网络
* RNN 变种
* 长期短期内存网络
* 长期短期记忆网络
* 门控循环单元网络
* RNN 的 TensorFlow
* 适用于 RNN 的 Keras
......@@ -74,10 +74,10 @@ J. L. Elman, Finding Structure in Time, Cogn. Sci., vol. 14, no. 2, pp. 179–21
RNN 架构已经以多种方式扩展,以适应某些问题中的额外需求,并克服简单 RNN 模型的缺点。我们列出了下面的 RNN 架构的一些主要扩展。
* **双向** **RNN****BRNN** )用于输出依赖于序列的前一个和后一个元素的情况。 BRNN 通过堆叠两个 RNN(称为前向和后向层)来实现,输出是前向和后向层 RNN 的隐藏状态的结果。在前向层中,存储器状态 h 从时间步长`t`流向时间步长`t + 1`,并且在后向层中,存储器状态从时间步长`t`流出。到时间步`t-1`。两个层在时间步`t`时采用相同的输入`x[t]`,但它们在时间步`t`共同产生输出。
* **双向 RNN****BRNN**)用于输出依赖于序列的前一个和后一个元素的情况。 BRNN 通过堆叠两个 RNN(称为前向和后向层)来实现,输出是前向和后向层 RNN 的隐藏状态的结果。在前向层中,存储器状态 h 从时间步长`t`流向时间步长`t + 1`,并且在后向层中,存储器状态从时间步长`t`流出。到时间步`t-1`。两个层在时间步`t`时采用相同的输入`x[t]`,但它们在时间步`t`共同产生输出。
* **深双向 RNN****DBRNN** )通过添加多个层进一步扩展 BRNN。 BRNN 在时间维度上隐藏了层或单元。但是,通过堆叠 BRNN,我们可以在 DBRNN 中获得分层表示。其中一个显着差异是,在 BRNN 中,我们对同一层中的每个单元使用相同的参数,但在 DBRNN 中,我们对每个堆叠层使用不同的参数。
* **长短期记忆****LSTM** )网络通过使用涉及多个非线性函数而不是一个简单非线性函数的架构来扩展 RNN 隐藏状态。 LSTM 由称为 **单元** 的黑盒组成,取三个输入:时间`t-1`的工作记忆(`h[t-1]`),当前输入(`x[t]`)和时间`t-1`的长期记忆(`c[t-1]`),并产生两个输出:更新的工作记忆(`h[t]`)和长期记忆(`c[t]`)。单元使用称为门的功能来决定从内存中选择性地保存和擦除的内容。我们在下面的部分中详细描述了 LSTM。
* **深双向 RNN****DBRNN**)通过添加多个层进一步扩展 BRNN。 BRNN 在时间维度上隐藏了层或单元。但是,通过堆叠 BRNN,我们可以在 DBRNN 中获得分层表示。其中一个显着差异是,在 BRNN 中,我们对同一层中的每个单元使用相同的参数,但在 DBRNN 中,我们对每个堆叠层使用不同的参数。
* **长短期记忆****LSTM**)网络通过使用涉及多个非线性函数而不是一个简单非线性函数的架构来扩展 RNN 隐藏状态。 LSTM 由称为**单元**的黑盒组成,取三个输入:时间`t-1`的工作记忆(`h[t-1]`),当前输入(`x[t]`)和时间`t-1`的长期记忆(`c[t-1]`),并产生两个输出:更新的工作记忆(`h[t]`)和长期记忆(`c[t]`)。单元使用称为门的功能来决定从记忆中选择性地保存和擦除的内容。我们在下面的部分中详细描述了 LSTM。
阅读以下关于 LSTM 的研究论文,以获得有关 LSTM 起源的更多信息:
......@@ -85,7 +85,7 @@ RNN 架构已经以多种方式扩展,以适应某些问题中的额外需求
S. Hochreiter and J. Schmidhuber, Long Short-Term Memory, Neural Comput., vol. 9, no. 8, pp. 1735–1780, 1997.http://www.bioinf.jku.at/publications/older/2604.pdf
```
* **门控递归单元****GRU** )网络是 LSTM 的简化变体。 结合遗忘和输入的功能,在更简单的更新门中进行门控。它还将隐藏状态和单元状态组合成一个单一状态。因此,与 LSTM 相比,GRU 在计算上更便宜。 我们在下面的部分中详细描述了 GRU。
* **门控递归单元****GRU**)网络是 LSTM 的简化变体。 结合遗忘和输入的功能,在更简单的更新门中进行门控。它还将隐藏状态和单元状态组合成一个单一状态。因此,与 LSTM 相比,GRU 在计算上更便宜。 我们在下面的部分中详细描述了 GRU。
阅读以下研究论文以探索 GRU 的更多细节:
......@@ -99,9 +99,9 @@ J. Chung, C. Gulcehre, K. Cho, and Y. Bengio, Empirical Evaluation of Gated Recu
# LSTM 网络
当 RNN 在很长的数据序列上进行训练时,梯度往往变得非常大或非常小,它们会消失到几乎为零。 **长短期记忆** **LSTM** )网络通过添加用于控制对过去信息的访问的门,来解决消失/爆炸梯度问题。 LSTM 概念最初由 Hochreiter 和 Schmidhuber 在 1997 年引入。
当 RNN 在很长的数据序列上进行训练时,梯度往往变得非常大或非常小,它们会消失到几乎为零。 **长短期记忆****LSTM**)网络通过添加用于控制对过去信息的访问的门,来解决消失/爆炸梯度问题。 LSTM 概念最初由 Hochreiter 和 Schmidhuber 在 1997 年引入。
阅读以下关于LSTM的研究论文,以获得有关LSTM起源的更多信息:
阅读以下关于 LSTM 的研究论文,以获得有关 LSTM 起源的更多信息:
```
S. Hochreiter and J. Schmidhuber, Long Short-Term Memory, Neural Comput., vol. 9, no. 8, pp. 1735–1780, 1997. http://www.bioinf.jku.at/publications/older/2604.pdf
......@@ -109,10 +109,10 @@ S. Hochreiter and J. Schmidhuber, Long Short-Term Memory, Neural Comput., vol. 9
在 RNN 中,使用重复使用的学习函数`φ`的单个神经网络层,而在 LSTM 中,使用由四个主要函数组成的重复模块。构建 LSTM 网络的模块称为**单元**。 LSTM 单元通过选择性地学习或擦除信息,有助于在长序列通过时更有效地训练模型。组成单元的功能也称为门,因为它们充当传入和传出单元的信息的网守。
LSTM 模型有两种内存
LSTM 模型有两种记忆
* _**h**_(隐藏状态)表示的工作记忆
* _**c**_(单元状态)表示的长期记忆。
*`h`(隐藏状态)表示的工作记忆
*`c`(单元状态)表示的长期记忆。
单元状态或长期记忆仅在两个线性相互作用下从一个单元流向另一个单元。 LSTM 将信息添加到长期记忆中,或通过门从长期记忆中删除信息。
......@@ -146,7 +146,7 @@ LSTM 模型有两种内存:
![](img/b32dd2e9-bafa-41ae-ab11-0dfbd95f3a02.png)
输出门的功能是决定多少信息可用于更新工作内存
输出门的功能是决定多少信息可用于更新工作记忆
6. 接下来,工作记忆`h[t]`从长期记忆`c[t]`和焦点/注意力向量更新,如下式所示:
......@@ -156,9 +156,9 @@ LSTM 模型有两种内存:
# GRU 网络
LSTM 网络的计算成本很高,因此,研究人员发现了一种几乎同样有效的 RNN 配置,称为**门控递归单元** **GRU** )架构。
LSTM 网络的计算成本很高,因此,研究人员发现了一种几乎同样有效的 RNN 配置,称为**门控递归单元****GRU**)架构。
在 GRU 中,不使用工作和长期记忆,只使用一种记忆,用 _**h**_(隐藏状态)表示。 GRU 单元通过**复位****更新**门,将信息添加到此状态存储器,或从该状态存储器中删除信息。
在 GRU 中,不使用工作和长期记忆,只使用一种记忆,用`h`(隐藏状态)表示。 GRU 单元通过**复位****更新**门,将信息添加到此状态存储器,或从该状态存储器中删除信息。
下图描绘了 GRU 单元(说明如下图):
......@@ -210,23 +210,23 @@ J. Chung, C. Gulcehre, K. Cho, and Y. Bengio, Empirical Evaluation of Gated Recu
| **类** | **描述** |
| --- | --- |
| BasicRNNCell | 提供 RNN 单元的实现 |
| BasicLSTMCell | 提供 LSTM RNN 单元的实现,基于 <http://arxiv.org/abs/1409.2329> |
| LSTMCell | 提供 LSTM RNN 单元,基于 <http://deeplearning.cs.cmu.edu/pdfs/Hochreiter97_lstm.pdf>[https:// research.google.com/pubs/archive/43905.pdf](https://research.google.com/pubs/archive/43905.pdf) |
| GRUCell | 提供 GRU RNN 单元,基于 <http://arxiv.org/abs/1406.1078> |
| MultiRNNCell | 提供由连续连接的多个简单单元组成的 RNN 单元 |
| BasicLSTMCell | 提供 LSTM RNN 单元的实现,基于[这个页面](http://arxiv.org/abs/1409.2329) |
| LSTMCell | 提供 LSTM RNN 单元,基于[这个页面](http://deeplearning.cs.cmu.edu/pdfs/Hochreiter97_lstm.pdf)[这个页面](https://research.google.com/pubs/archive/43905.pdf) |
| GRUCell | 提供 GRU RNN 单元,基于[这个页面](http://arxiv.org/abs/1406.1078) |
| MultiRNNCell | 提供由连续连接的多个简单单元组成的 RNN 单元 |
`tf.contrib.rnn` 模块提供以下额外的类用于在 TensorFlow 中创建不同类型的单元:
| **类** | **描述** |
| --- | --- |
| LSTMBlockCell | 提供块 LSTM RNN 单元,基于 <http://arxiv.org/abs/1409.2329> |
| LSTMBlockFusedCell | 提供块融合 LSTM RNN 单元,基于 <http://arxiv.org/abs/1409.2329> |
| GLSTMCell | 根据 <https://arxiv.org/abs/1703.10722> 提供组 LSTM 单元 |
| GridLSTMCell | 提供网格 LSTM RNN 单元,基于 <http://arxiv.org/abs/1507.01526> |
| GRUBlockCell | 提供块 GRU RNN 单元,基于 <http://arxiv.org/abs/1406.1078> |
| LSTMBlockCell | 提供块 LSTM RNN 单元,基于[这个页面](http://arxiv.org/abs/1409.2329) |
| LSTMBlockFusedCell | 提供块融合 LSTM RNN 单元,基于[这个页面](http://arxiv.org/abs/1409.2329) |
| GLSTMCell | 根据[这个页面](https://arxiv.org/abs/1703.10722)提供组 LSTM 单元 |
| GridLSTMCell | 提供网格 LSTM RNN 单元,基于[这个页面](http://arxiv.org/abs/1507.01526) |
| GRUBlockCell | 提供块 GRU RNN 单元,基于[这个页面](http://arxiv.org/abs/1406.1078) |
| BidirectionalGridLSTMCell | 仅在频率上而不是在时间上提供双向网格 LSTM |
| NASCell | 提供神经架构搜索 RNN 单元,基于 <https://arxiv.org/abs/1611.01578> |
| UGRNNCell | 提供更新门 RNN 信元,基于 <https://arxiv.org/abs/1611.09913> |
| NASCell | 提供神经架构搜索 RNN 单元,基于[这个页面](https://arxiv.org/abs/1611.01578) |
| UGRNNCell | 提供更新门 RNN 信元,基于[这个页面](https://arxiv.org/abs/1611.09913) |
# TensorFlow RNN 模型构建类
......@@ -264,7 +264,7 @@ TensorFlow 还提供包装其他单元类的类:
**有状态模型**
Keras 复现层还支持 RNN 模型,可在批次之间保存状态。您可以通过将`stateful`参数作为`True`传递来创建有状态 RNN,LSTM 或 GRU 模型。对于有状态模型,为输入指定的批量大小必须是固定值。在有状态模型中,从训练批次中学到的隐藏状态将重新用于下一批。如果您想在训练期间的某个时刻重置内存,可以通过调用`model.reset_states()``layer.reset_states()`函数使用额外的代码来完成。
Keras 复现层还支持 RNN 模型,可在批次之间保存状态。您可以通过将`stateful`参数作为`True`传递来创建有状态 RNN,LSTM 或 GRU 模型。对于有状态模型,为输入指定的批量大小必须是固定值。在有状态模型中,从训练批次中学到的隐藏状态将重新用于下一批。如果您想在训练期间的某个时刻重置记忆,可以通过调用`model.reset_states()``layer.reset_states()`函数使用额外的代码来完成。
我们将在下一章中看到使用 Keras 构建 RNN 的示例。
......@@ -277,7 +277,7 @@ RNN 更频繁使用的一些应用领域如下:
* **自然语言模型**:RNN 模型已用于 n 自然语言处理(NLP),用于自然语言理解和自然语言生成任务。在 NLP 中,RNN 模型被给予一系列单词并且它预测另一个单词序列。因此,训练的模型可用于生成单词序列,称为文本生成的字段。例如,生成故事和剧本。 NLP 的另一个领域是语言翻译,其中给定一种语言的一系列单词,该模型预测另一种语言的单词序列。
* **语音和语音识别**:RNN 模型非常适用于构建模拟音频数据的模型。在语音识别中,RNN 模型被给予音频数据并且它预测一系列语音片段。它可用于训练模型以识别语音命令,甚至用于与基于语音的聊天机器人的对话。
* **图像/视频描述或字幕生成**:RNN 模型可与 CNN 结合使用,以生成图像和视频中找到的元素的描述。这些描述也可用于生成图像和视频的标题。
* **TimeSeries 数据**:最重要的是,RNN 对 TimeSeries 数据非常有用。大多数传感器和系统生成时间顺序很重要的数据。 RNN 模型非常适合于查找模式和预测此类数据。
* **时间序列数据**:最重要的是,RNN 对时间序列数据非常有用。大多数传感器和系统生成时间顺序很重要的数据。 RNN 模型非常适合于查找模式和预测此类数据。
通过此链接了解有关 RNN 的更多信息:
......
......@@ -24,7 +24,7 @@
# 航空公司乘客数据集
为了简洁起见,我们选择了一个名为国际航空公司乘客(航空通票)的非常小的数据集。该数据包含从 1949 年 1 月到 1960 年 12 月的每月总乘客数量。数据集中的数字是指数千的数量。该数据集最初由 Box 和 Jenkins 在 1976 年的工作中使用。它作为 **TimeSeries 数据集库****TSDL** )的一部分与 Rob Hyndman 教授的各种其他时间序列数据集一起收集。在澳大利亚莫纳什大学。后来,TSDL 被转移到 [DataMarket](http://datamarket.com)
为了简洁起见,我们选择了一个名为国际航空公司乘客(航空通票)的非常小的数据集。该数据包含从 1949 年 1 月到 1960 年 12 月的每月总乘客数量。数据集中的数字是指数千的数量。该数据集最初由 Box 和 Jenkins 在 1976 年的工作中使用。它作为 **时间序列数据集库****TSDL**)的一部分与 Rob Hyndman 教授的各种其他时间序列数据集一起收集。在澳大利亚莫纳什大学。后来,TSDL 被转移到 [DataMarket](http://datamarket.com)
[您可以从此链接下载数据集](https://datamarket.com/data/set/22u3/international-airline-passengers-monthly-totals-in-thousands-jan-49-dec-60)
......@@ -531,5 +531,5 @@ Test Score: 92.75 RMSE
时间序列数据是基于序列的数据,因此 RNN 模型是从时间序列数据中学习的相关架构。在本章中,您学习了如何使用 TensorFlow(一个低级库)和 Keras(一个高级库)创建不同类型的 RNN 模型。我们只介绍了 SimpleRNN,LSTM 和 GRU,但您应该探索可以使用 TensorFlow 和 Keras 创建的许多其他 RNN 变体。
在下一章中,我们将使用当前章节和前几章中构建的基础为各种**自然语言处理** **NLP** )任务创建文本数据的 RNN 模型。
在下一章中,我们将使用当前章节和前几章中构建的基础为各种**自然语言处理****NLP**)任务创建文本数据的 RNN 模型。
# 八、使用 TensorFlow 和 Keras 的文本数据的 RNN
文本数据可以被视为一系列字符,单词,句子或段落。 **循环神经网络** **RNN** )已被证明是非常有用的序列神经网络结构。为了将神经网络模型应用于**自然语言处理****NLP** )任务,文本被视为单词序列。事实证明,这对于 NLP 任务非常成功,例如:
文本数据可以被视为一系列字符,单词,句子或段落。 **循环神经网络****RNN**)已被证明是非常有用的序列神经网络结构。为了将神经网络模型应用于**自然语言处理****NLP**)任务,文本被视为单词序列。事实证明,这对于 NLP 任务非常成功,例如:
* 问题回答
* 会话智能体或聊天机器人
......@@ -40,8 +40,8 @@ NLP 与 TensorFlow 深度学习技术是一个广阔的领域,很难在一章
word2vec 系列模型使用两种架构构建:
* **连续词汇**:训练模型以学习给定上下文词的中心词的概率分布。因此,给定一组上下文单词,模型以您在高中语言课程中所做的填空方式预测中心单词。 CBOW 体系结构最适用于具有较小词汇表的数据集。
* **Skip-gram** :训练模型以学习给定中心词的上下文词的概率分布。因此,给定一个中心词,模型以您在高中语言课程中完成的句子方式预测语境词。
* **CBOW**:训练模型以学习给定上下文词的中心词的概率分布。因此,给定一组上下文单词,模型以您在高中语言课程中所做的填空方式预测中心单词。 CBOW 体系结构最适用于具有较小词汇表的数据集。
* **Skip-gram**:训练模型以学习给定中心词的上下文词的概率分布。因此,给定一个中心词,模型以您在高中语言课程中完成的句子方式预测语境词。
例如,让我们考虑一下这句话:
......@@ -82,7 +82,7 @@ Pennington, J., R. Socher, and C. Manning. GloVe: Global Vectors for Word Repres
我们将使用流行的 PTB 和 text8 数据集进行演示。
**Penn Treebank****PTB** )数据集是在 UPenn 进行的[ Penn Treebank 项目](https://catalog.ldc.upenn.edu/ldc99t42)的副产品。 PTB 项目团队在华尔街日报三年的故事中提取了大约一百万字,并以 Treebank II 风格对其进行了注释。 PTB 数据集有两种形式: 基本示例,大小约为 35 MB, 高级示例,大小约为 235 MB。我们将使用由 929K 字组成的简单数据集进行训练,73K 字用于验证,82K 字用于测试。建议您浏览高级数据集。有关 PTB 数据集的更多详细信息,[请访问此链接](http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz)
**PennTreebank****PTB**)数据集是在 UPenn 进行的 [Penn Treebank 项目](https://catalog.ldc.upenn.edu/ldc99t42)的副产品。 PTB 项目团队在华尔街日报三年的故事中提取了大约一百万字,并以 Treebank II 风格对其进行了注释。 PTB 数据集有两种形式: 基本示例,大小约为 35 MB, 高级示例,大小约为 235 MB。我们将使用由 929K 字组成的简单数据集进行训练,73K 字用于验证,82K 字用于测试。建议您浏览高级数据集。有关 PTB 数据集的更多详细信息,[请访问此链接](http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz)
[可以从此链接下载 PTB 数据集](http://www.fit.vutbr.cz/~imikolov/rnnlm/rnn-rt07-example.tar.gz)
......@@ -342,7 +342,7 @@ TensorFlow documentation describes the NCE in further detail: [https://www.tens
总之,基于 softmax 损失的模型在计算上是昂贵的,因为在整个词汇表中计算概率分布并对其进行归一化。基于 NCE 损耗的模型将其减少为二分类问题,即从噪声样本中识别真实样本。
NCE 的基本数学细节可以在以下 NIPS 论文中找到:_学习词嵌入有效地与噪声对比估计_,作者 Andriy Mnih 和 Koray Kavukcuoglu。[该论文可从此链接获得](http://papers.nips.cc/paper/5165-learning-word-embeddings-efficiently-with-noise-contrastive-estimation.pdf)
NCE 的基本数学细节可以在以下 NIPS 论文中找到:_ 学习词嵌入有效地与噪声对比估计 _,作者 Andriy Mnih 和 Koray Kavukcuoglu。[该论文可从此链接获得](http://papers.nips.cc/paper/5165-learning-word-embeddings-efficiently-with-noise-contrastive-estimation.pdf)
`tf.nn.nce_loss()`函数在评估计算损耗时自动生成负样本:参数`num_sampled`设置为等于负样本数(`n_negative_samples`)。此参数指定要绘制的负样本数。
......@@ -928,7 +928,7 @@ accuracy = tf.reduce_mean(tf.cast(n_correct_pred, tf.float32))
1. 最后,我们训练模型 1000 个周期,并每 100 个周期打印结果。此外,每 100 个周期,我们从上面描述的种子字符串打印生成的文本。
LSTM 和 RNN 网络需要对大量数据集进行大量周期的训练,以获得更好的结果。 请尝试加载完整的数据集并在计算机上运行 50,00080,000 个周期,并使用其他超参数来改善结果。
LSTM 和 RNN 网络需要对大量数据集进行大量周期的训练,以获得更好的结果。 请尝试加载完整的数据集并在计算机上运行 50,00080,000 个周期,并使用其他超参数来改善结果。
```py
n_epochs = 1000
......
# 九、使用 TensorFlow 和 Keras 的 CNN
**卷积神经网络** **CNN** )是一种特殊的前馈神经网络,在其架构中包含卷积和汇聚层。也称为 ConvNets,CNN 架构的一般模式是按以下顺序包含这些层:
**卷积神经网络****CNN**)是一种特殊的前馈神经网络,在其架构中包含卷积和汇聚层。也称为 ConvNets,CNN 架构的一般模式是按以下顺序包含这些层:
1. 完全连接的输入层
2. 卷积,池化和完全连接层的多种组合
......@@ -64,9 +64,9 @@ N_STRIDES = [1,1]
对于具有额外深度尺寸的三维张量,您可以将前面的算法视为应用于深度维度中的每个层。将卷积应用于 3D 张量的输出也是 2D 张量,因为卷积运算添加了三个通道。
**大步**
**步幅**
数组 N_STRIDES 中的 **步长** 是您想要将内核滑过的行或列的数字。在我们的例子中,我们使用了 1 的步幅。如果我们使用更多的步幅,那么特征图的大小将根据以下等式进一步减小:
数组 N_STRIDES 中的**步长**是您想要将内核滑过的行或列的数字。在我们的例子中,我们使用了 1 的步幅。如果我们使用更多的步幅,那么特征图的大小将根据以下等式进一步减小:
![](img/6db06a54-de55-4fc3-a0c5-485fcf4b35b2.png)
......@@ -100,7 +100,7 @@ tf.nn.conv2d(
`input``filter`表示形状`[batch_size, input_height, input_width, input_depth]`的数据张量和形状`[filter_height, filter_width, input_depth, output_depth]`的核张量。内核张量中的 `output_depth`表示应该应用于输入的内核数量。 `strides`张量表示每个维度中要滑动的单元数。如上所述,`padding`是有效的或相同的。
[您可以在此链接中找到有关TensorFlow中可用卷积操作的更多信息](https://www.tensorflow.org/api_guides/python/nn#Convolution)
[您可以在此链接中找到有关 TensorFlow 中可用卷积操作的更多信息](https://www.tensorflow.org/api_guides/python/nn#Convolution)
[您可以在此链接中找到有关 Keras 中可用卷积层的更多信息](https://keras.io/layers/convolutional/)
......
......@@ -15,7 +15,7 @@
自编码器架构可以在各种配置中找到,例如简单自编码器,稀疏自编码器,去噪自编码器和卷积自编码器。
* **简单自编码器:**在简单的自编码器中,与输入相比,隐藏层具有较少数量的节点或神经元。例如,在 MNIST 数据集中,784 个特征的输入可以连接到 512 个节点的隐藏层或 256 个节点,其连接到 784 特征输出层。因此,在训练期间,仅由 256 个节点学习 784 个特征。 简单自编码器也称为欠完整自编码器。
* **简单自编码器**在简单的自编码器中,与输入相比,隐藏层具有较少数量的节点或神经元。例如,在 MNIST 数据集中,784 个特征的输入可以连接到 512 个节点的隐藏层或 256 个节点,其连接到 784 特征输出层。因此,在训练期间,仅由 256 个节点学习 784 个特征。 简单自编码器也称为欠完整自编码器。
简单的自编码器可以是单层或多层。通常,单层自编码器在生产中表现不佳。多层自编码器具有多个隐藏层,分为编码器和解码器分组。编码器层将大量特征编码为较少数量的神经元,然后解码器层将学习的压缩特征解码回原始特征或减少数量的特征。多层自编码器被称为**栈式自编码器** 。
* **稀疏自编码器**:在稀疏自编码器中,添加正则化项作为惩罚,因此,与简单自编码器相比,表示变得更稀疏。
......
......@@ -5,7 +5,7 @@ TensorFlow 模型在开发环境中经过训练和验证。一旦发布,它们
要在生产中提供 TensorFlow 模型,需要在离线训练后保存它们,然后在生产环境中恢复经过训练的模型。 TensorFlow 模型在保存时包含以下文件:
* **元图**:元图表示图的协议缓冲区定义。元图保存在具有`.meta`扩展名的文件中。
* **checkpoint** :检查点代表各种变量的值。检查点保存在两个文件中:一个带有`.index`扩展名,另一个带有`.data-00000-of-00001`扩展名。
* **检查点**:检查点代表各种变量的值。检查点保存在两个文件中:一个带有`.index`扩展名,另一个带有`.data-00000-of-00001`扩展名。
在本章中,我们将学习各种保存和恢复模型的方法以及如何使用 TF 服务来提供模型。我们将使用 MNIST 示例来简化操作并涵盖以下主题:
......@@ -225,14 +225,14 @@ output=[ 0.30000001 0.60000002 0.90000004 1.20000005]
TensorFlow 服务(TFS)是一种高表现服务器架构,用于为生产中的机器学习模型提供服务。它提供与使用 TensorFlow 构建的模型的开箱即用集成。
在 TFS 中,**模型**由一个或多个**可服务**组成。 servable 用于执行计算,例如:
在 TFS 中,**模型**由一个或多个**可服务对象**组成。 可服务对象用于执行计算,例如:
* 用于嵌入查找的查找表
* 单个模型返回预测
* 一组模型返回一组预测
* 查找表或模型的分片
**管理器** 组件管理 servables 的整个生命周期,包括加载/卸载 servable 并提供 servable
**管理器**组件管理可服务对象的整个生命周期,包括加载/卸载可服务对象并提供可服务对象
[TensorFlow 服务的内部架构和工作流程在此链接中描述](https://www.tensorflow.org/serving/architecture_overview)
......@@ -872,9 +872,9 @@ conjure-up 2.3.1 from 'canonical' installed
$ conjure-up kubernetes
```
1. 从法术列表中选择 **Kubernetes Core**
2. 从可用云列表中选择 **localhost 。**
3. 从网络列表中选择 **lxbr0 网桥。**
1. 从法术列表中选择`Kubernetes Core`
2. 从可用云列表中选择`localhost`
3. 从网络列表中选择`lxbr0`网桥。
4. 提供选项的 sudo 密码:将 kubectl 和 kubefed 客户端程序下载到本地主机。
5. 在下一个屏幕中,它会要求选择要安装的应用。安装其余五个应用。
......
......@@ -13,11 +13,11 @@
* COCO 动物数据集和预处理
* 使用 TensorFlow 中预训练的 VGG16 进行图像分类
* TensorFlow 中的图像预处理,用于预训练的 VGG16
* 在 TensorFlow 中使用 **再训练** VGG16 进行图像分类
* 在 TensorFlow 中使用**再训练的** VGG16 进行图像分类
* 使用 Keras 中预训练的 VGG16 进行图像分类
* 使用 **再训练** VGG16 在 Keras 中进行图像分类
* 使用**再训练的** VGG16 在 Keras 中进行图像分类
* 使用 TensorFlow 中的 Inception v3 进行图像分类
*[TensorFlow]中使用 **再训练** Inception v3 进行图像分类
* TensorFlow 中使用**再训练的** Inception v3 进行图像分类
# ImageNet 数据集
......@@ -25,7 +25,7 @@
ImageNet 是根据 WordNet 层次结构组织的图像数据集。WordNet 中的每个有意义的概念,可能由多个单词或单词短语描述,称为同义词集或 synset。
ImageNet 有大约 100 K 个同义词集,平均每个同义词集约有 1,000 个人工注释图像。 ImageNet 仅存储对图像的引用,而图像存储在互联网上的原始位置。在深度学习论文中,ImageNet-1K 是指作为 ImageNet 的**大规模视觉识别挑战** **ILSVRC** )的一部分发布的数据集,用于将数据集分类为 1,000 个类别:
ImageNet 有大约 100 K 个同义词集,平均每个同义词集约有 1,000 个人工注释图像。 ImageNet 仅存储对图像的引用,而图像存储在互联网上的原始位置。在深度学习论文中,ImageNet-1K 是指作为 ImageNet 的**大规模视觉识别挑战****ILSVRC**)的一部分发布的数据集,用于将数据集分类为 1,000 个类别:
可以在以下 URL 找到 1,000 个挑战类别:
......@@ -113,7 +113,7 @@ inet.load_data(n_classes=1000)
在上表中,Top-1 和 Top-5 指标指的是模型在 ImageNet 验证数据集上的表现。
Google Research 最近发布了一种名为 MobileNets 的新模型。 MobileNets 采用移动优先策略开发,牺牲了低资源使用的准确性。 MobileNets 旨在消耗低功耗并提供低延迟,以便在移动和嵌入式设备上提供更好的体验。谷歌为 MobileNet 模型提供了 16 个预训练好的检查点文件,每个模型提供不同数量的参数和**乘法累加** **MAC** )。 MAC 和参数越高,资源使用和延迟就越高。因此,您可以在更高的准确性与更高的资源使用/延迟之间进行选择。
Google Research 最近发布了一种名为 MobileNets 的新模型。 MobileNets 采用移动优先策略开发,牺牲了低资源使用的准确性。 MobileNets 旨在消耗低功耗并提供低延迟,以便在移动和嵌入式设备上提供更好的体验。谷歌为 MobileNet 模型提供了 16 个预训练好的检查点文件,每个模型提供不同数量的参数和**乘法累加****MAC**)。 MAC 和参数越高,资源使用和延迟就越高。因此,您可以在更高的准确性与更高的资源使用/延迟之间进行选择。
| **模型检查点** | **百万 MAC** | **百万参数** | **Top-1 准确率** | **Top-5 准确率** |
| --- | --- | --- | --- | --- |
......@@ -140,13 +140,13 @@ Google Research 最近发布了一种名为 MobileNets 的新模型。 MobileNet
<https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet_v1.md>
[https://arxiv.org/pdf/1704.04861.pdf.](https://arxiv.org/pdf/1704.04861.pdf)
<https://arxiv.org/pdf/1704.04861.pdf>
# 再训练或微调模型
在像 ImageNet 这样的大型和多样化数据集上训练的模型能够检测和捕获一些通用特征,如曲线,边缘和形状。其中一些特征很容易适用于其他类型的数据集。因此,在迁移学习中,我们采用这样的通用模型,并使用以下一些技术来微调或再训练它们到我们的数据集:
* **废除并替换最后一层:** m 通常的做法是删除最后一层并添加与我们的数据集匹配的新分类层。例如,ImageNet 模型使用 1,000 个类别进行训练,但我们的 COCO 动物数据集只有 8 个类别,因此我们删除了 softmax 层,该层使用 softmax 层生成 1,000 个类别的概率,该层生成 8 个类别的概率。通常,当新数据集几乎与训练模型的数据集类似时使用此技术,因此仅需要再训练最后一层。
* **废除并替换最后一层** m 通常的做法是删除最后一层并添加与我们的数据集匹配的新分类层。例如,ImageNet 模型使用 1,000 个类别进行训练,但我们的 COCO 动物数据集只有 8 个类别,因此我们删除了 softmax 层,该层使用 softmax 层生成 1,000 个类别的概率,该层生成 8 个类别的概率。通常,当新数据集几乎与训练模型的数据集类似时使用此技术,因此仅需要再训练最后一层。
* **冻结前几层**:另一种常见做法是冻结前几层,以便仅使用新数据集更新最后未冻结层的权重。我们将看到一个例子,我们冻结前 15 层,同时只再训练最后 10 层。通常,当新数据集与训练模型的数据集非常不相似时使用此技术,因此不仅需要训练最后的层。
* **调整超参数**:您还可以在再训练之前调整超参数,例如更改学习率或尝试不同的损失函数或不同的优化器。
......
......@@ -427,9 +427,9 @@ Policy:policy_logic, Min reward:24.0, Max reward:63.0, Average reward:41.94
如果状态 s 处的智能体选择动作 a,则 Q 函数基本上将状态和动作对映射到表示预期总奖励的实数。
# RL 算法的探索与开发
# RL 算法的探索与利用
在没有模型的情况下,智能体在每一步都要探索或利用。 **探索**意味着智能体选择一个未知动作来找出奖励和模型。 **剥削**意味着智能体选择最知名的行动来获得最大奖励。如果智能体总是决定利用它,那么它可能会陷入局部最优值。因此,有时智能体会绕过学到的策略来探索未知的行为。同样,如果智能体总是决定探索,那么它可能无法找到最优策略。因此,在探索和开发之间取得平衡非常重要。在我们的代码中,我们通过使用概率`p`来选择随机动作和概率`1-p`来选择最优动作来实现这一点。
在没有模型的情况下,智能体在每一步都要探索或利用。 **探索**意味着智能体选择一个未知动作来找出奖励和模型。 **利用**意味着智能体选择最知名的行动来获得最大奖励。如果智能体总是决定利用它,那么它可能会陷入局部最优值。因此,有时智能体会绕过学到的策略来探索未知的行为。同样,如果智能体总是决定探索,那么它可能无法找到最优策略。因此,在探索和利用之间取得平衡非常重要。在我们的代码中,我们通过使用概率`p`来选择随机动作和概率`1-p`来选择最优动作来实现这一点。
# V 函数(模型可用时学习优化)
......@@ -450,7 +450,7 @@ Policy:policy_logic, Min reward:24.0, Max reward:63.0, Average reward:41.94
![](img/607cbf22-522c-4ffd-adc7-8f4ba95fe4ea.png)
`V`是值,`R`是奖励,`r`是折扣率。
**V 函数和 Q 函数之间的关系:**
**V 函数和 Q 函数之间的关系**
`V*(s)`是状态`s`下的最优值函数,其给出最大奖励,并且`Q*(s,a)`是状态`s`下的最佳 Q 函数,其通过选择动作`a`给出最大期望奖励。 因此,`V*(s)`是所有可能动作中所有最优 Q 函数`Q*(s,a)`的最大值:
......
......@@ -2,7 +2,7 @@
生成模型被训练以生成与他们训练的数据类似的更多数据,并且训练对抗模型以通过提供对抗性示例来区分真实数据和假数据。
**生成性对抗网络** **GAN** )结合了两种模型的特征。 GAN 有两个组成部分:
**生成性对抗网络****GAN**)结合了两种模型的特征。 GAN 有两个组成部分:
* 学习如何生成类似数据的生成模型
* 一种判别模型,用于学习如何区分真实数据和生成数据(来自生成模型)
......@@ -11,7 +11,7 @@ GAN 已成功应用于各种复杂问题,例如:
* 从低分辨率图像生成照片般逼真的分辨率图像
* 合成文本中的图像
* 风格
* 风格
* 完成不完整的图像和视频
在本章中,我们将学习以下主题,以学习如何在 TensorFlow 和 Keras 中实现 GAN:
......@@ -47,7 +47,7 @@ GAN 已成功应用于各种复杂问题,例如:
应用中使用的其他几种衍生产品及其原始论文,如文本到图像,图像合成,图像标记,样式转移和图像转移等,如下表所示:
| **GAN 衍生物** | **原始文件** | **演示申请** |
| **GAN 衍生物** | **原始文件** | **示例应用** |
| --- | --- | --- |
| StackGAN | <https://arxiv.org/abs/1710.10916> | 文字到图像 |
| StackGAN ++ | <https://arxiv.org/abs/1612.03242> | 逼真的图像合成 |
......@@ -55,11 +55,11 @@ GAN 已成功应用于各种复杂问题,例如:
| HR-DCGAN | <https://arxiv.org/abs/1711.06491> | 高分辨率图像合成 |
| 有条件的 GAN | <https://arxiv.org/abs/1411.1784> | 图像标记 |
| InfoGAN | <https://arxiv.org/abs/1606.03657> | 风格识别 |
| Wasserstein GAN | <https://arxiv.org/abs/1701.07875><https://arxiv.org/abs/1704.00028> | 图像生成 |
| Wasserstein GAN | <https://arxiv.org/abs/1701.07875> <https://arxiv.org/abs/1704.00028> | 图像生成 |
| 耦合 GAN | <https://arxiv.org/abs/1606.07536> | 图像转换,域适应 |
| BEGAN | <https://arxiv.org/abs/1703.10717> | Image Generation |
| DiscoGAN | <https://arxiv.org/abs/1703.05192> | 风格移 |
| CycleGAN | <https://arxiv.org/abs/1703.10593> | Style Transfer |
| BEGAN | <https://arxiv.org/abs/1703.10717> | 图像合成 |
| DiscoGAN | <https://arxiv.org/abs/1703.05192> | 风格移 |
| CycleGAN | <https://arxiv.org/abs/1703.10593> | 风格迁移 |
让我们练习使用 MNIST 数据集创建一个简单的 GAN。在本练习中,我们将使用以下函数将 MNIST 数据集标准化为介于[-1,+ 1]之间:
......
......@@ -13,8 +13,8 @@
为了在多个设备或节点上分发单个模型的训练,有以下策略:
* **模型并行:**将模型划分为多个子图,并将单独的图放在不同的节点或设备上。子图执行计算并根据需要交换变量。
* **数据并行:**将数据分组并在多个节点或设备上运行相同的模型,并在主节点上组合参数。因此,工作节点在批量数据上训练模型并将参数更新发送到主节点,也称为参数服务器。
* **模型并行**将模型划分为多个子图,并将单独的图放在不同的节点或设备上。子图执行计算并根据需要交换变量。
* **数据并行**将数据分组并在多个节点或设备上运行相同的模型,并在主节点上组合参数。因此,工作节点在批量数据上训练模型并将参数更新发送到主节点,也称为参数服务器。
![](img/997df543-69ec-44f2-afb4-1b0da5d0dca6.png)
......@@ -287,7 +287,7 @@ with sv.prepare_or_wait_for_session(server.target) as mts:
在启动参数服务器时,我们得到以下输出:
```py
$ python3 ch-15_mnist_dist_async.py --job_name='ps' --task_index=**0**
$ python3 ch-15_mnist_dist_async.py --job_name='ps' --task_index=0
I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 0 with properties:
name: Quadro P5000 major: 6 minor: 1 memoryClockRate(GHz): 1.506
pciBusID: 0000:01:00.0
......@@ -304,7 +304,7 @@ I tensorflow/core/distributed_runtime/rpc/grpc_server_lib.cc:324] Started server
工作器 1 的输出:
```py
$ python3 ch-15_mnist_dist_async.py --job_name='worker' --task_index=**0**
$ python3 ch-15_mnist_dist_async.py --job_name='worker' --task_index=0
I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 0 with properties:
name: Quadro P5000 major: 6 minor: 1 memoryClockRate(GHz): 1.506
pciBusID: 0000:01:00.0
......@@ -326,7 +326,7 @@ worker=0, final accuracy = 0.8865000009536743
工作器 2 的输出:
```py
$ python3 ch-15_mnist_dist_async.py --job_name='worker' --task_index=**1**
$ python3 ch-15_mnist_dist_async.py --job_name='worker' --task_index=1
I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 0 with properties:
name: Quadro P5000 major: 6 minor: 1 memoryClockRate(GHz): 1.506
pciBusID: 0000:01:00.0
......@@ -348,7 +348,7 @@ worker=1, final accuracy = 0.8866000175476074
工作器 3 的输出:
```py
$ python3 ch-15_mnist_dist_async.py --job_name='worker' --task_index=**2**
$ python3 ch-15_mnist_dist_async.py --job_name='worker' --task_index=2
I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 0 with properties:
name: Quadro P5000 major: 6 minor: 1 memoryClockRate(GHz): 1.506
pciBusID: 0000:01:00.0
......
......@@ -121,7 +121,7 @@ def nativeBuildSystem = 'none'
Android 模拟器中的 TF 示例应用程序
[您还可以按照此链接中的说明使用 Bazel或 Cmake 从源构建整个演示应用程序](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android)
[您还可以按照此链接中的说明使用 Bazel 或 Cmake 从源构建整个演示应用程序](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android)
# iOS 应用中的 TF Mobile
......@@ -137,7 +137,7 @@ target 'Name-Of-Your-Project'
1. 运行`pod install`命令下载并安装 TensorFlow 实验舱。
2. 运行`myproject.xcworkspace`命令打开工作区,以便将预测代码添加到应用逻辑中。
要为iOS项目创建自己的TensorFlow二进制文件,请按照[此链接中的说明](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/ios)
要为 iOS 项目创建自己的 TensorFlow 二进制文件,请按照[此链接中的说明](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/ios)
在 iOS 项目中配置 TF 库后,可以通过以下四个步骤调用 TF 模型:
......@@ -216,7 +216,7 @@ $ open tf_simple_example.xcworkspace
在 TF Lite 中使用模型的工作流程如下:
1. **获取模型:**您可以训练自己的模型或选择可从不同来源获得的预训练模型,并按原样使用预训练或使用您自己的数据再训练,或在修改某些部分后再训练该模型。只要您在文件中使用扩展名为.pb 或.pbtxt 的训练模型,就可以继续执行下一步。我们在前面的章节中学习了如何保存模型。
1. **获取模型**您可以训练自己的模型或选择可从不同来源获得的预训练模型,并按原样使用预训练或使用您自己的数据再训练,或在修改某些部分后再训练该模型。只要您在文件中使用扩展名为.pb 或.pbtxt 的训练模型,就可以继续执行下一步。我们在前面的章节中学习了如何保存模型。
2. **检查模型**:模型文件只包含图的结构,因此需要保存检查点文件。检查点文件包含模型的序列化变量,例如权重和偏差。我们在前面的章节中学习了如何保存检查点。
3. **冻结模型**:合并检查点和模型文件,也称为冻结图。 TensorFlow 为此步骤提供`freeze_graph`工具,可以按如下方式执行:
......
......@@ -514,7 +514,7 @@ library(tfruns)
training_run('mnist_model.R')
```
训练完成后,将自动显示显示运行摘要的窗口。我们从`tfruns` GitHub 仓库( [https://github.com/rstudio/tfruns/blob/master/inst/examples/mnist_mlp/mnist_mlp]获得的`mnist_mlp.R`窗口中获得以下输出。 R](https://github.com/rstudio/tfruns/blob/master/inst/examples/mnist_mlp/mnist_mlp.R)
训练完成后,将自动显示显示运行摘要的窗口。我们从[`tfruns` GitHub 仓库](https://github.com/rstudio/tfruns/blob/master/inst/examples/mnist_mlp/mnist_mlp)获得的[`mnist_mlp.R`](https://github.com/rstudio/tfruns/blob/master/inst/examples/mnist_mlp/mnist_mlp.R)窗口中获得以下输出
![](img/3b4b915f-a80e-4fb6-a420-fbd44e79eaa3.png)tfruns visualization of the model run
......
# 十九、张量处理单元
**张量处理单元** **TPU** )是**专用集成电路****ASIC** ),它实现了针对计算要求而优化的硬件电路深度神经网络。 TPU 基于**复杂指令集计算机****CISC** )指令集,该指令集实现用于训练深度神经网络的复杂任务的高级指令。 TPU 架构的核心在于优化矩阵运算的脉动数组。
**张量处理单元****TPU**)是**专用集成电路****ASIC**),它实现了针对计算要求而优化的硬件电路深度神经网络。 TPU 基于**复杂指令集计算机****CISC**)指令集,该指令集实现用于训练深度神经网络的复杂任务的高级指令。 TPU 架构的核心在于优化矩阵运算的脉动数组。
![](img/1dc1da7c-6209-49fc-b670-698bcc3c4d42.png)The Architecture of TPUImage from: https://cloud.google.com/blog/big-data/2017/05/images/149454602921110/tpu-15.png
TensorFlow 提供了一个编译器和软件堆栈,可将 API 调用从 TensorFlow 图转换为 TPU 指令。以下框图描述了在 TPU 堆栈顶部运行的 TensorFlow 模型的体系结构:
![](img/d57598de-e922-4cfe-941c-883553bf35e0.png)Image from: https://cloud.google.com/blog/big-data/2017/05/images/149454602921110/tpu-2.pngFor more information on the TPU architecture, read the blog at the following link: [https://cloud.google.com/blog/big-data/2017/05/an-in-depth-look-at-googles-first-tensor-processing-unit-tpu.](https://cloud.google.com/blog/big-data/2017/05/an-in-depth-look-at-googles-first-tensor-processing-unit-tpu)
![](img/d57598de-e922-4cfe-941c-883553bf35e0.png)
图像来自[这个链接](https://cloud.google.com/blog/big-data/2017/05/images/149454602921110/tpu-2.png)。TPU 架构的更多信息,阅读[博客](https://cloud.google.com/blog/big-data/2017/05/an-in-depth-look-at-googles-first-tensor-processing-unit-tpu)
TPU 的 TensorFlow API 位于`tf.contrib.tpu`模块中。为了在 TPU 上构建模型,使用以下三个 TPU 特定的 TensorFlow 模块:
......@@ -16,7 +18,7 @@ TPU 的 TensorFlow API 位于`tf.contrib.tpu`模块中。为了在 TPU 上构建
例如,以下代码使用 TF Estimator API 为 TPU 上的 MNIST 数据集构建 CNN 模型:
以下代码改编自 [https://github.com/tensorflow/tpu-demos/blob/master/cloud_tpu/models/mnist/mnist.py.](https://github.com/tensorflow/tpu-demos/blob/master/cloud_tpu/models/mnist/mnist.py)
以下代码改编自[这个页面](https://github.com/tensorflow/tpu-demos/blob/master/cloud_tpu/models/mnist/mnist.py)
```py
import tensorflow as tf
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册