提交 45b84bd6 编写于 作者: W wizardforcel

2020-09-06 17:57:58

上级 a396722f
......@@ -399,7 +399,7 @@ val 数据集或验证数据集将用于查找理想的超参数并测量过度
val 和测试数据来自同一数据集非常重要。 火车数据集匹配 val 和 test 不太重要,尽管那仍然是理想的。 例如,如果使用图像增强功能(对训练图像进行较小的修改以尝试扩大训练集大小),则训练集分布可能不再与 val 集分布匹配。 这是可以接受的,并且只要 val 和 test 来自同一分布,就可以充分测量网络性能。
在传统的机器学习应用程序中,习惯上将 10%到 20%的可用数据用于 val 和测试。 在深度神经网络中,通常情况是我们的数据量很大,以至于我们可以用更小的 val 和测试集来充分测量网络性能。 当数据量达到数以千万计的观测值时,将 98%,1%,1%的拆分完全合适。
在传统的机器学习应用程序中,习惯上将 10% 到 20% 的可用数据用于 val 和测试。 在深度神经网络中,通常情况是我们的数据量很大,以至于我们可以用更小的 val 和测试集来充分测量网络性能。 当数据量达到数以千万计的观测值时,将 98%,1%,1% 的拆分完全合适。
# 在深度神经网络中管理偏差和方差
......
......@@ -14,7 +14,7 @@
在经典回归分析中,我们使用线性模型来学习一组独立变量和因变量之间的关系。 在找到这种关系时,我们希望能够在给定自变量值的情况下预测因变量的值。
进行回归分析的第二个重要原因是要了解当所有其他自变量保持恒定时单个自变量对因变量的影响。 传统多元线性回归的一大优点是线性模型的 *ceteris paribus* 属性。 我们可以通过使用与该自变量关联的学习权重来解释单个自变量对因变量的影响,而无需考虑其他自变量。 这种解释充其量是具有挑战性的,需要我们对我们的数据和模型做出很多假设。 但是,它通常非常有用。
进行回归分析的第二个重要原因是要了解当所有其他自变量保持恒定时单个自变量对因变量的影响。 传统多元线性回归的一大优点是线性模型的*其他条件不变*属性。 我们可以通过使用与该自变量关联的学习权重来解释单个自变量对因变量的影响,而无需考虑其他自变量。 这种解释充其量是具有挑战性的,需要我们对我们的数据和模型做出很多假设。 但是,它通常非常有用。
深度神经网络很难解释,尽管尝试这样做是一个活跃的研究领域。
......@@ -25,8 +25,8 @@
在本章的其余部分,我们将重点介绍使用深度神经网络进行预测。 与使用传统的多元线性回归进行比较时,您会很高兴地发现我们的神经网络具有以下优势:
* 我们不需要选择或筛选功能。 神经网络是功能强大的功能工程机器,可以了解哪些功能是相关的,而忽略了无关的功能。
* 给定足够复杂的网络,还可以学习特征交互(例如,除了 *x <sub>1</sub> * x* <sub>*2*</sub> 的效果 *x <sub>1</sub>* 和 *x <sub>2</sub>* 的独立效应))
* 您可能现在已经猜到了,我们还可以学习更高阶的多项式关系(例如 *x <sub>2</sub>* <sup>*3*</sup>
* 给定足够复杂的网络,还可以学习特征交互(例如,除了`x[1]``x[2]`的独立效应,`x[1] * x[2]`效应))
* 您可能现在已经猜到了,我们还可以学习更高阶的多项式关系(例如`x[2]^3`
* 最后,只要我们确保最终激活可以对分布进行建模,我们就不必只对正态分布建模或对非正态分布使用不同的模型。
# 使用神经网络进行回归时要考虑的缺点
......@@ -104,7 +104,7 @@ def load_data():
标准化我们的数据很重要,这样每个功能都应具有可比的范围,并且所有这些范围都应位于激活函数的范围之内。 在这里,我使用了 Scikit-Learn 的`StandardScaler`完成此任务。
这为我们提供了一个形状完整的数据集(4898,10)。 我们的目标变量`alcohol`的百分比介于 8%和 14.2%之间。
这为我们提供了一个形状完整的数据集(4898,10)。 我们的目标变量`alcohol`的百分比介于 8% 和 14.2% 之间。
在加载数据之前,我已经对数据进行了随机采样并将其划分为`train``val``test`数据集,因此我们在这里不必担心。
......@@ -118,7 +118,7 @@ def load_data():
![](img/15697b3b-001e-4120-a0d1-c4447a4dc47f.png)
很简单,MAE 是数据集中所有示例的平均无符号错误。 与 RMSE 非常相似; 但是,我们使用 *y* 和![](img/08f40ad9-ae1d-4118-a408-29c9b1e24cc4.png)之间的差的绝对值代替平均平方误差的平方根:
很简单,MAE 是数据集中所有示例的平均无符号错误。 与 RMSE 非常相似; 但是,我们使用`y``y_hat`之间的差的绝对值代替平均平方误差的平方根:
![](img/f0a26b2f-9d67-4235-b6f1-c15e931a4efd.png)
......@@ -176,7 +176,7 @@ model = build_network(input_features=10)
但是,在开始之前,让我们回顾一下前面代码中的一些有趣的部分:
* 每层*链接到*到它上面的层。 每层都是可调用的,并返回张量。 例如,当隐藏层调用它时,我们的隐藏层*绑定到输入层*
* 每层*链接到*到它上面的层。 每层都是可调用的,并返回张量。 例如,当隐藏层调用它时,我们的隐藏层*绑定到输入层*
```py
x = Dense(32, activation='relu', name="hidden")(inputs)
......@@ -200,7 +200,7 @@ model.compile(optimizer=adam_optimizer, loss='mean_absolute_error')
model.fit(x=data["train_X"], y=data["train_y"], batch_size=32, epochs=200, verbose=1, validation_data=(data["val_X"], data["val_y"]))
```
让我们来看一下 Keras fit 方法所采用的一些重要论点。 我将假设您熟悉小批量梯度下降和训练纪元,但如果不熟悉,请查看第 1 章*深度学习的基础知识*, 概述。 Keras 拟合模型中的重要参数如下:
让我们来看一下 Keras fit 方法所采用的一些重要论点。 我将假设您熟悉小批量梯度下降和训练纪元,但如果不熟悉,请查看第 1 章“深度学习的基础知识”, 概述。 Keras 拟合模型中的重要参数如下:
* `batch_size`:Keras 的默认批次大小为 32。批次大小是 Keras 将使用的迷你批次的大小。 当然,这意味着 Keras 假设您要使用小批量梯度下降。 如果由于某种原因不想使用小批量梯度,可以设置`batch_size=None`
* `epochs`:一个时期只是整个训练集的单次通过。 在实践中,您需要在训练网络时对其进行监视,以了解网络何时收敛,因此`epochs`是一个易于学习的超参数。 稍后,我们将看到可以在每个时期甚至比最后一个时期更好的每个时期保存模型的权重。 一旦知道如何做到这一点,我们就可以选择我们认为最好的时期,并实施一种基于人的早期停止。
......@@ -283,7 +283,7 @@ Model Test MAE: 0.190189985043
现在,我们已经针对该问题训练了 MLP 和六层深度神经网络,现在可以调整和优化模型超参数了。
我们将在第 6 章*超参数优化*中讨论深度模型调整。 您可以使用多种策略为模型选择最佳参数。 您可能已经注意到,我们仍然可以优化许多可能的参数和超参数。
我们将在第 6 章“超参数优化”中讨论深度模型调整。 您可以使用多种策略为模型选择最佳参数。 您可能已经注意到,我们仍然可以优化许多可能的参数和超参数。
如果要完全调整此模型,则应执行以下操作:
......
......@@ -77,7 +77,7 @@ TensorBoard 回调是可以在模型训练之前进行配置和实例化的对
# 创建一个 TensorBoard 回调
在本章中,我通过复制第 2 章*的网络和数据开始使用深度学习来解决回归问题*。 我们将做一些简单的添加来添加 TensorBoard 回调。 让我们从修改我们首先构建的`mlp`开始。
在本章中,我通过复制第 2 章“开始使用深度学习来解决回归问题”的网络和数据。 我们将做一些简单的添加来添加 TensorBoard 回调。 让我们从修改我们首先构建的`mlp`开始。
首先,我们需要使用以下代码导入 TensorBoard 回调类:
......@@ -99,7 +99,7 @@ def create_callbacks():
* `log_dir` **:**这是我们将为 TensorBoard 写入日志文件的路径。
您可能已经注意到,我正在将 MLP 网络的 TensorBoard 回调的日志写入`~/ch_3_tb_log/mlp`,这将在我们为 TensorBoard 指定的目录下创建一个新的 Director `mlp`。 这是故意的。 我们将配置在第 2 章,*中使用深度学习解决回归问题*训练的深度神经网络模型,以登录到单独的目录`~/ch_3_tb_log/dnn`。 这样做将使我们能够比较两个模型的运行。
您可能已经注意到,我正在将 MLP 网络的 TensorBoard 回调的日志写入`~/ch_3_tb_log/mlp`,这将在我们为 TensorBoard 指定的目录下创建一个新的 Director `mlp`。 这是故意的。 我们将配置在第 2 章,“使用深度学习解决回归问题”训练的深度神经网络模型,以登录到单独的目录`~/ch_3_tb_log/dnn`。 这样做将使我们能够比较两个模型的运行。
* `histogram_freq`:这指定我们将多长时间计算一次激活和权重的直方图(以时期为单位)。 它的默认值为 0,这会使日志更小,但不会生成直方图。 我们将介绍为什么以及何时您会对直方图感兴趣。
* `batch_size`:这是用于计算直方图的批处理大小。 默认为 32。
......@@ -138,7 +138,7 @@ tensorboard_callback = TensorBoard(log_dir='./ch3_tb_log/dnn',
# 可视化培训
由于我们已在第 2 章*中使用这两种模型编写了日志数据,因此使用了深度学习解决了回归问题*,因此可以使用 TensorBoard 以图形方式比较这两种模型。 打开 TensorBoard 并转到 SCALARS 选项卡。 您应该会看到类似这样的内容。 您可能需要单击 loss 和 val_loss 来展开图形:
由于我们已在第 2 章“使用了深度学习解决回归问题”中使用这两种模型编写了日志数据,因此可以使用 TensorBoard 以图形方式比较这两种模型。 打开 TensorBoard 并转到 SCALARS 选项卡。 您应该会看到类似这样的内容。 您可能需要单击 loss 和 val_loss 来展开图形:
![](img/6ed1b1a7-9d13-4b10-91f3-2c4bfb2db2f3.png)
......@@ -146,9 +146,9 @@ tensorboard_callback = TensorBoard(log_dir='./ch3_tb_log/dnn',
如果您查看屏幕的左下角,则应注意,我们创建的每个目录都有与之关联的运行。 两者均处于选中状态。 这意味着在我们的图形上,我们将看到两个模型的输出。
TensorBoard 可以容纳许多运行,并且您可以通过正则表达式过滤它们(例如^ dnn *将显示所有以 dnn 开头的运行)。 这意味着,如果您通过许多实验或运行(例如超参数优化)来搜索*最佳*模型,则可以在明确并一致地命名运行并包含有意义的超参数和体系结构信息的情况下快速浏览它们 以这个名字吧!
TensorBoard 可以容纳许多运行,并且您可以通过正则表达式过滤它们(例如`^dnn`将显示所有以`dnn`开头的运行)。 这意味着,如果您通过许多实验或运行(例如超参数优化)来搜索*最佳*模型,则可以在明确并一致地命名运行并包含有意义的超参数和体系结构信息的情况下快速浏览它们 以这个名字吧!
这些图上的默认 **X** 比例尺是**历元****Y** 值是我们选择的**损失函数**,即 **MAE** 。 您可以单击图形以浏览它们并拖动以缩放。
这些图上的默认 **X** 比例尺是**历元****Y** 值是我们选择的**损失函数**,即 **MAE**。 您可以单击图形以浏览它们并拖动以缩放。
看到这样的图,我们真的可以看到每个网络的相对偏差和方差。 虽然模型之间在火车损失方面有很好的分离,但深度神经网络在验证集上只得到了一点点改善,这表明我们已经进入了过度拟合的领域。
......@@ -182,7 +182,7 @@ Sceenshot 显示两个网络中隐藏层 1 的权重直方图
您也可以在“分布”部分比较权重和偏差。 两者都以略有不同的方式呈现大多数相同的信息。
现在,看看我们破碎的网络的分量和偏见。 不是*这样分散,实际上*的权重基本上是相同的。 网络并不是真正的学习。 该层中的每个神经元看起来或多或少都是相同的。 如果您查看其他隐藏层,则会看到更多相同的层。
现在,看看我们破碎的网络的权重和偏见。 并不是*这样分散*,实际上的权重基本上是相同的。 网络并不是真正的学习。 该层中的每个神经元看起来或多或少都是相同的。 如果您查看其他隐藏层,则会看到更多相同的层。
您可能想知道我是怎么做到的。 您很幸运,我会分享我的秘密。 毕竟,您永远都不知道何时需要断开自己的网络。 为了解决问题,我将网络中的每个神经元初始化为完全相同的值。 发生这种情况时,每个神经元在反向传播期间收到的错误是完全相同的,并且更改的方式也完全相同。 网络然后无法破坏对称性。 以随机方式将权重初始化到深度神经网络非常重要,如果您违反了该规则,就会发生这种情况!
......
# 使用深度学习解决二进制分类问题
在本章中,我们将使用 Keras 和 TensorFlow 解决棘手的二进制分类问题。 我们将首先讨论深度学习对此类问题的利弊,然后我们将继续使用与第 2 章*中使用的相同框架建立解决方案。 学习解决回归问题*。 最后,我们将更深入地介绍 Keras 回调,甚至使用自定义回调来实现曲线下[ETG5] / **区域的每个时期**接收器操作特征** / **区域( **ROC AUC**)指标。****
在本章中,我们将使用 Keras 和 TensorFlow 解决棘手的二进制分类问题。 我们将首先讨论深度学习对此类问题的利弊,然后我们将继续使用与第 2 章“学习解决回归问题”中使用的相同框架建立解决方案。 最后,我们将更深入地介绍 Keras 回调,甚至使用自定义回调来实现每个周期的**受试者工作特征的曲线下面积****ROC AUC**)指标。
我们将在本章介绍以下主题:
......@@ -19,11 +19,11 @@
与更传统的分类器(例如逻辑回归模型)或什至基于树的模型(例如**随机森林****梯度提升机**)相比,深度神经网络有一些不错的选择 优点。
与回归一样,我们在第 2 章和*中使用深度学习解决了回归问题*,我们不需要选择或筛选特征。 在本章选择的问题中,有 178 个输入变量。 每个输入变量都是来自标记为 **x1..x178** 的 E **脑电图****EEG**)的特定输入。 即使您是医生,也很难理解这么多功能与目标变量之间的关系。 这些功能中的某些功能很可能是不相关的,而这些变量和目标之间可能存在一些更高级别的交互,这是一个更好的机会。 如果使用传统模型,则经过功能选择步骤后,我们将获得最佳模型性能。 使用深度神经网络时不需要这样做。
与回归一样,在第 2 章“使用深度学习解决回归问题”中,我们不需要选择或筛选特征。 在本章选择的问题中,有 178 个输入变量。 每个输入变量都是来自标记为`x1..x178`**脑电图****EEG**)的特定输入。 即使您是医生,也很难理解这么多功能与目标变量之间的关系。 这些功能中的某些功能很可能是不相关的,而这些变量和目标之间可能存在一些更高级别的交互,这是一个更好的机会。 如果使用传统模型,则经过功能选择步骤后,我们将获得最佳模型性能。 使用深度神经网络时不需要这样做。
# 深度神经网络的缺点
正如我们在第 2 章*中使用深度学习解决回归问题*所述,深度神经网络不容易解释。 虽然深度神经网络是出色的预测器,但要理解它们为何得出自己的预测并不容易。 需要重复的是,当任务是要了解哪些功能与目标的变化最相关时,深度神经网络并不是工作的工具。 但是,如果目标是原始预测能力,则应考虑使用深度神经网络。
正如我们在第 2 章“使用深度学习解决回归问题”所述,深度神经网络不容易解释。 虽然深度神经网络是出色的预测器,但要理解它们为何得出自己的预测并不容易。 需要重复的是,当任务是要了解哪些功能与目标的变化最相关时,深度神经网络并不是工作的工具。 但是,如果目标是原始预测能力,则应考虑使用深度神经网络。
我们还应该考虑复杂性。 深度神经网络是具有许多参数的复杂模型。 找到最佳的神经网络可能需要花费时间和实验。 并非所有问题都能确保达到如此复杂的水平。
......@@ -31,11 +31,11 @@
# 案例研究–癫痫发作识别
您可能已经猜到了,我们将要解决二进制分类问题。 我们将使用与在第 2 章*中使用深度学习解决回归问题*建立的框架相同的框架来计划问题,并根据需要对其进行修改。 您可以在本书的 GitHub 存储库中的第 4 章和*下使用深度学习解决回归问题*,找到本章的完整代码。
您可能已经猜到了,我们将要解决二进制分类问题。 我们将使用与在第 2 章“使用深度学习解决回归问题”建立的框架相同的框架来计划问题,并根据需要对其进行修改。 您可以在本书的 GitHub 存储库中的第 4 章“使用深度学习解决回归问题”,找到本章的完整代码。
# 定义我们的数据集
我们将在本章中使用的数据集称为 ***癫痫发作识别*** 数据集。 数据最初来自论文*,指示脑电活动的时间序列中的非线性确定性和有限维结构:Andrzejak RG 等人在 Phys 上发表的对记录区域和大脑状态的依赖性*。 修订版 E,64,061907。您可以在 [UCI 机器学习存储库](http://archive.ics.uci.edu/ml/datasets/Epileptic+Seizure+Recognition)中找到数据。
我们将在本章中使用的数据集称为**癫痫发作识别**数据集。 数据最初来自Andrzejak RG 等人在 Phys 上发表的论文《指示脑电活动的时间序列中的非线性确定性和有限维结构:对记录区域和大脑状态的依赖性》。您可以在 [UCI 机器学习存储库](http://archive.ics.uci.edu/ml/datasets/Epileptic+Seizure+Recognition)中找到数据。
我们的目标是创建一个深度神经网络,根据输入特征,该网络可以预测患者是否有癫痫发作。
......@@ -80,11 +80,11 @@ def load_data():
我已经修改了原始数据集,通过将状态 2-5 更改为 0 级(表示无癫痫发作)和将 1 级(表示有癫痫发作)将状态重新定义为二元分类问题。
与第 2 章*中的回归问题一样,使用深度学习解决回归问题*,我们将使用 80%的训练,10%的 val,10%的测试分割。
与第 2 章“使用深度学习解决回归问题”中的回归问题一样,我们将使用 80% 的训练,10% 的 val,10% 的测试分割。
# 成本函数
我们需要分类器来预测癫痫发作的可能性,即类别 1。这意味着我们的输出将被限制为 *[0,1]* ,就像在传统的逻辑回归模型中一样。 在这种情况下,我们的成本函数将是二进制交叉熵,也称为**对数损失**。 如果您以前使用过分类器,那么您可能很熟悉此数学运算; 但是,作为复习,我将在这里包括。
我们需要分类器来预测癫痫发作的可能性,即类别 1。这意味着我们的输出将被限制为`[0, 1]`,就像在传统的逻辑回归模型中一样。 在这种情况下,我们的成本函数将是二进制交叉熵,也称为**对数损失**。 如果您以前使用过分类器,那么您可能很熟悉此数学运算; 但是,作为复习,我将在这里包括。
日志丢失的完整公式如下所示:
......@@ -145,7 +145,7 @@ def build_network(input_features=None):
* 我们可能会开发一个高方差模型
* 该模型将比不太复杂的模型训练得慢
如果我们增加许多层,我们的梯度将变得越来越小,直到前几层几乎没有训练为止,这就是**消失梯度问题**。 我们离那还很遥远,但是我们稍后会讨论。
如果我们增加许多层,我们的梯度将变得越来越小,直到前几层几乎没有训练为止,这就是**梯度消失问题**。 我们离那还很遥远,但是我们稍后会讨论。
用说唱传奇克里斯托弗·华莱士(又名臭名昭著的 B.I.G.)的话来说,我们遇到的神经元越多,看到的问题就越多。 话虽如此,方差可以通过辍学,正则化和提早停止进行管理,GPU 计算的进步使更深层次的网络成为可能。
......@@ -153,7 +153,7 @@ def build_network(input_features=None):
# 如果我们使用的神经元太少会怎样?
想象一下,我们没有隐藏层,只有输入和输出的情况。 我们在第 1 章*深度学习的基础知识*中讨论了该架构,在此我们展示了如何无法为`XOR`函数建模。 这样的网络架构无法对数据中的任何非线性进行建模,因此无法通过网络进行建模。 每个隐藏层都为功能工程越来越复杂的交互提供了机会。
想象一下,我们没有隐藏层,只有输入和输出的情况。 我们在第 1 章“深度学习的基础知识”中讨论了该架构,在此我们展示了如何无法为`XOR`函数建模。 这样的网络架构无法对数据中的任何非线性进行建模,因此无法通过网络进行建模。 每个隐藏层都为功能工程越来越复杂的交互提供了机会。
如果选择的神经元太少,则结果可能如下:
......@@ -164,7 +164,7 @@ def build_network(input_features=None):
因此,既然我们了解选择太多参数而不是选择太多参数的价格和行为,那么从哪里开始呢? 据我所知,剩下的只是实验。
测量这些实验可能很棘手。 如果像我们的早期网络一样,您的网络训练很快,那么可以在多种架构中实施诸如交叉验证之类的东西,以评估每种架构的多次运行。 如果您的网络需要很长时间进行训练,则可能会留下一些统计上不太复杂的信息。 我们将在第 6 章*超参数优化*中介绍网络优化。
测量这些实验可能很棘手。 如果像我们的早期网络一样,您的网络训练很快,那么可以在多种架构中实施诸如交叉验证之类的东西,以评估每种架构的多次运行。 如果您的网络需要很长时间进行训练,则可能会留下一些统计上不太复杂的信息。 我们将在第 6 章“超参数优化”中介绍网络优化。
一些书籍提供了选择神经网络体系结构的经验法则。 我对此表示怀疑和怀疑,您当然不会在这里找到一个。
......@@ -223,7 +223,7 @@ model = build_network(input_features=input_features)
model.fit(x=data["train_X"], y=data["train_y"], batch_size=32, epochs=20, verbose=1, validation_data=(data["val_X"], data["val_y"]), callbacks=callbacks)
```
如果您已经阅读第 2 章*使用深度学习解决回归问题*,则应该看起来很熟悉。 在大多数情况下,实际上是相同的。 回调列表包含 TensorBoard 回调,因此让我们观看我们的网络训练 20 个纪元,看看会发生什么:
如果您已经阅读第 2 章“使用深度学习解决回归问题”,则应该看起来很熟悉。 在大多数情况下,实际上是相同的。 回调列表包含 TensorBoard 回调,因此让我们观看我们的网络训练 20 个纪元,看看会发生什么:
> ![](img/33cc8da8-37ba-4743-8e74-3bffbc02c050.png)
......@@ -233,7 +233,7 @@ model.fit(x=data["train_X"], y=data["train_y"], batch_size=32, epochs=20, verbos
# 在 Keras 中使用检查点回调
在第 2 章*中,使用深度学习解决回归问题*,我们看到了`.save()`方法,该方法使我们可以在完成训练后保存 Keras 模型。 但是,如果我们可以不时地将权重写入磁盘,以便在上一个示例中及时返回 *g* o 并在模型开始之前保存其版本,那会不好吗 过拟合? 然后,我们可以就此停止,并使用网络的最低​​方差版本。
在第 2 章“使用深度学习解决回归问题”中,我们看到了`.save()`方法,该方法使我们可以在完成训练后保存 Keras 模型。 但是,如果我们可以不时地将权重写入磁盘,以便在上一个示例中及时返回 *g* o 并在模型开始之前保存其版本,那会不好吗 过拟合? 然后,我们可以就此停止,并使用网络的最低​​方差版本。
这正是`ModelCheckpoint`回调为我们所做的。 让我们来看看:
......@@ -308,7 +308,7 @@ def create_callbacks(data):
正如您可能对其他二进制分类器有丰富的经验一样,我认为用几句话讨论如何创建与更传统的二进制分类器一起使用的一些常规指标是明智的。
Keras 功能 API 与 scikit-learn 中可能使用的 API 之间的区别是`.predict()`方法的行为。 当使用 Keras 时,对于每个 *n* 类,`.predict()`将返回 *k* 类概率的`nxk`矩阵。 对于二进制分类器,将只有一列,即类别 1 的类别概率。这使 Keras `.predict()`更像 scikit-learn 中的`.predict_proba()`
Keras 功能 API 与 scikit-learn 中可能使用的 API 之间的区别是`.predict()`方法的行为。 当使用 Keras 时,对于`n`个样本中的每个,`.predict()`将返回`k`类概率的`nxk`矩阵。 对于二进制分类器,将只有一列,即类别 1 的类别概率。这使 Keras `.predict()`更像 scikit-learn 中的`.predict_proba()`
在计算精度,召回率或其他基于类的指标时,您需要通过选择一些操作点来转换`.predict()`输出,如以下代码所示:
......
......@@ -48,7 +48,7 @@
我们的输出层将为每个类包含一个神经元。 每个类别的关联神经元将经过训练,以将该类别的概率预测为介于 0 和 1 之间的值。我们将使用一种称为 **softmax** 的特殊激活,以确保所有这些输出总和为 1,我们将介绍 softmax 的详细信息。
这意味着我们将需要为我们的类创建一个二进制/分类编码。 例如,如果我们使 *y = [0,3,2,1]* 并对其进行分类编码,则将具有如下矩阵 *y*
这意味着我们将需要为我们的类创建一个二进制/分类编码。 例如,如果我们使`y = [0, 3, 2, 1]`并对其进行分类编码,则将具有如下矩阵`y`
![](img/557558d7-5f13-4821-96c1-7d2d8fe578b6.png)
......@@ -56,15 +56,15 @@
# 成本函数
我们将使用的成本函数称为**多项式交叉熵**。 多项式交叉熵实际上只是在第 4 章*使用 Keras 进行二进制分类*中看到的二进制交叉熵函数的概括。
我们将使用的成本函数称为**多项式交叉熵**。 多项式交叉熵实际上只是在第 4 章“使用 Keras 进行二进制分类”中看到的二进制交叉熵函数的概括。
让我们一起看看它们,而不只是显示分类交叉熵。 我要断言它们是平等的,然后解释原因:
![](img/a445eae6-efe6-4be2-bffe-4f0706f461dd.png)
前面的等式是正确的( *m = 2* 时)
前面的等式是正确的(`m = 2`时)
好吧,别害怕。 我知道,这是一堆数学。 绝对交叉熵方程是一直存在于右边的方程。 二进制交叉熵紧随其后。 现在,设想 *m* = 2 的情况。 在这种情况下,您可能会发现 *j = 0**j = 1* 的总和![](img/b5760af3-6d7e-4f89-a183-1005967eccf9.png)等于 *i* 中的每个值 结果将来自二进制交叉熵。 希望这种减少足以使分类交叉熵有意义。 如果没有,我建议选择一些值并进行编码。 只需一秒钟,稍后您将感谢我!
好吧,别害怕。 我知道,这是一堆数学。 绝对交叉熵方程是一直存在于右边的方程。 二进制交叉熵紧随其后。 现在,设想`m = 2`的情况。 在这种情况下,您可能会发现`j = 0``j = 1`的总和`y[ij]log(p[ij])`等于`i`中的每个值 结果将来自二进制交叉熵。 希望这种减少足以使分类交叉熵有意义。 如果没有,我建议选择一些值并进行编码。 只需一秒钟,稍后您将感谢我!
# 指标
......@@ -86,7 +86,7 @@
(train_X, train_y), (test_X, test_y) = mnist.load_data()
```
`train_X`的形状为 50,000 x 28 x28。正如我们在*模型输入和输出*部分中所述,我们将需要将 28x28 矩阵展平为 784 个元素向量。 NumPy 使这变得非常容易。 以下代码说明了此技术:
`train_X`的形状为 50,000 x 28 x28。正如我们在“模型输入和输出”部分中所述,我们将需要将 28x28 矩阵展平为 784 个元素向量。 NumPy 使这变得非常容易。 以下代码说明了此技术:
```py
train_X = train_X.reshape(-1, 784)
......@@ -100,7 +100,7 @@ train_X /= 255
```
正如我们在*模型输入和输出*部分中所述,在加载数据时,我们可能应该将因变量向量转换为分类向量。 为此,我们将在以下代码的帮助下使用`keras.utils.to_categorical()`
正如我们在“模型输入和输出”部分中所述,在加载数据时,我们可能应该将因变量向量转换为分类向量。 为此,我们将在以下代码的帮助下使用`keras.utils.to_categorical()`
```py
train_y = to_categorical(train_y)
......@@ -129,21 +129,21 @@ x = Dense(128, activation='relu', name="hidden3")(x)
# 输出层
我们的输出层将包含 10 个神经元,一个观察值可能属于其中的每个可能的类。 这对应于我们在*和*向量上使用`to_categorical()`时施加的编码:
我们的输出层将包含 10 个神经元,一个观察值可能属于其中的每个可能的类。 这对应于我们在`y`向量上使用`to_categorical()`时施加的编码:
```py
prediction = Dense(10, activation='softmax', name="output")(x)
```
如您所见,我们正在使用的激活称为 **softmax** 。 让我们讨论一下`softmax`是什么,以及为什么有用。
如您所见,我们正在使用的激活称为 **softmax**。 让我们讨论一下`softmax`是什么,以及为什么有用。
# Softmax 激活
想象一下,如果不是使用深层神经网络,而是使用 *k* logistic 回归,其中每个回归都预测单个类中的成员。 逻辑回归的集合(每个类一个)如下所示:
想象一下,如果不是使用深层神经网络,而是使用`k` logistic 回归,其中每个回归都预测单个类中的成员。 逻辑回归的集合(每个类一个)如下所示:
![](img/692e8ef0-cac8-4075-88ce-2928f2998fc2.png)
使用这组逻辑回归的问题是每个逻辑回归的输出都是独立的。 想象一下,在我们的集合中,这些逻辑回归中的一些不确定其所属类别的成员资格,从而导致多个答案在 *P(Y = k)= 0.5* 附近。 这使我们无法将这些输出用作 *k* 类中类成员资格的总体概率,因为它们不一定总和为 1。
使用这组逻辑回归的问题是每个逻辑回归的输出都是独立的。 想象一下,在我们的集合中,这些逻辑回归中的一些不确定其所属类别的成员资格,从而导致多个答案在`P(Y = k) = 0.5`附近。 这使我们无法将这些输出用作`k`类中类成员资格的总体概率,因为它们不一定总和为 1。
Softmax 压缩所有这些逻辑回归的输出,使它们的总和为 1,从而将其用作整体类成员的概率,从而为我们提供了帮助。
......@@ -151,7 +151,7 @@ Softmax 压缩所有这些逻辑回归的输出,使它们的总和为 1,从
![](img/b9124ebe-5e9a-4178-8c8e-43ec2619e9ed.png)
*(对于 j = 1 至 k 类,其中 zj / zk 是属于该 k 的逻辑回归)*
(对于`j = 1``k`类,其中`zj / zk`是属于`k`的逻辑回归)
因此,如果将`softmax`函数放在我们先前的回归集的前面,我们将得到一组类别概率,它们合计为 1,可以用作 k 个类别中成员资格的概率。 这改变了我们的整体功能,如下所示:
......@@ -184,7 +184,7 @@ print(softmax(z))
# 放在一起
现在我们已经涵盖了各个部分,让我们看一下我们的整个网络。 这看起来与我们之前在本书中介绍的模型相似。 但是,我们使用的损失函数`categorical_crossentropy`在本章的*成本函数*部分中介绍了。
现在我们已经涵盖了各个部分,让我们看一下我们的整个网络。 这看起来与我们之前在本书中介绍的模型相似。 但是,我们使用的损失函数`categorical_crossentropy`在本章的“成本函数”部分中介绍了。
我们将使用以下代码定义网络:
......@@ -219,9 +219,9 @@ model.fit(x=data["train_X"], y=data["train_y"],
callbacks=callbacks)
```
我正在使用与以前相同的回调。 我没有使用我们在第 4 章*中构建的 ROC AUC 回调,因为使用 Keras 进行了二进制分类*,因为 ROC AUC 没有为多分类器明确定义。
我正在使用与以前相同的回调。 我没有使用我们在第 4 章“使用 Keras 进行二进制分类”中构建的 ROC AUC 回调,因为 ROC AUC 没有为多分类器明确定义。
存在一些针对该问题的创造性解决方案。 例如,[**通过成对分析**](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.108.3250&rep=rep1&type=pdf)[**ROC 表面下体积**](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.14.2427&rep=rep1&type=pdf)都是出色的论文,都可以解决这个问题。 但是,实际上,这些方法及其度量标准很少在 R 中使用,最常在 R 中实现。因此,到目前为止,让我们坚持使用多类准确性,并且远离 R。
存在一些针对该问题的创造性解决方案。 例如,[**通过成对分析近似多类 ROC**](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.108.3250&rep=rep1&type=pdf) [**ROC 表面下体积**](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.14.2427&rep=rep1&type=pdf)都是出色的论文,都可以解决这个问题。 但是,实际上,这些方法及其度量标准很少在 R 中使用,最常在 R 中实现。因此,到目前为止,让我们坚持使用多类准确性,并且远离 R。
让我们观看 TensorBoard 在我们的模型训练中:
......@@ -233,7 +233,7 @@ model.fit(x=data["train_X"], y=data["train_y"],
# 在多类模型中使用 scikit 学习指标
和以前一样,我们可以借鉴 scikit-learn 的指标来衡量我们的模型。 但是,为此,我们需要从模型的 *y* 的分类输出中进行一些简单的转换,因为 scikit-learn 需要使用类标签,而不是二进制类指示器。
和以前一样,我们可以借鉴 scikit-learn 的指标来衡量我们的模型。 但是,为此,我们需要从模型的`y`的分类输出中进行一些简单的转换,因为 scikit-learn 需要使用类标签,而不是二进制类指示器。
为了取得飞跃,我们将使用以下代码开始进行预测:
......@@ -260,7 +260,7 @@ print(classification_report(test_y, y_hat))
# 通过辍学控制差异
减少深度神经网络过度拟合的一种非常好的方法是采用一种称为 **dropout** 的技术。 Dropout 完全按照其说的去做,它使神经元脱离隐藏层。 运作方式如下。
减少深度神经网络过度拟合的一种非常好的方法是采用一种称为**丢弃法**的技术。 Dropout 完全按照其说的去做,它使神经元脱离隐藏层。 运作方式如下。
通过每个小批量,我们将随机选择关闭每个隐藏层中的节点。 想象一下,我们在某个隐藏层中实施了 dropout,并且我们选择了 drop rate 为 0.5。 这意味着,对于每个小批量,对于每个神经元,我们都掷硬币以查看是否使用该神经元。 这样,您可能会随机关闭该隐藏层中大约一半的神经元:
......@@ -311,7 +311,7 @@ def build_network(input_features=None):
**正则化**是控制过度拟合的另一种方法,当模型中的各个权重增大时会对其进行惩罚。 如果您熟悉线性模型(例如线性和逻辑回归),那么它与在神经元级别应用的技术完全相同。 可以使用两种形式的正则化,称为 L1 和 L2,来对神经网络进行正则化。 但是,由于 L2 正则化计算效率更高,因此几乎总是在神经网络中使用它。
快速地,我们需要首先规范化成本函数。 如果我们将 *C <sub>0</sub>* ,分类交叉熵作为原始成本函数,则正规化的`cost`函数将如下所示:
快速地,我们需要首先规范化成本函数。 如果我们将`C[0]`,分类交叉熵作为原始成本函数,则正规化的`cost`函数将如下所示:
![](img/490b7c75-bc4c-47de-aff0-35881df64129.png)
......
......@@ -20,7 +20,7 @@
# 找到一个巨人然后站在他的肩膀上
沙特尔的伯纳德(Bernard of Chartres)被赋予了通过借鉴他人的发现来学习的概念。 但是,正是艾萨克·牛顿(Isaac Newton)说:“ *如果我进一步观察,那就是站在巨人*的肩膀上。” 要明确的是,这正是我在这里建议的。
沙特尔的伯纳德(Bernard of Chartres)被赋予了通过借鉴他人的发现来学习的概念。 但是,正是艾萨克·牛顿(Isaac Newton)说:“如果我进一步观察,那就是站在巨人的肩膀上。” 要明确的是,这正是我在这里建议的。
如果我要设计一个用于新的深度学习问题的网络体系结构,我要做的第一件事就是尝试找到一个令人满意的方式,以前已经解决了类似的问题。 尽管可能没有人能够解决您面临的任务,但可能存在类似的情况。
......@@ -74,7 +74,7 @@
**网格搜索**只是尝试尝试所有事物,或者至少尝试离散事物,然后报告我们用蛮力找到的最佳超参数的最佳组合。 可以保证在我们确定的参数空间中找到最佳解决方案,以及其他较差的解决方案。
网格搜索对于深度学习并不是很实用。 除了最基本的深度神经网络,我们无法现实地探索所有可能参数的每个可能值。 使用**随机搜索**,我们从每个参数分布中随机抽样,并尝试其中的 *n* ,其中*(n *每个示例训练时间)*是我们的时间预算 愿意分配给这个问题
网格搜索对于深度学习并不是很实用。 除了最基本的深度神经网络,我们无法现实地探索所有可能参数的每个可能值。 使用**随机搜索**,我们从每个参数分布中随机抽样,并尝试其中的`n`,其中(n x 每个示例训练时间)是我们愿意分配给这个问题的时间预算
**贝叶斯优化**方法使用以前的观察结果来预测接下来要采样的超参数集。 尽管贝叶斯优化方法通常胜过蛮力技术,但目前的研究表明,与穷举方法相比,性能提升较小。 此外,由于贝叶斯方法取决于先前的经验,因此无论如何都不会令人尴尬地并行进行。
......@@ -145,7 +145,7 @@ search.fit(data["train_X"], data["train_y"])
print(search.best_params_)
```
在 Tesla K80 GPU 实例上,在上述网格上拟合第 5 章,*,使用 Keras 进行多类分类*所使用的 MNIST 模型。 在完成本节之前,让我们看一下搜索的一些输出,如以下代码所示:
在 Tesla K80 GPU 实例上,在上述网格上拟合第 5 章,“使用 Keras 进行多类分类”所使用的 MNIST 模型。 在完成本节之前,让我们看一下搜索的一些输出,如以下代码所示:
```py
Using TensorFlow backend.
......@@ -165,9 +165,9 @@ tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow devic
Hyperband 是一项超参数优化技术,由 Lisha Li,Kevin Jamieson,Guilia DeSalvo,Afshin Rostamizadeh 和 Ameet Talwalker 于 2016 年在伯克利开发。 您可以在[这里](https://arxiv.org/pdf/1603.06560.pdf)阅读他们的原始论文。
想象一下,就像我们在`RandomSearchCV`中所做的那样,随机采样许多潜在的超参数集。 完成`RandomSearchCV`后,它将选择一个单一的超参数配置作为其采样的*最*。 Hyperband 利用这样的思想,即即使经过少量迭代,最佳的超参数配置也可能会胜过其他配置。 Hyperband 中的乐队来自土匪,指的是基于多臂土匪技术(用于优化竞争选择之间的资源分配以优化性能为目标的技术)的勘探与开发。
想象一下,就像我们在`RandomSearchCV`中所做的那样,随机采样许多潜在的超参数集。 完成`RandomSearchCV`后,它将选择一个单一的超参数配置作为其采样的*最优值*。 Hyperband 利用这样的思想,即即使经过少量迭代,最佳的超参数配置也可能会胜过其他配置。 Hyperband 中的乐队来自土匪,指的是基于多臂土匪技术(用于优化竞争选择之间的资源分配以优化性能为目标的技术)的勘探与开发。
使用 Hyperband,我们可以尝试一些可能的配置集( *n* ),仅训练一次迭代。 作者将迭代一词留作多种可能的用途。 但是,我将时代作为迭代。 一旦完成第一个培训循环,就将根据性能对结果进行配置。 然后,对该列表的上半部分进行大量迭代的训练。 然后重复进行减半和剔除的过程,我们得到了一些非常小的配置集,我们将针对在搜索中定义的完整迭代次数进行训练。 与在每种可能的配置中搜索最大历元相比,此过程使我们在更短的时间内获得了*最佳*超参数集。
使用 Hyperband,我们可以尝试一些可能的配置集(`n`),仅训练一次迭代。 作者将迭代一词留作多种可能的用途。 但是,我将时代作为迭代。 一旦完成第一个培训循环,就将根据性能对结果进行配置。 然后,对该列表的上半部分进行大量迭代的训练。 然后重复进行减半和剔除的过程,我们得到了一些非常小的配置集,我们将针对在搜索中定义的完整迭代次数进行训练。 与在每种可能的配置中搜索最大历元相比,此过程使我们在更短的时间内获得了*最佳*超参数集。
在本章的 GitHub 存储库中,我在`hyperband.py`中包括了`hyperband`算法的实现。 此实现主要源自 FastML 的实现,您可以在[这个页面](http://fastml.com/tuning-hyperparams-fast-with-hyperband/)中找到。 要使用它,您需要首先实例化一个`hyperband`对象,如以下代码所示:
......
# 从头开始训练 CNN
深度神经网络彻底改变了计算机视觉。 实际上,我认为在最近几年中计算机视觉的进步已经使深层神经网络成为许多消费者每天使用的东西。 我们已经在第 5 章*中使用计算机视觉分类器,使用 Keras 进行多类分类*,其中我们使用了深度网络对手写数字进行分类。 现在,我想向您展示卷积层如何工作,如何使用它们以及如何在 Keras 中构建自己的卷积神经网络以构建更好,功能更强大的深度神经网络来解决计算机视觉问题。
深度神经网络彻底改变了计算机视觉。 实际上,我认为在最近几年中计算机视觉的进步已经使深层神经网络成为许多消费者每天使用的东西。 我们已经在第 5 章“使用 Keras 进行多类分类”中使用计算机视觉分类器,其中我们使用了深度网络对手写数字进行分类。 现在,我想向您展示卷积层如何工作,如何使用它们以及如何在 Keras 中构建自己的卷积神经网络以构建更好,功能更强大的深度神经网络来解决计算机视觉问题。
我们将在本章介绍以下主题:
......@@ -10,7 +10,7 @@
# 卷积介绍
经过训练的卷积层由称为过滤器的许多特征检测器组成,这些特征检测器在输入图像上滑动作为移动窗口。 稍后我们将讨论过滤器内部的内容,但现在它可能是一个黑匣子。 想象一个已经训练过的过滤器。 也许该滤镜已经过训练,可以检测图像中的边缘,您可能会认为这是黑暗与明亮之间的过渡。 当它经过图像时,其输出表示它检测到的特征的存在和位置,这对于第二层滤镜很有用。 稍微扩展一下我们的思想实验,现在想象第二个卷积层中的一个滤波器,它也已经被训练过了。 也许这个新层已经学会了检测直角,其中存在由上一层找到的两个边缘。 不断地我们去; 随着我们添加图层,可以了解更多复杂的功能。 特征层次结构的概念对于卷积神经网络至关重要。 下图来自 Honglak Lee 等人的*使用卷积深度信念网络*的无监督学习层次表示[2011],非常好地说明了特征层次结构的概念:
经过训练的卷积层由称为过滤器的许多特征检测器组成,这些特征检测器在输入图像上滑动作为移动窗口。 稍后我们将讨论过滤器内部的内容,但现在它可能是一个黑匣子。 想象一个已经训练过的过滤器。 也许该滤镜已经过训练,可以检测图像中的边缘,您可能会认为这是黑暗与明亮之间的过渡。 当它经过图像时,其输出表示它检测到的特征的存在和位置,这对于第二层滤镜很有用。 稍微扩展一下我们的思想实验,现在想象第二个卷积层中的一个滤波器,它也已经被训练过了。 也许这个新层已经学会了检测直角,其中存在由上一层找到的两个边缘。 不断地我们去; 随着我们添加图层,可以了解更多复杂的功能。 特征层次结构的概念对于卷积神经网络至关重要。 下图来自 Honglak Lee 等人的《使用卷积深度信念网络的无监督学习层次表示》[2011],非常好地说明了特征层次结构的概念:
![](img/c63ca1b1-5e19-423c-8174-d62c87d452bc.png)
......@@ -20,7 +20,7 @@
在上一节中,我说过卷积层是一组充当特征检测器的过滤器。 在我们深入探讨该体系结构之前,让我们回顾一下卷积实际上是什么的数学。
让我们首先手动将以下 *4 x 4* 矩阵与 *3 x 3* 矩阵卷积,我们将其称为过滤器。 卷积过程的第一步是获取过滤器与 *4 x 4* 矩阵的前九个框的按元素乘积:
让我们首先手动将以下`4 x 4`矩阵与`3 x 3`矩阵卷积,我们将其称为过滤器。 卷积过程的第一步是获取过滤器与`4 x 4`矩阵的前九个框的按元素乘积:
![](img/47bb2d29-6a4a-46d5-8193-51c49ee62817.jpg)
......@@ -34,7 +34,7 @@
MNIST 是一个灰度示例,我们可以将每个图像表示为二维矩阵中从 0 到 255 的像素强度值。 但是,大多数时候,我们将使用彩色图像。 彩色图像实际上是三维矩阵,其中维是图像高度,图像宽度和颜色。 这将为图像中的每个像素生成一个矩阵,分别具有红色,蓝色和绿色值。
虽然我们先前展示的是二维滤波器,但我们可以通过在(高度,宽度,3(颜色))矩阵与 *3 x 3 x 3* 之间进行卷积来将其思想轻松转换为三个维度。 过滤。 最后,当我们在矩阵的所有三个轴上进行逐元素乘积运算时,仍然剩下二维输出。 提醒一下,这些高维矩阵通常称为张量,而我们正在做的就是使它们流动。
虽然我们先前展示的是二维滤波器,但我们可以通过在(高度,宽度,3(颜色))矩阵与`3 x 3 x 3`之间进行卷积来将其思想轻松转换为三个维度。 过滤。 最后,当我们在矩阵的所有三个轴上进行逐元素乘积运算时,仍然剩下二维输出。 提醒一下,这些高维矩阵通常称为张量,而我们正在做的就是使它们流动。
# 卷积层
......@@ -45,7 +45,7 @@ from keras.layers import Conv2D
Conv2D(64, kernel_size=(3,3), activation="relu", name="conv_1")
```
在此层中,有 64 个独立的单元,每个单元都有 *3 x 3 x 3* 滤波器。 卷积操作完成后,每个单元都会像传统的完全连接层中那样为输出添加偏置和非线性(稍后会详细介绍该术语)。
在此层中,有 64 个独立的单元,每个单元都有`3 x 3 x 3`滤波器。 卷积操作完成后,每个单元都会像传统的完全连接层中那样为输出添加偏置和非线性(稍后会详细介绍该术语)。
在继续之前,让我们快速浏览一下示例的维度,以便确保我们都在同一页面上。 想象一下,我们有一个 *32 x 32 x 3* 的输入图像。 现在,我们将其与上述卷积层进行卷积。 该层包含 64 个过滤器,因此输出为 *30 x 30 x 64* 。 每个滤波器输​​出一个 *30 x 30* 矩阵。
......
......@@ -109,7 +109,7 @@ LSTM 的另一个关键特性是内部自循环,使设备可以长期积累信
这迫使我们明确定义将展开 LSTM 的程度。 在下面的示例中,您将看到这一点,当我们创建一组特定的时间步长时,将为每个观察值进行训练。
您选择反向传播的步骤数当然是超参数。 如果您需要从序列中很远的地方学习一些东西,显然您必须在序列中包括很多滞后。 您需要能够捕获相关期间。 另一方面,捕获太多的时间步长也不可取。 该网络将变得非常难以训练,因为随着时间的流逝,梯度会变得非常小。 这是前面几章中描述的消失梯度问题的另一个实例。
您选择反向传播的步骤数当然是超参数。 如果您需要从序列中很远的地方学习一些东西,显然您必须在序列中包括很多滞后。 您需要能够捕获相关期间。 另一方面,捕获太多的时间步长也不可取。 该网络将变得非常难以训练,因为随着时间的流逝,梯度会变得非常小。 这是前面几章中描述的梯度消失问题的另一个实例。
如您想象的那样,您可能想知道是否选择太大的时间步会使程序崩溃。 如果渐变驱动得太小以至于变为 NaN,那么我们将无法完成更新操作。 解决此问题的一种常见且简便的方法是在某些上下阈值之间固定梯度,我们将其称为梯度裁剪。 默认情况下,所有 **Keras** 优化器均已启用渐变剪切。 如果您的梯度被剪裁,则在该时间范围内网络可能不会学到很多东西,但是至少您的程序不会崩溃。
......
......@@ -113,7 +113,7 @@ docB = "the dog sat on my bed"
这就是计数向量化。 这是我们工具箱中最简单的矢量化技术。
计数向量化的问题在于我们使用了很多根本没有太多意义的单词。 实际上,英语中最常用的单词(*和*)占我们所讲单词的 7,是第二个最受欢迎的单词(的*)出现频率的两倍 )。 语言中单词的分布是幂律分布,[这是称为 Zipf 定律的基础](https://en.wikipedia.org/wiki/Zipf%27s_law)。 如果我们从计数中构造文档矩阵,那么最终得到的数字将包含很多信息,除非我们的目标是查看谁最经常使用**。*
计数向量化的问题在于我们使用了很多根本没有太多意义的单词。 实际上,英语中最常用的单词(*和*)占我们所讲单词的 7%,是第二个最受欢迎的单词(的*)出现频率的两倍 )。 语言中单词的分布是幂律分布,[这是称为 Zipf 定律的基础](https://en.wikipedia.org/wiki/Zipf%27s_law)。 如果我们从计数中构造文档矩阵,那么最终得到的数字将包含很多信息,除非我们的目标是查看谁最经常使用**。*
更好的策略是根据单词在文档中的相对重要性对单词进行加权。 为此,我们可以使用 TF-IDF。
......@@ -395,7 +395,7 @@ model.fit(x=data["X_train"], y=data["y_train"],
![](img/d2911d59-77b8-4069-9bee-621999666e5d.png)
这里首先要注意的是,在第 1 阶段,网络正在做的相当不错。 此后,它迅速开始过拟合。 总体而言,我认为我们的结果相当不错。 在第 1 阶段,我们会在验证集上正确预测约 86的时间的情绪。
这里首先要注意的是,在第 1 阶段,网络正在做的相当不错。 此后,它迅速开始过拟合。 总体而言,我认为我们的结果相当不错。 在第 1 阶段,我们会在验证集上正确预测约 86% 的时间的情绪。
尽管此案例研究涵盖了本章到目前为止已讨论的许多主题,但让我们再来看一个可以在嵌入层使用预训练的单词向量与我们学习的单词向量进行比较的地方。
......
......@@ -381,7 +381,7 @@ encoder_model.save('char_s2s_encoder.h5')
decoder_model.save('char_s2s_decoder.h5')
```
您会注意到,我以前没有像通常那样定义验证或测试集。 这次,按照博客文章中给出的示例,我将让 Keras 随机选择 20的数据作为验证,这在示例中可以很好地工作。 如果要使用此代码实际进行机器翻译,请使用单独的测试集。
您会注意到,我以前没有像通常那样定义验证或测试集。 这次,按照博客文章中给出的示例,我将让 Keras 随机选择 20% 的数据作为验证,这在示例中可以很好地工作。 如果要使用此代码实际进行机器翻译,请使用单独的测试集。
训练模型适合后,我将保存所有三个模型,并将它们再次加载到为推理而构建的单独程序中。 我这样做是为了使代码保持简洁,因为推理代码本身非常复杂。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册