提交 c6f87e16 编写于 作者: W wizardforcel

2020-08-03 22:12:14

上级 7109d04a
......@@ -21,7 +21,7 @@
起初,TensorFlow 中的计算可能看起来不必要地复杂化。但有一个原因:由于 TensorFlow 如何处理计算,开发更复杂的算法相对容易。该秘籍将指导我们完成 TensorFlow 算法的伪代码。
## 做好准备
## 准备
目前,TensorFlow 在 Linux,macOS 和 Windows 上受支持。本书的代码已经在 Linux 系统上创建和运行,但也应该在任何其他系统上运行。该书的代码可在 [GitHub](https://github.com/nfmcclure/tensorflow_cookbook) 以及[ Packt 仓库](https://github.com/PacktPublishing/TensorFlow-Machine-Learning-Cookbook-Second-Edition)中找到。
......@@ -108,7 +108,7 @@ session.run(...)
> `tensor`是指广义向量或矩阵的数学术语。如果向量是一维的并且矩阵是二维的,则张量是 n 维的(其中`n`可以是 1,2 或甚至更大)。
## 做好准备
## 准备
当我们创建一个张量并将其声明为变量时,TensorFlow 会在我们的计算图中创建几个图结构。同样重要的是要指出,仅通过创建张量,TensorFlow 不会向计算图中添加任何内容。 TensorFlow 仅在运行初始化变量的操作后执行此操作。有关更多信息,请参阅下一节有关变量和占位符的内容。
......@@ -216,7 +216,7 @@ my_var = tf.Variable(tf.zeros([row_dim, col_dim]))
占位符和变量是在 TensorFlow 中使用计算图的关键工具。我们必须了解它们之间的区别以及何时最好地利用它们对我们有利。
## 做好准备
## 准备
与数据最重要的区别之一是它是占位符还是变量。变量是算法的模型参数,TensorFlow 跟踪如何更改这些参数以优化算法。占位符是允许您提供特定类型和形状的数据的对象,或者取决于计算图的结果,例如计算的预期结果。
......@@ -285,7 +285,7 @@ sess.run(second_var.initializer)
> 值得强调的是矩阵在机器学习(以及一般数学)中的重要性。大多数机器学习算法在计算上表示为矩阵运算。本书未涉及矩阵属性和矩阵代数(线性代数)的数学背景,因此强烈建议读者充分了解矩阵以适应矩阵代数。
## 做好准备
## 准备
许多算法依赖于矩阵运算。 TensorFlow 为我们提供了易于使用的操作来执行此类矩阵计算。对于以下所有示例,我们首先通过运行以下代码来创建图会话:
......@@ -404,7 +404,7 @@ TensorFlow 为我们提供了开始使用数值计算并将这些计算添加到
现在,我们必须了解我们可以添加到 TensorFlow 图的其他操作。
## 做好准备
## 准备
除了标准算术运算之外,TensorFlow 还为我们提供了更多我们应该了解的操作以及如何在继续操作之前使用它们。同样,我们可以通过运行以下代码来创建图会话:
......@@ -508,7 +508,7 @@ print(sess.run(custom_polynomial(11)))
激活函数是神经网络近似非线性输出并适应非线性特征的关键。他们将非线性运算引入神经网络。如果我们小心选择了哪些激活函数以及放置它们的位置,它们是非常强大的操作,我们可以告诉 TensorFlow 适合和优化。
## 做好准备
## 准备
当我们开始使用神经网络时,我们将定期使用激活函数,因为激活函数是任何神经网络的重要组成部分。激活函数的目标只是调整权重和偏差。在 TensorFlow 中,激活函数是作用于张量的非线性操作。它们是以与先前的数学运算类似的方式运行的函数。激活函数有很多用途,但主要的概念是它们在对输出进行归一化的同时在图中引入了非线性。使用以下命令启动 TensorFlow 图:
......@@ -600,7 +600,7 @@ print(sess.run(tf.nn.elu([-1., 0., -1.])))
> 一些数据源依赖于外部网站的维护,以便您可以访问数据。如果这些网站更改或删除此数据,则可能需要更新本节中的以下某些代码。您可以在作者的[ GitHub 页面](https://github.com/nfmcclure/tensorflow_cookbook)上找到更新的代码。
## 做好准备
## 准备
在 TensorFlow 中,我们将使用的一些数据集构建在 Python 库中,一些将需要 Python 脚本下载,一些将通过 Internet 手动下载。几乎所有这些数据集都需要有效的 Internet 连接,以便您可以检索它们。
......@@ -784,7 +784,7 @@ print(eng_ger_data[10])
在本节中,您将找到对学习和使用 TensorFlow 有很大帮助的其他链接,文档资源和教程。
## 做好准备
## 准备
在学习如何使用 TensorFlow 时,有助于知道在哪里寻求帮助或指针。本节列出了运行 TensorFlow 和解决问题的资源。
......
......@@ -21,7 +21,7 @@
现在我们可以将对象放入计算图中,我们将介绍对这些对象起作用的操作。
## 做好准备
## 准备
要启动图,我们加载 TensorFlow 并创建一个会话,如下所示:
......@@ -68,7 +68,7 @@ for x_val in x_vals:
在本文中,我们将学习如何在同一计算图上放置多个操作。
## 做好准备
## 准备
了解如何将操作链接在一起非常重要。这将在计算图中设置分层操作。对于演示,我们将占位符乘以两个矩阵,然后执行加法。我们将以三维 NumPy 数组的形式提供两个矩阵:
......@@ -144,7 +144,7 @@ x_data = tf.placeholder(tf.float32, shape=(3,None))
现在我们已经介绍了多个操作,我们将介绍如何连接具有通过它们传播的数据的各个层。
## 做好准备
## 准备
在本文中,我们将介绍如何最好地连接各种层,包括自定义层。我们将生成和使用的数据将代表小型随机图像。最好通过一个简单的例子来理解这种类型的操作,看看我们如何使用一些内置层来执行计算。我们将探索的第一层称为移动窗口。我们将在 2D 图像上执行小的移动窗口平均值,然后第二层将是自定义操作层。
......@@ -225,7 +225,7 @@ print(sess.run(custom_layer1, feed_dict={x_data: x_val}))
损失函数对于机器学习算法非常重要。它们测量模型输出与目标(真值)值之间的距离。在这个秘籍中,我们在 TensorFlow 中展示了各种损失函数实现。
## 做好准备
## 准备
为了优化我们的机器学习算法,我们需要评估结果。评估 TensorFlow 中的结果取决于指定损失函数。损失函数告诉 TensorFlow 预测与期望结果相比有多好或多坏。在大多数情况下,我们将有一组数据和一个目标来训练我们的算法。损失函数将目标与预测进行比较,并给出两者之间的数值距离。
......@@ -404,7 +404,7 @@ plt.show()
使用 TensorFlow 的一个好处是它可以跟踪操作并根据反向传播自动更新模型变量。在本文中,我们将介绍如何在训练机器学习模型时将此方面用于我们的优势。
## 做好准备
## 准备
现在,我们将介绍如何以最小化损失函数的方式更改模型中的变量。我们已经学会了如何使用对象和操作,并创建了测量我们的预测和目标之间距离的损失函数。现在,我们只需告诉 TensorFlow 如何通过我们的计算图反向传播错误来更新变量并最小化损失函数。这是通过声明优化函数完成的。一旦我们声明了一个优化函数,TensorFlow 将通过并计算出图中所有计算的反向传播项。当我们输入数据并最小化 los 函数时,TensorFlow 将相应地修改图中的变量。
......@@ -615,7 +615,7 @@ Loss = [[ 0.04099189]]
虽然 TensorFlow 根据反向传播更新我们的模型变量,但它可以同时操作从一个基准观察到一大批数据的任何事物。在一个训练示例上操作可以使得学习过程非常不稳定,而使用太大的批次可能在计算上是昂贵的。选择正确类型的训练对于使我们的机器学习算法融合到解决方案至关重要。
## 做好准备
## 准备
为了使 TensorFlow 计算反向传播的可变梯度,我们必须测量样本或多个样本的损失。随机训练一次只适用于一个随机抽样的数据 - 目标对,就像我们在上一个秘籍中所做的那样。另一种选择是一次放置大部分训练样例并平均梯度计算的损失。训练批次的大小可以一次变化,直到并包括整个数据集。在这里,我们将展示如何将先前的回归示例(使用随机训练)扩展到批量训练。
......@@ -736,7 +736,7 @@ plt.show()
在本节中,我们将结合到目前为止所示的所有内容,并为虹膜数据集创建分类器。
## 做好准备
## 准备
虹膜数据集在第 1 章,TensorFlow 入门中使用数据源秘籍中有更详细的描述。我们将加载这些数据并制作一个简单的二元分类器来预测花是否是 Iris setosa 的种类。需要说明的是,这个数据集有三个种类,但我们只能预测一种花是单一种,是否是一种花,给我们一个二元分类器。我们将首先加载库和数据,然后相应地转换目标。
......@@ -869,7 +869,7 @@ plt.show()
我们已经学会了如何在 TensorFlow 中训练回归和分类算法。在此之后,我们必须能够评估模型的预测,以确定它的效果。
## 做好准备
## 准备
评估模型非常重要,每个后续模型都将采用某种形式的模型评估。使用 TensorFlow,我们必须将此函数构建到计算图中,并在我们的模型进行训练时和/或完成训练后调用它。
......
......@@ -21,7 +21,7 @@
在这个秘籍中,我们将使用 TensorFlow 用矩阵逆方法求解二维线性回归。
## 做好准备
## 准备
线性回归可以表示为一组矩阵方程,比如`Ax = b`。在这里,我们感兴趣的是求解矩阵`x`中的系数。如果我们的观察矩阵(设计矩阵)`A`不是正方形,我们必须要小心。解决`x`的解决方案可以表示为:
......@@ -109,7 +109,7 @@ plt.show()
对于这个秘籍,我们将实现一个用于线性回归的矩阵分解方法。具体来说,我们将使用 Cholesky 分解,TensorFlow 中存在相关函数。
## 做好准备
## 准备
在大多数情况下,实现前一个秘籍中的逆方法在数值上效率低,尤其是当矩阵变得非常大时。另一种方法是分解`A`矩阵并对分解执行矩阵运算。一种方法是在 TensorFlow 中使用内置的 Cholesky 分解方法。
......@@ -183,7 +183,7 @@ plt.show()
虽然使用矩阵和分解方法非常强大,但 TensorFlow 还有另一种解决斜率和截距的方法。 TensorFlow 可以迭代地执行此操作,逐步学习最小化损失的线性回归参数。
## 做好准备
## 准备
在这个秘籍中,我们将遍历批量数据点并让 TensorFlow 更新斜率和`y`截距。我们将使用内置于 scikit-learn 库中的 iris 数据集,而不是生成的数据。具体来说,我们将通过数据点找到最佳线,其中`x`值是花瓣宽度,`y`值是萼片长度。我们选择了这两个,因为它们之间似乎存在线性关系,我们将在最后的绘图中看到。我们还将在下一节中详细讨论不同损失函数的影响,但对于这个秘籍,我们将使用 L2 损失函数。
......@@ -305,7 +305,7 @@ Here is a good place to note how to see whether the model is overfitting or unde
了解损失函数在算法收敛中的作用非常重要。在这里,我们将说明 L1 和 L2 损失函数如何影响线性回归中的收敛。
## 做好准备
## 准备
我们将使用与先前秘籍中相同的虹膜数据集,但我们将更改损失函数和学习率以查看收敛如何变化。
......@@ -399,7 +399,7 @@ plt.show()
> 戴明回归有几个名字。它也称为总回归,正交距离回归(ODR)和最短距离回归。
## 做好准备
## 准备
如果最小二乘线性回归最小化到线的垂直距离,则 deming 回归最小化到线的总距离。这种类型的回归可以最小化`y``x`值的误差。
......@@ -498,7 +498,7 @@ deming 回归的方法几乎与常规线性回归相同。关键的区别在于
还有一些方法可以限制系数对回归输出的影响。这些方法称为正则化方法,两种最常见的正则化方法是套索和岭回归。我们将介绍如何在本文中实现这两个方面。
## 做好准备
## 准备
套索和岭回归与常规线性回归非常相似,除了我们添加正则化项以限制公式中的斜率(或部分斜率)。这可能有多种原因,但一个常见的原因是我们希望限制对因变量产生影响的特征。这可以通过在损失函数中添加一个取决于我们的斜率值`A`的项来实现。
......@@ -595,7 +595,7 @@ loss = tf.expand_dims(tf.add(tf.reduce_mean(tf.square(y_target - model_output)),
弹性网络回归是一种回归类型,通过将 L1 和 L2 正则化项添加到损失函数,将套索回归与岭回归相结合。
## 做好准备
## 准备
在前两个秘籍之后实现弹性网络回归应该是直截了当的,因此我们将在虹膜数据集上的多元线性回归中实现这一点,而不是像以前那样坚持二维数据。我们将使用花瓣长度,花瓣宽度和萼片宽度来预测萼片长度。
......@@ -710,7 +710,7 @@ plt.show()
对于这个秘籍,我们将实现逻辑回归来预测样本人群中低出生体重的概率。
## 做好准备
## 准备
逻辑回归是将线性回归转换为二元分类的一种方法。这是通过将线性输出转换为 Sigmoid 函数来实现的,该函数将输出在 0 和 1 之间进行缩放。目标是零或一,表示数据点是在一个类还是另一个类中。由于我们预测 0 和 1 之间的数字,如果预测高于指定的截止值,则预测被分类为类值 1,否则分类为 0。出于此示例的目的,我们将指定 cutoff 为 0.5,这将使分类像舍入输出一样简单。
......
......@@ -48,7 +48,7 @@ SVM 是二分类的方法。基本思想是在两个类之间找到二维的线
对于此示例,我们将从 iris 数据集创建线性分隔符。我们从前面的章节中知道,萼片长度和花瓣宽度创建了一个线性可分的二进制数据集,用于预测花是否是 I. setosa。
## 做好准备
## 准备
要在 TensorFlow 中实现软可分 SVM,我们将实现特定的损失函数,如下所示:
......@@ -254,7 +254,7 @@ plt.show()
SVM 可用于拟合线性回归。在本节中,我们将探讨如何使用 TensorFlow 执行此操作。
## 做好准备
## 准备
可以将相同的最大边际概念应用于拟合线性回归。我们可以考虑最大化包含最多(`x``y`)点的边距,而不是最大化分隔类的边距。为了说明这一点,我们将使用相同的虹膜数据集,并表明我们可以使用此概念来拟合萼片长度和花瓣宽度之间的线。
......@@ -426,7 +426,7 @@ plt.show()
先前的 SVM 使用线性可分数据。如果我们分离非线性数据,我们可以改变将线性分隔符投影到数据上的方式。这是通过更改 SVM 损失函数中的内核来完成的。在本章中,我们将介绍如何更改内核并分离非线性可分离数据。
## 做好准备
## 准备
在本文中,我们将激励支持向量机中内核的使用。在线性 SVM 部分,我们用特定的损失函数求解了软边界。这种方法的另一种方法是解决所谓的优化问题的对偶。可以证明线性 SVM 问题的对偶性由以下公式给出:
......@@ -656,7 +656,7 @@ plt.show()
对于此秘籍,我们将应用非线性内核来拆分数据集。
## 做好准备
## 准备
在本节中,我们将在实际数据上实现前面的高斯核 SVM。我们将加载虹膜数据集并为 I. setosa 创建分类器(与非 setosa 相比)。我们将看到各种伽马值对分类的影响。
......@@ -798,7 +798,7 @@ plt.show()
我们还可以使用 SVM 对多个类进行分类,而不仅仅是两个类。在本文中,我们将使用多类 SVM 对虹膜数据集中的三种类型的花进行分类。
## 做好准备
## 准备
通过设计,SVM 算法是二元分类器。但是,有一些策略可以让他们在多个类上工作。两种主要策略称为“一对一”,“一对一”。
......
......@@ -45,7 +45,7 @@
我们将通过实现最近邻来预测住房价值来开始本章。这是从最近邻居开始的好方法,因为我们将处理数字特征和连续目标。
## 做好准备
## 准备
为了说明如何在 TensorFlow 中使用最近邻居进行预测,我们将使用波士顿住房数据集。在这里,我们将预测邻域住房价值中位数作为几个特征的函数。
......@@ -191,7 +191,7 @@ plt.show()
最近邻居比处理数字更通用。只要我们有一种方法来测量特征之间的距离,我们就可以应用最近邻算法。在本文中,我们将介绍如何使用 TensorFlow 测量文本距离。
## 做好准备
## 准备
在本文中,我们将说明如何在字符串之间使用 TensorFlow 的文本距离度量,Levenshtein 距离(编辑距离)。这将在本章后面重要,因为我们扩展了最近邻方法以包含带有文本的特征。
......@@ -305,7 +305,7 @@ print(sess.run(edit_distances, feed_dict=feed_dict))
在处理具有多个特征的数据观察时,我们应该意识到特征可以在不同的尺度上以不同的方式缩放。在这个方案中,我们将考虑到这一点,以改善我们的住房价值预测。
## 做好准备
## 准备
扩展最近邻算法很重要,要考虑不同缩放的变量。在这个例子中,我们将说明如何缩放不同变量的距离函数。具体来说,我们将距离函数作为特征方差的函数进行缩放。
......@@ -452,7 +452,7 @@ plt.show()
现在我们已经测量了数值和文本距离,我们将花一些时间学习如何将它们组合起来测量具有文本和数字特征的观察之间的距离。
## 做好准备
## 准备
最近邻是一种用于地址匹配的好算法。地址匹配是一种记录匹配,其中我们在多个数据集中具有地址并且想要匹配它们。在地址匹配中,我们可能在地址,不同城市或不同的邮政编码中存在拼写错误,但它们可能都指向相同的地址。在地址的数字和字符组件上使用最近邻居算法可以帮助我们识别实际上相同的地址。
......@@ -625,7 +625,7 @@ Match : 8765 donner st, 65154
最近邻也可用于图像识别。图像识别数据集的问题世界是 MNIST 手写数字数据集。由于我们将在后面的章节中将此数据集用于各种神经网络图像识别算法,因此将结果与非神经网络算法进行比较将会很棒。
## 做好准备
## 准备
MNIST 数字数据集由数千个尺寸为 28×28 像素的标记图像组成。虽然这被认为是一个小图像,但它对于最近邻算法总共有 784 个像素(或特征)。我们将通过考虑最近的`k`邻居(`k=4`,在该示例中)的模式预测来计算该分类问题的最近邻预测。
......
......@@ -43,7 +43,7 @@
神经网络最基本的概念之一是作为操作门操作。在本节中,我们将从乘法操作开始作为门,然后再继续考虑嵌套门操作。
## 做好准备
## 准备
我们将实现的第一个操作门是`f(x) = a · x`。为优化此门,我们将`a`输入声明为变量,将`x`输入声明为占位符。这意味着 TensorFlow 将尝试更改`a`值而不是`x`值。我们将创建损失函数作为输出和目标值之间的差异,即 50。
......@@ -191,7 +191,7 @@ Optimizing Two Gate Output to 50\.
现在我们可以将操作门连接在一起,我们希望通过激活函数运行计算图输出。在本节中,我们将介绍常见的激活函数。
## 做好准备
## 准备
在本节中,我们将比较和对比两种不同的激活函数:S 形和整流线性单元(ReLU)。回想一下,这两个函数由以下公式给出:
......@@ -322,7 +322,7 @@ plt.show()
我们拥有实现对真实数据进行操作的神经网络所需的所有工具,因此在本节中我们将创建一个神经网络,其中一个层在`Iris`数据集上运行。
## 做好准备
## 准备
在本节中,我们将实现一个具有一个隐藏层的神经网络。重要的是要理解完全连接的神经网络主要基于矩阵乘法。因此,重要的是数据和矩阵的尺寸正确排列。
......@@ -478,7 +478,7 @@ plt.show()
了解如何实现不同的层非常重要。在前面的秘籍中,我们实现了完全连接的层。在本文中,我们将进一步扩展我们对各层的了解。
## 做好准备
## 准备
我们已经探索了如何连接数据输入和完全连接的隐藏层,但是 TensorFlow 中有更多类型的层是内置函数。最常用的层是卷积层和 maxpool 层。我们将向您展示如何使用输入数据和完全连接的数据创建和使用此类层。首先,我们将研究如何在一维数据上使用这些层,然后在二维数据上使用这些层。
......@@ -768,7 +768,7 @@ Fully connected layer on all four rows with five outputs:
我们现在将通过在低出生体重数据集上使用多层神经网络将我们对不同层的知识应用于实际数据。
## 做好准备
## 准备
现在我们知道如何创建神经网络并使用层,我们将应用此方法,以预测低出生体重数据集中的出生体重。我们将创建一个具有三个隐藏层的神经网络。低出生体重数据集包括实际出生体重和出生体重是否高于或低于 2,500 克的指标变量。在这个例子中,我们将目标设为实际出生体重(回归),然后在最后查看分类的准确率。最后,我们的模型应该能够确定出生体重是否为< 2,500 克。
......@@ -1009,7 +1009,7 @@ Train Accuracy: 0.7019867549668874
在前面的秘籍中,我们注意到我们拟合的参数数量远远超过等效的线性模型。在这个秘籍中,我们将尝试通过使用神经网络来改进我们的低出生体重的逻辑模型。
## 做好准备
## 准备
对于这个秘籍,我们将加载低出生体重数据,并使用神经网络与两个隐藏的完全连接的层与 sigmoid 激活,以适应低出生体重的概率。
......@@ -1229,7 +1229,7 @@ plt.show()
为了展示适应性神经网络的可用性,我们现在将尝试使用神经网络来学习井字棋的最佳动作。我们将知道井字棋是一种确定性游戏,并且最佳动作已经知道。
## 做好准备
## 准备
为了训练我们的模型,我们将使用一系列的棋盘位置,然后对许多不同的棋盘进行最佳的最佳响应。我们可以通过仅考虑在对称性方面不同的棋盘位置来减少要训练的棋盘数量。井字棋棋盘的非同一性变换是 90 度,180 度和 270 度的旋转(在任一方向上),水平反射和垂直反射。鉴于这个想法,我们将使用最佳移动的候选棋盘名单,应用两个随机变换,然后将其输入神经网络进行学习。
......
......@@ -53,7 +53,7 @@ second_sentence = [1,0,0,1,1,1]
在本节中,我们将首先向您展示如何使用 TensorFlow 中的词袋嵌入。这种映射是我们在介绍中介绍的。在这里,我们将向您展示如何使用此类嵌入进行垃圾邮件预测。
## 做好准备
## 准备
为了说明如何在文本数据集中使用词袋,我们将使用来自 UCI 机器学习数据仓库的[垃圾邮件电话文本数据库](https://archive.ics.uci.edu/ml/datasets/SMS+Spam+Collection)。这是垃圾邮件或非垃圾邮件(火腿)的电话短信集合。我们将下载此数据,将其存储以备将来使用,然后继续使用词袋方法来预测文本是否为垃圾邮件。将在词袋算法上运行的模型将是没有隐藏层的逻辑模型。我们将使用批量大小为 1 的随机训练,并在最后的保持测试集上计算精度。
......@@ -293,7 +293,7 @@ Overall Test Accuracy: 0.8035874439461883
由于我们可以为每个单词选择嵌入,我们可能会决定更改某些单词的加权。一种这样的策略是增加有用的单词和减轻过度常见或罕见单词的权重。我们将在此秘籍中探索的嵌入是尝试实现此目的。
## 做好准备
## 准备
TF-IDF 是一个缩写,代表文本频率 - 反向文档频率。该术语基本上是每个单词的文本频率和反向文档频率的乘积。
......@@ -506,7 +506,7 @@ Generation # 10000\. Train Loss (Test Loss): 0.48 (0.45). Train Acc (Test Acc):
在之前的秘籍中,我们在训练模型之前决定了我们的文本嵌入。使用神经网络,我们可以使嵌入值成为训练过程的一部分。我们将探索的第一个这样的方法叫做 Skip-Gram 嵌入。
## 做好准备
## 准备
在此秘籍之前,我们没有考虑与创建单词嵌入相关的单词顺序。 2013 年初,Tomas Mikolov 和谷歌的其他研究人员撰写了一篇关于创建解决这个问题的[单词嵌入的论文](https://arxiv.org/abs/1301.3781),他们将他们的方法命名为 word2vec。
......@@ -838,7 +838,7 @@ Nearest to sad: dizzying, variety, existing, environment, tunney,
在这个秘籍中,我们将实现 word2vec 的 CBOW(连续词袋)方法。它与`Skip-Gram`方法非常相似,除了我们预测来自环境词周围窗口的单个目标词。
## 做好准备
## 准备
在这个秘籍中,我们将实现 word2vec 的`CBOW`方法。它与`Skip-Gram`方法非常相似,只是我们预测来自环境词周围窗口的单个目标词。
......@@ -1066,7 +1066,7 @@ elif method=='cbow':
在本文中,我们将使用先前学习的嵌入策略来执行分类。
## 做好准备
## 准备
现在我们已经创建并保存了 CBOW 字嵌入,我们需要使用它们来对电影数据集进行情感预测。在本文中,我们将学习如何加载和使用预先训练的嵌入,并使用这些嵌入来通过训练逻辑线性模型来预测好的或坏的评论来执行情绪分析。
......@@ -1291,7 +1291,7 @@ plt.show()
既然我们知道如何训练单词嵌入,我们也可以扩展这些方法以进行文档嵌入。我们将在以下部分中探讨如何执行此操作。
## 做好准备
## 准备
在前面关于 word2vec 方法的部分中,我们设法捕获了单词之间的位置关系。我们没有做的是捕捉单词与它们来自的文档(或电影评论)之间的关系。 word2vec 的一个扩展来捕获文档效果,称为 doc2vec。
......
......@@ -34,7 +34,7 @@ CNN 还具有满足更多要求的其他操作,例如引入非线性(ReLU)
在本文中,我们将开发一个四层卷积神经网络,以提高我们预测 MNIST 数字的准确率。前两个卷积层将各自由卷积-ReLU-Max 池操作组成,最后两个层将是完全连接的层。
## 做好准备
## 准备
为了访问 MNIST 数据,TensorFlow 有一个`examples.tutorials`包,它具有很好的数据集加载函数。加载数据后,我们将设置模型变量,创建模型,批量训练模型,然后可视化损失,准确率和一些样本数字。
......@@ -294,7 +294,7 @@ CNN 非常适合图像识别。造成这种情况的部分原因是卷积层创
能够扩展 CNN 模型以进行图像识别非常重要,这样我们才能理解如何增加网络的深度。如果我们有足够的数据,这可能会提高我们预测的准确率。扩展 CNN 网络的深度是以标准方式完成的:我们只是重复卷积,最大池和 ReLU,直到我们对深度感到满意为止。许多更精确的图像识别网络以这种方式操作。
## 做好准备
## 准备
在本文中,我们将实现一种更先进的读取图像数据的方法,并使用更大的 CNN 在 [CIFAR10](https://www.cs.toronto.edu/~kriz/cifar.html) 数据集上进行图像识别。该数据集具有 60,000 个`32x32`图像,这些图像恰好属于十个可能类别中的一个。图像的潜在类别是飞机,汽车,鸟,猫,鹿,狗,青蛙,马,船和卡车。另请参阅“另请参阅”部分中的第一个要点。
......@@ -634,7 +634,7 @@ plt.show()
从头开始训练新的图像识别需要大量的时间和计算能力。如果我们可以采用先前训练的网络并使用我们的图像重新训练它,它可以节省我们的计算时间。对于此秘籍,我们将展示如何使用预先训练的 TensorFlow 图像识别模型并对其进行微调以处理不同的图像集。
## 做好准备
## 准备
其思想是从卷积层重用先前模型的权重和结构,并重新训练网络顶部的完全连接层。
......@@ -806,7 +806,7 @@ git clone https://github.com/tensorflow/models/tree/master/research/inception
一旦我们对 CNN 进行了图像识别训练,我们就可以将网络本身用于一些有趣的数据和图像处理。 Stylenet 是一种尝试从一张图片中学习图像样式并将其应用于第二张图片同时保持第二图像结构(或内容)完整的过程。如果我们能够找到与样式强烈相关的中间 CNN 节点,这可能是可能的,与图像的内容分开。
## 做好准备
## 准备
Stylenet 是一个过程,它接收两个图像并将一个图像的样式应用于第二个图像的内容。它基于 2015 年的着名论文“艺术风格的神经算法”(参见下一节的第一个要点)。作者在一些 CNN 中找到了一个属性,其中存在中间层,它们似乎编码图片的样式,有些编码图片的内容。为此,如果我们训练样式图片上的样式层和原始图像上的内容层,并反向传播那些计算的损失,我们可以将原始图像更改为更像样式图像。
......@@ -1082,7 +1082,7 @@ with tf.Session() as sess:
受过训练的 CNN 的另一个用途是利用一些中间节点检测标签特征(例如,猫的耳朵或鸟的羽毛)的事实。利用这一事实,我们可以找到转换任何图像的方法,以反映我们选择的任何节点的节点特征。对于这个秘籍,我们将在 TensorFlow 的网站上浏览 DeepDream 教程,但我们将更详细地介绍基本部分。希望我们可以让读者准备好使用 DeepDream 算法来探索 CNN 及其中创建的特征。
## 做好准备
## 准备
TensorFlow 的官方教程展示了如何通过脚本实现 DeepDream(请参阅下一节中的第一个要点)。这个方法的目的是通过他们提供的脚本并解释每一行。虽然教程很棒,但有些部分可以跳过,有些部分可以使用更多解释。我们希望提供更详细的逐行说明。我们还将在必要时使代码符合 Python 3 标准。
......
......@@ -46,7 +46,7 @@
首先,我们将应用标准 RNN 单元来预测奇异数值输出,即垃圾邮件概率。
## 做好准备
## 准备
在此秘籍中,我们将在 TensorFlow 中实现标准 RNN,以预测短信是垃圾邮件还是火腿。我们将使用 UCI 的 ML 仓库中的 SMS 垃圾邮件收集数据集。我们将用于预测的架构将是来自嵌入文本的输入 RNN 序列,我们将最后的 RNN 输出作为垃圾邮件或火腿(1 或 0)的预测。
......@@ -308,7 +308,7 @@ plt.show()
我们将扩展我们的 RNN 模型,以便通过在此秘籍中引入 LSTM 单元来使用更长的序列。
## 做好准备
## 准备
长短期记忆(LSTM)是传统 RNN 的变体。 LSTM 是一种解决可变长度 RNN 所具有的消失/爆炸梯度问题的方法。为了解决这个问题,LSTM 单元引入了一个内部遗忘门,它可以修改从一个单元到下一个单元的信息流。为了概念化它的工作原理,我们将逐步介绍一个无偏置的 LSTM 方程式。第一步与常规 RNN 相同:
......@@ -669,7 +669,7 @@ This results in the following plot of our loss values:
正如我们可以增加神经网络或 CNN 的深度,我们可以增加 RNN 网络的深度。在这个秘籍中,我们应用了一个三层深度的 LSTM 来改进我们的莎士比亚语言生成。
## 做好准备
## 准备
我们可以通过将它们叠加在一起来增加循环神经网络的深度。从本质上讲,我们将获取目标输出并将其输入另一个网络。
......@@ -777,7 +777,7 @@ TensorFlow 只需一个 RNN 单元列表即可轻松将 RNN 层扩展到多个
由于我们使用的每个 RNN 单元也都有输出,我们可以训练 RNN 序列来预测其他可变长度的序列。对于这个秘籍,我们将利用这一事实创建一个英语到德语的翻译模型。
## 做好准备
## 准备
对于这个秘籍,我们将尝试构建一个语言翻译模型,以便从英语翻译成德语。
......@@ -1357,7 +1357,7 @@ while global_step < hparams.num_train_steps:
与许多其他模型相比,RNN 模型的一个重要特性是它们可以处理各种长度的序列。利用这一点,以及它们可以推广到之前未见过的序列这一事实,我们可以创建一种方法来衡量输入的相似序列是如何相互作用的。在这个秘籍中,我们将训练一个 Siamese 相似性 RNN 来测量地址之间的相似性以进行记录匹配。
## 做好准备
## 准备
在本文中,我们将构建一个双向 RNN 模型,该模型将输入到一个完全连接的层,该层输出一个固定长度的数值向量。我们为两个输入地址创建双向 RNN 层,并将输出馈送到完全连接的层,该层输出固定长度的数字向量(长度 100)。然后我们将两个向量输出与余弦距离进行比较,余弦距离在-1 和 1 之间。我们将输入数据表示为与目标 1 相似,并且目标为-1。余弦距离的预测只是输出的符号(负值表示不相似,正表示相似)。我们可以使用此网络通过从查询地址获取在余弦距离上得分最高的参考地址来进行记录匹配。
......
......@@ -19,7 +19,7 @@
测试代码可以加快原型设计速度,提高调试效率,加快更改速度,并且可以更轻松地共享代码。在 TensorFlow 中有许多简单的方法可以实现单元测试,我们将在本文中介绍它们。
## 做好准备
## 准备
在编写 TensorFlow 模型时,有助于进行单元测试以检查程序的功能。这有助于我们,因为当我们想要对程序单元进行更改时,测试将确保这些更改不会以未知方式破坏模型。在这个秘籍中,我们将创建一个依赖于`MNIST`数据的简单 CNN 网络。有了它,我们将实现三种不同类型的单元测试来说明如何在 TensorFlow 中编写它们。
......@@ -251,7 +251,7 @@ OK
您将意识到 TensorFlow 有许多功能,包括计算图,它们可以自然地并行计算。计算图可以分为不同的处理器以及处理不同的批量。我们将讨论如何在此秘籍中访问同一台机器上的不同处理器。
## 做好准备
## 准备
对于此秘籍,我们将向您展示如何在同一系统上访问多个设备并对其进行训练。这是一种非常常见的情况:与 CPU 一起,机器可能具有一个或多个可以共享计算负载的 GPU。如果 TensorFlow 可以访问这些设备,它将通过贪婪的过程自动将计算分配给多个设备。但是,TensorFlow 还允许程序通过名称范围放置指定哪些设备将在哪个设备上。
......@@ -357,7 +357,7 @@ print(sess.run(combined))
为了扩展 TensorFlow 并行化的范围,我们还可以以分布式方式在完全不同的机器上从我们的图执行单独的操作。这个秘籍将告诉你如何。
## 做好准备
## 准备
在 TensorFlow 发布几个月后,谷歌发布了分布式 TensorFlow,它是对 TensorFlow 生态系统的一次重大升级,并且允许在不同的工作机器上设置 TensorFlow 集群,并分享训练和评估的计算任务楷模。使用 Distributed TensorFlow 就像为工作器设置参数一样简单,然后为不同的工作器分配不同的工作。
......@@ -422,7 +422,7 @@ Summed Values:-21.12611198425293
如果我们想在生产环境中使用我们的机器学习脚本,我们首先需要考虑一些要点作为最佳实践。在本节中,我们将概述其中的一些内容。
## 做好准备
## 准备
在本文中,我们想总结并浓缩将 TensorFlow 投入生产的各种技巧。我们将介绍如何最好地保存和加载词汇表,图,变量和模型检查点。我们还将讨论如何使用 TensorFlow 的命令行参数解析器并更改 TensorFlow 的日志记录详细程度。
......@@ -518,7 +518,7 @@ tf.logging.set_verbosity(tf.logging.DEBUG)
生产机器学习模型的一个好方法是将训练和评估程序分开。在本节中,我们将说明一个评估脚本,该脚本已经扩展到包括单元测试,模型保存和加载以及评估。
## 做好准备
## 准备
在本文中,我们将向您展示如何使用上述标准实现评估脚本。代码实际上包含一个训练脚本和一个评估脚本,但是对于这个秘籍,我们只会向您展示评估脚本。提醒一下,两个脚本都可以在[在线 GitHub 仓库](https://github.com/nfmcclure/tensorflow_cookbook/)[官方 Packt 仓库](https://github.com/nfmcclure/tensorflow_cookbook/)中看到。
......@@ -653,7 +653,7 @@ if __name__ == "__main__":
在本节中,我们将向您展示如何设置 RNN 模型以预测 TensorFlow 上的垃圾邮件或火腿文本消息。我们将首先说明如何以 protobuf 格式保存模型,然后将模型加载到本地服务器,监听端口`9000`以进行输入。
## 做好准备
## 准备
我们通过鼓励读者阅读 [TensorFlow 服务网站](https://www.tensorflow.org/serving/serving_basic)上的官方文档和简短教程来开始本节。
......
......@@ -19,7 +19,7 @@
监视和排除机器学习算法可能是一项艰巨的任务,尤其是在您知道结果之前必须等待很长时间才能完成训练。为了解决这个问题,TensorFlow 包含一个名为 TensorBoard 的计算图可视化工具。使用 TensorBoard,即使在训练期间,我们也可以可视化和绘制重要值(损失,准确率,批次训练时间等)。
## 做好准备
## 准备
为了说明我们可以使用 TensorBoard 的各种方法,我们将从第 3 章,线性回归中的线性回归方法的 TensorFlow 方法重新实现线性回归模型。我们将生成带有错误的线性数据,并使用 TensorFlow 损失和反向传播来匹配数据线。我们将展示如何监控数值,值集的直方图以及如何在 TensorBoard 中创建图像。
......@@ -214,7 +214,7 @@ $ tensorboard --logdir="tensorboard" Starting tensorboard b'29' on port 6006 (Yo
TensorFlow 还可用于更新我们可以在计算图中表达的任何迭代算法。一种这样的迭代算法是遗传算法,即优化过程。
## 做好准备
## 准备
在本文中,我们将说明如何实现简单的遗传算法。遗传算法是优化任何参数空间(离散,连续,平滑,非平滑等)的一种方法。我们的想法是创建一组随机初始化的解决方案,并应用选择,重组和变异来生成新的(可能更好的)子解决方案。整个想法取决于我们可以通过查看个人解决问题的程度来计算个体解决方案的适用性。
......@@ -381,7 +381,7 @@ Generation: 195, Best Fitness (lowest MSE): 0.083
TensorFlow 还可用于实现迭代聚类算法,例如 k-means。在本文中,我们展示了在`iris`数据集上使用 k-means 的示例。
## 做好准备
## 准备
我们在本书中探讨的几乎所有机器学习模型都是监督模型。 TensorFlow 非常适合这些类型的问题。但是,如果我们愿意,我们也可以实现无监督的模型。例如,此秘籍将实现 k-means 聚类。
......@@ -565,7 +565,7 @@ plt.show()
TensorFlow 可用于许多算法实现和过程。 TensorFlow 多功能性的一个很好的例子是实现 ODE 求解器。以数字方式求解 ODE 是一种迭代过程,可以在计算图中轻松描述。对于这个秘籍,我们将解决 Lotka-Volterra 捕食者 - 猎物系统。
## 做好准备
## 准备
该秘籍将说明如何求解常微分方程(ODE)系统。我们可以使用与前两节类似的方法来更新值,因为我们迭代并解决 ODE 系统。
......@@ -650,7 +650,7 @@ plt.show()
随机森林算法建立在随机选择的观察和/或随机选择的特征上的聚合决策树上。我们不会介绍如何训练决策树,但会显示有些类型的随机森林可以使用梯度提升训练,TensorFlow 可以为我们计算。
## 做好准备
## 准备
基于树的算法传统上是非平滑的,因为它们基于对数据进行分区以最小化目标输出中的方差。非光滑方法不适合基于梯度的方法。 TensorFlow 依赖于以下事实:模型中使用的函数是平滑的,并且它自动计算如何更改模型参数以最小化函数损失。 TensorFlow 绕过这个障碍的方式是对决策边界进行平滑逼近。可以使用 softmax 函数或类似形状函数来近似决策边界。
......@@ -812,7 +812,7 @@ Mean Abs Err on test set: 0.7111111111111111
TensorFlow 非常适合为程序员提供的灵活性和强大功能。这样做的一个缺点是原型模型和迭代各种测试对程序员来说可能很麻烦。 Keras 是深度学习库的包装器,可以更轻松地处理模型的各个方面并使编程更容易。在这里,我们选择在 TensorFlow 之上使用 Keras。事实上,使用带有 TensorFlow 后端的 Keras 非常受欢迎,TensorFlow 中有一个 Keras 库。对于这个秘籍,我们将使用该 TensorFlow 库在 MNIST 数据集上进行完全连接的神经网络和简单的 CNN 图像网络。
## 做好准备
## 准备
对于这个秘籍,我们将使用驻留在 TensorFlow 内部的 Keras 函数。 [Keras](https://keras.io/) 已经是一个可以安装的独立 python 库了。如果您选择使用纯 Keras 路线,则必须为 Keras 选择后端(如 TensorFlow)。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册