提交 9e2fcacf 编写于 作者: W wizardforcel

2021-01-16 17:43:30

上级 b874702e
......@@ -717,7 +717,7 @@ test_data = datasets.CIFAR10('data', train=False, download=True, \
注意
我们不应该主要依靠批量归一化来处理过拟合。
我们不应该主要依靠批量归一化来处理过拟合。
如前几节所述,通过减去批量平均值并除以批量标准偏差,可以对隐藏层的输出进行归一化。
......
......@@ -1413,7 +1413,7 @@
图 4.24:结果图显示了集合的准确率
可以看出,在第 15 个时期之后,过拟合开始影响模型。
可以看出,在第 15 个时期之后,过拟合开始影响模型。
10. Check the model's accuracy on the testing set:
......@@ -1523,7 +1523,7 @@
图 4.26:结果图显示了集合的准确率
通过添加数据扩充,可以改善模型的性能,并减少发生的过拟合。
通过添加数据扩充,可以改善模型的性能,并减少发生的过拟合。
4. Calculate the accuracy of the resulting model on the testing set.
......
......@@ -2,7 +2,7 @@
人们可以通过少量示例学习新事物。 当受到刺激时,人类似乎能够快速理解新概念,然后在将来认识到这些概念的变体。 孩子可以从一张图片中学会识别狗,但是机器学习系统需要大量示例来学习狗的特征并在将来识别它们。 作为一个领域,机器学习在各种任务(例如分类和 Web 搜索以及图像和语音识别)上都取得了巨大的成功。 但是,这些模型通常在没有大量数据(示例)可供学习的情况下表现不佳。 本书的主要动机是使用很少的示例来训练模型,而无需进行大量的重新训练就能够将其概括为不熟悉的类别。
深度学习在机器学习的发展中发挥了重要作用,但它也需要大量的数据集。 不同的技术(例如正则化)可以减少在低数据环境中的过拟合,但不能解决较少的训练示例所固有的问题。 此外,大型数据集导致学习缓慢,需要使用梯度下降法进行许多权重更新。 这主要是由于 ML 算法的参数方面,在该方面需要慢慢学习训练示例。 相反,许多已知的非参数模型(例如最近邻居)不需要任何训练,但是性能取决于有时任意选择的距离度量(例如 L2 距离)。 一次学习是计算机视觉中的对象分类问题。 尽管大多数基于 ML 的对象分类算法都需要数百或数千张图像和非常大的数据集进行训练,但是一次学习的目的是从一个或仅几个训练图像中学习有关对象类别的信息。 在本章中,我们将学习一键式学习的基础知识,并探索其实际应用。
深度学习在机器学习的发展中发挥了重要作用,但它也需要大量的数据集。 不同的技术(例如正则化)可以减少在低数据环境中的过拟合,但不能解决较少的训练示例所固有的问题。 此外,大型数据集导致学习缓慢,需要使用梯度下降法进行许多权重更新。 这主要是由于 ML 算法的参数方面,在该方面需要慢慢学习训练示例。 相反,许多已知的非参数模型(例如最近邻居)不需要任何训练,但是性能取决于有时任意选择的距离度量(例如 L2 距离)。 一次学习是计算机视觉中的对象分类问题。 尽管大多数基于 ML 的对象分类算法都需要数百或数千张图像和非常大的数据集进行训练,但是一次学习的目的是从一个或仅几个训练图像中学习有关对象类别的信息。 在本章中,我们将学习一键式学习的基础知识,并探索其实际应用。
本章将涵盖以下主题:
......
......@@ -34,7 +34,7 @@
# 了解 MAML 背后的逻辑
MAML 的目的是为模型的参数提供良好的初始化,从而以较少的梯度步骤实现对新任务的最佳快速学习。 它还尝试避免过拟合的情况,这种情况在训练具有较少数据架构的神经网络时会发生。 下图是 MAML 的表示形式:
MAML 的目的是为模型的参数提供良好的初始化,从而以较少的梯度步骤实现对新任务的最佳快速学习。 它还尝试避免过拟合的情况,这种情况在训练具有较少数据架构的神经网络时会发生。 下图是 MAML 的表示形式:
![](img/b3cabe38-594a-4604-a177-7da4089882bb.png)
......@@ -84,7 +84,7 @@ MAML 的目的是为模型的参数提供良好的初始化,从而以较少的
![](img/7f72e13d-4f5d-4cb6-99c3-fd2394d5cc99.png)
由于无法使用模仿学习损失函数来训练机器人,因此 DAML 提出了行为克隆目标的**暂时损失**,该目标也充当日志空间中的正则化项。 众所周知,在任何情况下都要进行强正则化对于避免过拟合非常重要,尤其是在单次学习的情况下。
由于无法使用模仿学习损失函数来训练机器人,因此 DAML 提出了行为克隆目标的**暂时损失**,该目标也充当日志空间中的正则化项。 众所周知,在任何情况下都要进行强正则化对于避免过拟合非常重要,尤其是在单次学习的情况下。
# 了解 LSTM 元学习器
......
......@@ -106,7 +106,7 @@
![Figure 1.7 – Example of underfitting and overfitting ](img/B12365_01_7.jpg)
图 1.7 –拟合不足和过拟合的示例
图 1.7 –拟合不足和过拟合的示例
当我们的模型由于缺乏功能,数据不足或模型规格不足而无法很好地拟合数据时,我们将其称为,**欠拟合**。 我们注意到我们数据的梯度越来越大,并怀疑如果使用多项式,则模型可能更合适。 例如![](img/Formula_01_015.png)。 稍后我们将看到,由于神经网络的复杂结构,欠拟合很少成为问题:
......@@ -114,9 +114,9 @@
![Figure 1.8 – Sample output of overfitting ](img/B12365_01_8.jpg)
图 1.8 –过拟合的样本输出
图 1.8 –过拟合的样本输出
我们现在有一个房子,其大小为 **110 平方米**,以预测价格。 根据我们的直觉,由于该房屋比 **100 平方米**房屋大,我们希望这所房屋的价格会更高,大约 **340,000 美元**。 使用我们的拟合多项式模型,我们可以看到预测的价格实际上低于小房子,约为 **320,000 美元**。 我们的模型适合我们训练有素的数据,但不能很好地推广到一个新的,看不见的数据点。 这就是,称为**过拟合**。 由于过拟合,重要的是不要根据训练的数据评估模型的性能,因此我们需要生成单独的一组数据以评估我们的数据。
我们现在有一个房子,其大小为 **110 平方米**,以预测价格。 根据我们的直觉,由于该房屋比 **100 平方米**房屋大,我们希望这所房屋的价格会更高,大约 **340,000 美元**。 使用我们的拟合多项式模型,我们可以看到预测的价格实际上低于小房子,约为 **320,000 美元**。 我们的模型适合我们训练有素的数据,但不能很好地推广到一个新的,看不见的数据点。 这就是,称为**过拟合**。 由于过拟合,重要的是不要根据训练的数据评估模型的性能,因此我们需要生成单独的一组数据以评估我们的数据。
### 训练与测试
......@@ -199,7 +199,7 @@ ReLU 是非常简单的非线性函数,当`x <= 0`,返回`y = 0`;当`x > 0
## 神经网络中的过拟合
我们看到,在回归的情况下,可以添加太多功能,从而有可能使网络过拟合。 这样一来,模型可以很好地拟合训练数据,但不能很好地推广到看不见的测试数据集。 这是神经网络中的一个普遍问题,因为模型复杂性的提高意味着通常有可能将函数拟合到不一定要泛化的数据训练集中。 以下是数据集每次向前和向后传递(称为历元)后训练和测试数据集上的总损失的图:
我们看到,在回归的情况下,可以添加太多功能,从而有可能使网络过拟合。 这样一来,模型可以很好地拟合训练数据,但不能很好地推广到看不见的测试数据集。 这是神经网络中的一个普遍问题,因为模型复杂性的提高意味着通常有可能将函数拟合到不一定要泛化的数据训练集中。 以下是数据集每次向前和向后传递(称为历元)后训练和测试数据集上的总损失的图:
![Figure 1.14 – Test and training epochs ](img/B12365_01_14.jpg)
......
......@@ -232,7 +232,7 @@ self.fc4 = nn.Linear(98,10)
self.dropout = nn.Dropout(p = 0.2)
辍学是一种规范化我们的神经网络以防止过拟合的方法。 在每个训练纪元上,对于已应用丢包的层中的每个节点,都有可能(此处定义为`p`= 20% )该层内的每个节点将不用于训练/反向传播 。 这意味着,在训练时,我们的网络会针对过拟合变得健壮,因为在训练过程的每次迭代中都不会使用每个节点。 这可以防止我们的网络过于依赖网络中特定节点的预测。
辍学是一种规范化我们的神经网络以防止过拟合的方法。 在每个训练纪元上,对于已应用丢包的层中的每个节点,都有可能(此处定义为`p`= 20% )该层内的每个节点将不用于训练/反向传播 。 这意味着,在训练时,我们的网络会针对过拟合变得健壮,因为在训练过程的每次迭代中都不会使用每个节点。 这可以防止我们的网络过于依赖网络中特定节点的预测。
## 定义前向通行证
......
......@@ -503,7 +503,7 @@ net.train()
torch.save(net.state_dict(),'model.pkl')
在为三个时期训练了我们的模型之后,我们注意到了两个主要方面。 我们将首先从好消息开始-我们的模型正在学习一些东西! 我们的训练损失不仅下降了,而且在每个时期之后,我们在验证集上的损失也下降了。 这意味着我们的模型仅在三个时期后就可以更好地预测看不见的数据的情绪! 坏消息是,我们的模型过拟合。 我们的训练损失比验证损失要低得多,这表明虽然我们的模型已经学会了如何很好地预测训练数据集,但这并不能推广到看不见的数据集。 预期会发生这种情况,因为我们使用的训练数据非常少(仅 2,400 个训练语句)。 当我们训练整个嵌入层时,很可能许多单词在训练集中只出现一次,而在验证集中却没有出现,反之亦然,这使得该模型几乎不可能归纳出其中所有不同的单词 我们的语料库。 在实践中,我们希望在更大的数据集上训练我们的模型,以使我们的模型学习如何更好地归纳。 我们还在很短的时间内训练了该模型,并且没有执行超参数调整来确定模型的最佳迭代。 随意尝试更改模型中的某些参数(例如训练时间,隐藏状态大小,嵌入大小等),以提高模型的性能。
在为三个时期训练了我们的模型之后,我们注意到了两个主要方面。 我们将首先从好消息开始-我们的模型正在学习一些东西! 我们的训练损失不仅下降了,而且在每个时期之后,我们在验证集上的损失也下降了。 这意味着我们的模型仅在三个时期后就可以更好地预测看不见的数据的情绪! 坏消息是,我们的模型过拟合。 我们的训练损失比验证损失要低得多,这表明虽然我们的模型已经学会了如何很好地预测训练数据集,但这并不能推广到看不见的数据集。 预期会发生这种情况,因为我们使用的训练数据非常少(仅 2,400 个训练语句)。 当我们训练整个嵌入层时,很可能许多单词在训练集中只出现一次,而在验证集中却没有出现,反之亦然,这使得该模型几乎不可能归纳出其中所有不同的单词 我们的语料库。 在实践中,我们希望在更大的数据集上训练我们的模型,以使我们的模型学习如何更好地归纳。 我们还在很短的时间内训练了该模型,并且没有执行超参数调整来确定模型的最佳迭代。 随意尝试更改模型中的某些参数(例如训练时间,隐藏状态大小,嵌入大小等),以提高模型的性能。
尽管我们的模型过拟合,但它仍然学到了一些东西。 现在,我们希望在最终的测试数据集上评估我们的模型。 我们使用之前定义的测试加载器对数据执行了最后一次传递。 在此过程中,我们遍历所有测试数据并使用最终模型进行预测:
......
......@@ -437,7 +437,7 @@ model.eval()
这两个步骤将模型设置为评估模式,忽略任何遗漏函数,并确保未计算和更新梯度。 这是因为我们希望在评估性能时冻结模型中的权重,并确保不使用验证数据对模型进行训练,因为我们希望将其与用于训练模型的数据分开保存 。
现在,我们只需要与数据迭代器一起循环调用训练和评估函数,即可训练模型。 我们首先定义希望模型训练的时期数。 我们还定义了我们的模型迄今为止所实现的最低验证损失。 这是因为我们只希望使训练后的模型具有最低的验证损失(即性能最佳的模型)。 这意味着,如果我们的模型训练了多个时期并开始过拟合,那么只有这些模型的最佳性能将被保留,这意味着选择大量时期的后果会更少。
现在,我们只需要与数据迭代器一起循环调用训练和评估函数,即可训练模型。 我们首先定义希望模型训练的时期数。 我们还定义了我们的模型迄今为止所实现的最低验证损失。 这是因为我们只希望使训练后的模型具有最低的验证损失(即性能最佳的模型)。 这意味着,如果我们的模型训练了多个时期并开始过拟合,那么只有这些模型的最佳性能将被保留,这意味着选择大量时期的后果会更少。
我们将最低的验证损失初始化为无穷大,开始于:
......
......@@ -187,7 +187,7 @@ corpus_name = "movie_corpus"
self.addWord(word)
我们可以做的加快模型训练的一件事是减少词汇量。 这意味着任何嵌入层都将更小,并且模型中学习的参数总数会更少。 一种简单的方法是从我们的词汇表中删除所有低频词。 在我们的数据集中仅出现一次或两次的任何单词都不太可能具有巨大的预测能力,因此在最终模型中将它们从语料库中删除并替换为空白标记可以减少我们训练模型所需的时间并减少过拟合而无需 对我们模型的预测有很大的负面影响。
我们可以做的加快模型训练的一件事是减少词汇量。 这意味着任何嵌入层都将更小,并且模型中学习的参数总数会更少。 一种简单的方法是从我们的词汇表中删除所有低频词。 在我们的数据集中仅出现一次或两次的任何单词都不太可能具有巨大的预测能力,因此在最终模型中将它们从语料库中删除并替换为空白标记可以减少我们训练模型所需的时间并减少过拟合而无需 对我们模型的预测有很大的负面影响。
4. To remove low-frequency words from our vocabulary, we can implement a **trim** function. The function first loops through the word count dictionary and if the occurrence of the word is greater than the minimum required count, it is appended to a new list:
......
......@@ -6,7 +6,7 @@
![](img/d6e62091-b4e4-489a-b2e8-926df04945ed.png)
神经网络所看到的只是数字集,它试图识别数据中的模式。 通过训练,神经网络学会识别输入中的模式。 但是,某些特定的架构在应用于特定类别的问题时比其他结构具有更好的性能。 一个简单的神经网络架构由三种层组成:**输入**层,**输出**层和**隐藏**层。 当隐藏层不止一个时,它称为**深度** **神经网络**
神经网络所看到的只是数字集,它试图识别数据中的模式。 通过训练,神经网络学会识别输入中的模式。 但是,某些特定的架构在应用于特定类别的问题时比其他结构具有更好的性能。 一个简单的神经网络架构由三种层组成:**输入**层,**输出**层和**隐藏**层。 当隐藏层不止一个时,它称为**深度神经网络**
以下是深度神经网络的表示:
......@@ -33,7 +33,7 @@
pip install torchvision
```
对于其他安装方法,您可以访问[这个页面](https://pypi.org/project/torchvision/)。 上一章*使用 PyTorch 使用张量*的其余依赖关系保持不变。
对于其他安装方法,您可以访问[这个页面](https://pypi.org/project/torchvision/)。 上一章“使用 PyTorch 张量”的其余依赖关系保持不变。
# 定义神经网络类
......@@ -154,7 +154,7 @@ TorchVision 的`datasets`模块附带了许多受欢迎的数据集; 如果机
# 创建一个全连接网络
在本食谱中,我们将扩展在先前食谱中定义的类*定义神经网络类*。 在*定义神经网络类*配方中,我们仅创建了所需架构的组件; 现在我们将把所有这些部分捆绑在一起,以建立一个明智的网络。 我们各层的进度将从 784 个单位增加到 256 个,然后是 128 个,最后是 10 个单位的输出层。
在本食谱中,我们将扩展在先前食谱“定义神经网络类”中定义的类。 在“定义神经网络类”配方中,我们仅创建了所需架构的组件; 现在我们将把所有这些部分捆绑在一起,以建立一个明智的网络。 我们各层的进度将从 784 个单位增加到 256 个,然后是 128 个,最后是 10 个单位的输出层。
在本食谱中,我们将使用类的构造函数中定义的组件来研究网络架构。 然后,我们将完成网络类定义并创建其对象。
......@@ -230,7 +230,7 @@ TorchVision 的`datasets`模块附带了许多受欢迎的数据集; 如果机
在配方中,通过建立前向网络来完成网络,其中我们将构造函数中定义的网络组件捆绑在一起。 用`nn.Module`定义的网络需要定义`forward()`方法。 它采用输入张量,并按照正向方法中定义的操作顺序,将其通过网络类中`__init__()`方法中定义的网络组件。
当传递输入时,将引用模型对象的名称自动调用 forward 方法。 `nn.Module`自动创建将在正向方法中使用的权重和偏差张量。 线性单位本身定义了线性函数,例如 *xW + B* ; 要具有非线性功能,我们需要插入非线性激活函数,在这里我们使用最流行的激活函数之一 ReLU,尽管您可以在 PyTorch 中使用其他可用的激活函数。
当传递输入时,将引用模型对象的名称自动调用 forward 方法。 `nn.Module`自动创建将在正向方法中使用的权重和偏差张量。 线性单位本身定义了线性函数,例如`xW + B`; 要具有非线性功能,我们需要插入非线性激活函数,在这里我们使用最流行的激活函数之一 ReLU,尽管您可以在 PyTorch 中使用其他可用的激活函数。
我们的输入层有 784 个单位(从 28 x 28 像素开始),第一层具有 ReLU 激活的 256 个单位,然后具有 ReLU 激活的 128 个单位,最后有 softmax 激活的 10 个单位。 我们通过 softmax 压缩最终层输出的原因是因为我们希望有 1 个输出类的概率高于所有其他类,并且输出概率之和应等于 1。softmax 函数的参数`dim=1`为 确保在输出的各列中采用 softmax。 然后,我们使用模型类创建一个对象,并使用`print(model)`打印该类的详细信息。
......@@ -244,7 +244,7 @@ TorchVision 的`datasets`模块附带了许多受欢迎的数据集; 如果机
# 定义损失函数
机器学习模型在接受训练时,可能会在预测输出和实际输出之间存在一些偏差,这种差异称为模型的**误差**。 让我们计算该误差的函数称为**损耗** **函数****误差** **函数**。 此功能提供了一种度量标准,用于评估所有可能的解决方案并选择最优化的模型。 损失函数必须能够将模型的所有属性减少到一个单一的数字,以便该损失函数值的改善代表更好的模型。
机器学习模型在接受训练时,可能会在预测输出和实际输出之间存在一些偏差,这种差异称为模型的**误差**。 让我们计算该误差的函数称为**损失函数****误差函数**。 此功能提供了一种度量标准,用于评估所有可能的解决方案并选择最优化的模型。 损失函数必须能够将模型的所有属性减少到一个单一的数字,以便该损失函数值的改善代表更好的模型。
在本食谱中,我们将使用 PyTorch 中可用的损失函数为我们的时装数据集定义损失函数。
......@@ -323,7 +323,7 @@ TorchVision 的`datasets`模块附带了许多受欢迎的数据集; 如果机
# 实施优化器
在本食谱中,我们将学习优化器。 在先前的食谱*中,定义了损失函数*,我们谈到了误差和误差函数,并了解到,为了获得一个好的模型,我们需要最小化计算出的误差。 **反向传播**是神经网络从错误中学习的一种方法。 错误用于修改权重,以使错误最小化。 优化功能负责修改权重以减少误差。 优化函数计算相对于权重的误差的偏导数。 导数显示正斜率的方向,因此我们需要反转梯度的方向。 **优化器**函数将模型参数和损失函数结合在一起,以迭代方式修改模型参数以减少模型误差。 可以考虑将优化器摆在模型权重的基础上,根据模型与实际输出的预测差异来获得最佳模型,而损失函数则通过指示优化器是对还是错来充当指导。
在本食谱中,我们将学习优化器。 在先前的食谱“定义损失函数”中,我们谈到了误差和误差函数,并了解到,为了获得一个好的模型,我们需要最小化计算出的误差。 **反向传播**是神经网络从错误中学习的一种方法。 错误用于修改权重,以使错误最小化。 优化功能负责修改权重以减少误差。 优化函数计算相对于权重的误差的偏导数。 导数显示正斜率的方向,因此我们需要反转梯度的方向。 **优化器**函数将模型参数和损失函数结合在一起,以迭代方式修改模型参数以减少模型误差。 可以考虑将优化器摆在模型权重的基础上,根据模型与实际输出的预测差异来获得最佳模型,而损失函数则通过指示优化器是对还是错来充当指导。
学习速率是优化器的超参数,它控制权重的更新量。 学习速度确保了权重不会大量更新,从而使算法根本无法收敛,并且误差越来越大。 然而,与此同时,权重的更新不应太低,以至于永远需要花费成本函数/误差函数的最小值。
......@@ -385,7 +385,7 @@ TorchVision 的`datasets`模块附带了许多受欢迎的数据集; 如果机
>>running_loss = 0
```
8.我们将在训练图像加载器中遍历每个图像,这在本章前面的食谱中定义:*定义神经网络类*
8.我们将在训练图像加载器中遍历每个图像,这在本章前面的食谱“定义神经网络类”中定义
```py
>>for image, label in trainloader:
......@@ -475,13 +475,13 @@ Training loss: 0.2596
# 实施辍学
在本食谱中,我们将研究实现辍学。 在训练神经网络模型或一般任何机器学习模型时,我们可能会遇到的一种较常见的现象是过拟合。 当模型学习提供给训练的数据而不是在求解空间上进行泛化时,就会发生过度拟合,也就是说,模型学习的是训练数据的细微细节和噪声,而不是掌握全局,因此在效果上表现不佳。 新数据。 正则化是防止模型过度拟合的过程。
在本食谱中,我们将研究实现辍学。 在训练神经网络模型或一般任何机器学习模型时,我们可能会遇到的一种较常见的现象是过拟合。 当模型学习提供给训练的数据而不是在求解空间上进行泛化时,就会发生过拟合,也就是说,模型学习的是训练数据的细微细节和噪声,而不是掌握全局,因此在效果上表现不佳。 新数据。 正则化是防止模型过拟合的过程。
使用辍学是神经网络中最流行的正则化技术之一,在这种技术中,训练时会关闭随机选择的神经元,也就是说,神经元的作用会暂时从正向传递中移除,而向后传递不会影响权重 ,因此没有一个神经元或神经元子集能获得模型的所有决定力; 相反,所有神经元都被迫为预测做出积极贡献。
辍学可以直观地理解为创建大量集成模型,学习在一个模型的大定义下捕获各种功能。
在本食谱中,我们将研究如何在模型定义中添加缺失,以通过防止过拟合来改善整体模型性能。 应当记住,辍学仅在训练时才适用; 但是,在测试和实际预测期间,我们希望所有神经元都做出贡献。
在本食谱中,我们将研究如何在模型定义中添加缺失,以通过防止过拟合来改善整体模型性能。 应当记住,辍学仅在训练时才适用; 但是,在测试和实际预测期间,我们希望所有神经元都做出贡献。
# 怎么做...
......
......@@ -36,7 +36,7 @@ CNN 使用过滤器从输入图像中拾取特征; 具有足够数量的滤镜
我们需要了解 CNN 的另外两个关键元素,如下所示:
* **跨**:这是在图像的下一个小块上使用滤镜应用卷积网络之前,我们水平和垂直移动的像素数。
* **跨**:这是在图像的下一个小块上使用滤镜应用卷积网络之前,我们水平和垂直移动的像素数。
* **填充**:这是我们在卷积时应用于图像边缘的策略,具体取决于我们是在卷积后要保持张量的尺寸不变还是仅在滤镜适合的情况下应用卷积 与输入图像。 如果要保持尺寸不变,则需要对边缘进行零填充,以使原始尺寸在卷积后与输出匹配。 这称为**相同填充**。 但是,如果我们不想保留原始尺寸,则会将过滤器无法完全容纳的位置截断,这称为**有效填充**
这是这两个填充的示意图:
......@@ -147,7 +147,7 @@ Conv2d(3, 16, kernel_size=(3, 4), stride=(3, 3), padding=(1, 2))
这是使用池化层的主要原因:
* **减少计算数量**:通过减少输入的空间尺寸而不会损失滤波器,我们可以获得更好的计算性能,因此我们减少了训练所需的时间以及计算资源。
* **防止过拟合**:随着空间尺寸的减小,我们减少了模型具有的参数数量,从而降低了模型的复杂性并有助于我们更好地概括。
* **防止过拟合**:随着空间尺寸的减小,我们减少了模型具有的参数数量,从而降低了模型的复杂性并有助于我们更好地概括。
* **位置不变性**:这使 CNN 可以捕获图像中的特征,而不管特征在给定图像中的位置。 假设我们正在尝试建立一个分类器来检测芒果。 芒果位于图像的中心,左上角,右下角还是图像中的任何位置都没关系-需要对其进行检测。 池化层可以帮助我们。
池的类型很多,例如最大池,平均池,和池等。 但是,最大池化是最受欢迎的。 以与处理卷积层相同的方式,我们将定义一个窗口并在该窗口中应用所需的池化操作。 我们将根据层的跨度水平和垂直地滑动窗口。
......@@ -375,7 +375,7 @@ PyTorch 无法直接处理图像像素,需要将其内容作为张量。 为
# 怎么做...
为了充分利用此食谱,您应该完成*探索转换*食谱,因为此食谱是我们对转换工作的延续。 在本食谱中,我们将介绍一些我们可以使用`torchvision`中的`transform`模块执行的流行数据增强:
为了充分利用此食谱,您应该完成“探索转换”食谱,因为此食谱是我们对转换工作的延续。 在本食谱中,我们将介绍一些我们可以使用`torchvision`中的`transform`模块执行的流行数据增强:
1. 我们将从导入`torchvision`开始:
......@@ -603,7 +603,7 @@ pip install torchvision==0.x.x
# 定义 CNN 架构
到目前为止,在本章中,我们一直在研究 CNN 的不同组成部分,以及如何将数据集中的数据加载到可以馈入 CNN 模型的格式中。 在本食谱中,我们将通过到目前为止已经看到的完成模型的组件来定义 CNN 模型架构。 这与我们在第 2 章,“处理神经网络”中介绍的全连接神经网络非常相似。 为了更好地理解此配方,从第 2 章,“处理神经网络”修改全连接神经网络的模型定义将是一个好主意。 我们将在 CIFAR10 数据集上建立图像分类模型,我们在*加载图像数据*配方中对此进行了讨论。
到目前为止,在本章中,我们一直在研究 CNN 的不同组成部分,以及如何将数据集中的数据加载到可以馈入 CNN 模型的格式中。 在本食谱中,我们将通过到目前为止已经看到的完成模型的组件来定义 CNN 模型架构。 这与我们在第 2 章,“处理神经网络”中介绍的全连接神经网络非常相似。 为了更好地理解此配方,从第 2 章,“处理神经网络”修改全连接神经网络的模型定义将是一个好主意。 我们将在 CIFAR10 数据集上建立图像分类模型,我们在“加载图像数据”配方中对此进行了讨论。
# 怎么做...
......@@ -694,7 +694,7 @@ CNN(
# 训练图像分类器
现在我们已经定义了模型,接下来的主要步骤是使用手头的数据训练该模型。 这将与我们在第 2 章,“处理神经网络”和我们全连接神经网络中进行的训练非常相似。 在本食谱中,我们将完成训练图像分类器的工作。 如果您在完成本食谱之前,先阅读了第 2 章*与神经网络**实现优化器*食谱,那将非常有用。
现在我们已经定义了模型,接下来的主要步骤是使用手头的数据训练该模型。 这将与我们在第 2 章,“处理神经网络”和我们全连接神经网络中进行的训练非常相似。 在本食谱中,我们将完成训练图像分类器的工作。 如果您在完成本食谱之前,先阅读了第 2 章的“实现优化器”食谱,那将非常有用。
# 怎么做...
......
......@@ -333,7 +333,7 @@ class RNNClassifier(nn.Module):
##### 辍学
辍学是 Apple 的机器学习工程师 Nitish Srivastava 提出的革命性想法。 它消除了对通常的正则化技术的需要,该技术在引入辍学之前一直很普遍。 借助 dropout,我们丢弃了网络中神经元之间的随机连接,因此网络必须泛化并且不能偏向任何类型的外部因素。 要删除神经元,只需将​​其输出设置为零即可。 丢弃随机神经元可防止网络共同适应,因此在很大程度上减少了过拟合。
辍学是 Apple 的机器学习工程师 Nitish Srivastava 提出的革命性想法。 它消除了对通常的正则化技术的需要,该技术在引入辍学之前一直很普遍。 借助 dropout,我们丢弃了网络中神经元之间的随机连接,因此网络必须泛化并且不能偏向任何类型的外部因素。 要删除神经元,只需将​​其输出设置为零即可。 丢弃随机神经元可防止网络共同适应,因此在很大程度上减少了过拟合。
![Dropout](img/B09475_05_05.jpg)
......@@ -437,7 +437,7 @@ class Encoder(nn.Module):
`LSTMCell``GRUCell`相似,LSTM 和 GRU 具有相似的功能 API,以使它们彼此兼容。 此外,与细胞对应物相比,LSTM 和 GRU 接受更多的参数,其中`num_layers``dropout``bidirectional`很重要。
如果将`True`作为参数,则`dropout`参数将为网络实现添加一个辍学层,这有助于避免过拟合和规范化网络。 使用 LSTM 之类的高级 API 消除了对 Python 循环的需要,并一次接受了完整的序列作为输入。 尽管可以接受常规序列作为输入,但始终建议传递打包(掩码)输入,这样可以提高性能,因为 cuDNN 后端希望输入如此。
如果将`True`作为参数,则`dropout`参数将为网络实现添加一个辍学层,这有助于避免过拟合和规范化网络。 使用 LSTM 之类的高级 API 消除了对 Python 循环的需要,并一次接受了完整的序列作为输入。 尽管可以接受常规序列作为输入,但始终建议传递打包(掩码)输入,这样可以提高性能,因为 cuDNN 后端希望输入如此。
##### 增加层数
......
......@@ -608,9 +608,9 @@ tensor(0.0821, grad_fn=<NllLossBackward>)
## 添加验证] [docs / modern-java-zh /
在第 1 节中,我们只是试图建立一个合理的训练循环以用于我们的训练数据。 实际上,您**始终**也应该具有[验证集](https://www.fast.ai/2017/11/13/validation-sets/),以便识别您是否过拟合。
在第 1 节中,我们只是试图建立一个合理的训练循环以用于我们的训练数据。 实际上,您**始终**也应该具有[验证集](https://www.fast.ai/2017/11/13/validation-sets/),以便识别您是否过拟合。
对训练数据进行改组对于[很重要,](https://www.quora.com/Does-the-order-of-training-data-matter-when-training-neural-networks)对于防止批量与过拟合之间的相关性很重要。 另一方面,无论我们是否改组验证集,验证损失都是相同的。 由于改组需要花费更多时间,因此改组验证数据没有任何意义。
对训练数据进行改组对于[很重要,](https://www.quora.com/Does-the-order-of-training-data-matter-when-training-neural-networks)对于防止批量与过拟合之间的相关性很重要。 另一方面,无论我们是否改组验证集,验证损失都是相同的。 由于改组需要花费更多时间,因此改组验证数据没有任何意义。
我们将验证集的批量大小设为训练集的两倍。 这是因为验证集不需要反向传播,因此占用的内存更少(不需要存储渐变)。 我们利用这一优势来使用更大的批量,并更快地计算损失。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册