在前几章中,我们看到了如何建立深度学习模型来解决分类和回归问题的实例,例如图像分类和平均用户视图预测。同样,我们发展了一种关于如何构建深度学习问题的直觉。在本章中,我们将研究如何解决不同类型的问题和不同的调整,我们最终可能会使用这些问题来改进我们的模型在我们的问题上的性能。 在本章中,我们将探讨以下问题:
不同于分类和回归的其他形式的问题评估、理解过度拟合、拟合不足和解决这些问题的技术问题为深度学习准备数据请记住,我们在本章中讨论的大部分主题都是机器学习和深度学习所共有的,除了我们用来解决过度拟合问题的一些技术,比如中断(Dropout)。
在前面的所有示例中,我们试图解决分类(预测猫或狗)或回归(预测用户在平台上的平均时间)问题。所有这些都是监督学习的例子,其目标是绘制训练示例与其目标之间的关系,并利用它们对不可见数据进行预测。 监督学习只是机器学习的一部分,机器学习还有其他不同的部分。机器学习的三种不同方式:
有监督机器学习无监督机器学习增强学习在深度学习和机器学习领域,大多数成功的用例都属于监督学习。我们在这本书中所涵盖的大多数例子也将是监督学习的一部分。一些常见的有监督学习的例子:
分类问题:分类狗和猫回归问题:预测股票价格,板球比赛分数,等等。图像分割:进行像素级分类。对于自驾驶汽车,重要的是识别每个像素所属的是由其相机拍摄的照片的什么部分,像素可以属于汽车、行人、树木、公共汽车等。语音识别:Google,Alexa和Siri是语音识别的好例子。语言翻译:从一种语言到另一种语言的翻译当没有标签数据时,非监督学习技术通过可视化和压缩帮助理解数据。在无监督学习中常用的两种技术是:
聚类降维聚类有助于将所有相似的数据点组合在一起。 降维有助于减少维数,使我们能够可视化高维数据以找到任何隐藏的模式。
增强学习是最不流行的机器学习范畴。它没有在现实世界中找到成功的用例。然而,最近几年它发生了变化,Google DeepMind的团队能够成功地构建基于强化学习的系统,并能够赢得AlphaGo游戏的世界冠军。这种技术进步,一台计算机可以在游戏中击败人类,被认为需要几十年的时间才能实现。然而,将深度学习与强化学习相结合,能够比任何人预期的要快得多。这些技术已经开始看到早期的成功,可能需要几年才能成为主流。 在这本书中,我们将主要集中在监督技术和一些非监督技术,这些技术是专门用于深度学习的。例如,生成网络,用于创建一种特定风格的图像,称为样式转移和生成对抗性网络。
在前面几章中,我们使用了许多术语,如果您只是进入机器学习或深度学习空间,那么这些术语对您来说可能是全新的。我们将列出许多机器学习中常用的术语,这些术语也在深度学习文献中使用。
样例或输入或数据点(Sample or input or data point):在上一章中看到的图像分类问题中,每一幅图像都可以被称为样例、输入或数据点。预测或输出(Prediction or output):我们的算法生成的值作为输出,例如,在前面的示例中,我们的算法将特定的图像预测为0,这是给cat的标签,所以0是我们的预测或输出。目标或标签(Target or label):图像的实际标记标签。损失值或预测误差(Loss value or prediction error):预测值与实际值之间距离的某种度量。数值越小,准确度就越好。类别(Classes):给定数据集的可能值或标签集。在上一章的例子中,我们有两个类猫和狗。二元分类(Binary classification):一个分类任务,其中每个输入示例都应该被归类为两个独占类别之一。多类别分类(Multi-class classification):一个分类任务,在这个任务中,每个输入示例可以分为两个以上的不同类别。多标签分类(Multi-label classification):一个输入示例可以标记为多个标签,例如,用它提供的不同类型的食物(如意大利、墨西哥和印度)标记一家餐馆。另一个常用的例子是图像中的对象检测,其中算法识别图像中的不同对象。标量回归(Scalar regression):每个输入数据点将与一个标量质量相关联,该标量质量是一个数字。一些例子可以预测房价、股票价格和板球的得分。向量回归(Vector regression):其中,算法需要预测多个标量。一个好的示例是当您尝试识别图像中包含鱼的位置的边界框时。为了预测包围框,您的算法需要预测四个标量,这些标量表示一个正方形的边。批处理(Batch):在大多数情况下,我们在一堆称为批处理的输入样本上训练我们的算法。批处理大小通常从2到256不等,具体取决于GPU的内存。每个批次的权重也会被更新,因此算法往往比在单个示例上训练时学习得更快。纪元(Epoch):在完整的数据集中运行该算法称为一个纪元。在几个纪元训练(更新重量)是很常见的在我们在上一章中讨论的图像分类示例中,我们将数据分成两个不同的部分,一个用于训练,另一个用于验证。使用单独的数据集测试算法的性能是一种很好的做法,因为在训练集上测试算法可能不会给算法带来真正的泛化能力。在大多数真实的用例中,基于验证的准确性,我们经常以不同的方式调整算法,例如添加更多的层或不同的层,或者使用我们将在本章后面部分讨论的不同技术。因此,你调整算法的选择很有可能是基于验证数据集的。通过这种方式训练的算法往往在训练数据集和验证数据集中表现良好,但是不能很好地推广到看不见的数据上。这是由于你的验证数据集的信息泄漏,这影响了我们调整算法。 为了避免信息泄漏的问题并提高泛化能力,将数据集分成三个不同部分通常是常见的做法,即训练、验证和测试数据集,我们使用训练和验证集进行算法的所有超参数调整。最后,当整个训练完成后,你将在测试数据集上测试算法。我们讨论的参数有两种类型。一个是算法中使用的参数或权重,其由优化器或在反向传播期间调整;另一组参数,称为“超参数”,控制网络中使用的层数、学习速率和其他类型的参数,这些参数通常会改变体系结构,通常是手动完成的。 某一特定算法在训练集中表现更好,而在验证或测试集上不能执行的现象称为过度拟合,或者缺乏算法的泛化能力,另一种相反的现象是,算法不能对训练集执行,这称为欠拟合。我们将研究不同的策略,这些策略将帮助我们克服过度拟合和不足拟合的问题。 让我们先看一下可用于拆分数据集的各种策略,然后再看过拟合和欠拟合。
使用Holdout数据集的最佳方法是: 1、在训练集上训练算法 2、根据验证数据集执行超参数优化 3、迭代执行前两个步骤,直到达到预期的性能。 4、在冻结算法和超参数后,在测试数据集中对其进行评估
避免将数据分成两部分,因为这可能导致信息泄漏。在同一数据集中进行的训练和测试是明确的no-no,因为它不保证算法的泛化。有三种常用的拒绝策略可以用来将数据分成训练和验证集。它们如下: 1、简单二划分校验(Simple holdout validation) 2、K-fold验证(K-fold validation) 3、迭代K-fold验证(Iterated k-fold validation)
将数据的一部分设置为测试数据集,保留哪一部分可能是非常具体的问题,并可能在很大程度上取决于可用的数据量。对于一些问题尤其是像计算机视觉及NLP领域的,收集标记过的数据可能是非常昂贵的,因此,为了保持30%的大比例可能使得算法难以学习,因为它将具有较少的数据来训练。因此,根据数据可用性,需要明智地选择数据集的一部分。拆分测试数据后,将其分开,直到确定算法及其超级参数。为问题选择最佳的超级参数,需要选择一个单独的验证数据集。为了避免过度拟合,我们通常将可用数据分成三个不同的集合,如下图所示: 我们在上一章中简单地执行了前面的图以创建我们的验证集。让我们看一下实施的快速过程: 这是最简单的抵抗策略之一,并且也是最早开始使用的。具有小数据集使用这种方法存在一个缺点。验证数据集或测试数据集可能在统计上不能代表手头的数据。我们可以很容易地识别出这一点,方法是在保存数据之前对数据进行洗牌。如果得到的结果不一致,那么我们需要使用更好的方法。为了避免这个问题,我们通常会使用K-fold或迭代K-fold。
保留测试拆分的数据集的一部分,然后将整个数据集划分为k-fold,其中k可以是任意数量,通常从2到10变化。在任何给定的迭代中,我们持有一个块进行验证,并在其余的块上对算法进行训练。最后的分数通常是通过k-fold得到的所有分数的平均值。下图显示k-fold验证的实现,其中k为4,也就是说,数据被分成四部分: 使用k-fold验证数据集时要注意的一个关键问题是,它非常昂贵,因为您在数据集的不同部分上运行了几次该算法,对于计算密集型算法来说,这可能是非常昂贵的,特别是在计算机视觉算法领域,有时,训练一个算法可能需要几分钟到几天的时间。所以,明智地使用这个技巧。
为了使事情变得复杂和健壮,你可以在每次创建延迟验证数据集时对数据进行洗牌,这对于解决性能上的小提升可能会对业务产生巨大影响的问题是非常有帮助的。如果你的案例是快速构建和部署算法,你可以在性能差异中牺牲几个百分点,那么这种方法可能不值得。这一切归结为你想要解决的问题,以及精确性对你来说意味着什么。 在拆分数据时,可能需要考虑其他一些问题,例如: 1、数据代表性 2、时间敏感性 3、数据冗余
在我们在上一章中看到的例子中,我们把图像归类为狗或猫。让我们以一个场景为例,所有的图像都被排序,前60%的图像是狗,其余的是猫,如果选择前80%作为训练数据集,选择其余数据集作为验证集,则对此数据集进行拆分,则验证数据集将不是数据集的真实表示形式,因为它只包含猫图像。因此,在这种情况下,我们应该注意的是,我们有一个良好的混合,在分割或进行分层抽样之前对数据进行洗牌。分层抽样是指从每个类别中提取数据点,以创建验证和测试数据集。
让我们以预测股票价格为例。我们有一月到十二月的数据。在这种情况下,如果我们进行混洗或分层采样,那么我们就会发现信息泄漏,因为价格可能对时间敏感。因此,以一种不存在信息泄漏的方式创建验证数据集。在这种情况下,选择12月数据作为验证数据集可能更有意义。在股票价格的情况下,它比这更复杂,因此在选择验证分割时,特定领域的知识也会发挥作用。
重复在数据中很常见。应注意使训练、验证和测试集中的数据是唯一的。如果有重复的,那么模型可能不能很好地泛化到看不见的数据上。
我们已经研究了不同的方法来分割我们的数据集来构建我们的评估策略。在大多数情况下,我们收到的数据可能不是我们可以很容易地用于训练的格式。在本节中,我们将介绍一些预处理技术和特征工程技术。虽然大多数特征工程技术都是特定领域的,特别是在计算机视觉和文本领域,但也有一些常见的特征工程技术。我们将在本章中讨论这一问题。
神经网络的数据预处理是一种使数据更适合于深层学习算法进行训练的过程,以下是一些常用的数据预处理步骤: 1、向量化 2、正则化 3、损失值 4、特征提取
数据以各种格式出现,如文本、声音、图像和视频。需要做的第一件事就是把数据转换成Pytorch Tensors。在前面的示例中,我们使用torchvision实用程序函数将Python成像库(PIL)图像转换为张量对象,虽然大部分的复杂性都被Pytorch torchvision库提取出来,在Chapter 7,生成网络中,当我们处理递归神经网络(RNNs)时,我们将看到文本数据如何被转换为PyTorch张量。对于涉及结构化数据的问题,数据已经以矢量化格式存在;我们需要做的就是把它们转换成Pytorch Tensors。
在将数据传递给任何机器学习算法或深度学习算法之前,规范特征是一种常见的做法。它有助于更快地训练算法,并有助于实现更高的性能。规范化是指将数据表示为属于某一特定特性的过程,使其均值为零,标准差为1。
在狗和猫的例子中,我们在上一章中介绍的分类,我们使用ImageNet数据集中可用的数据的平均值和标准偏差对数据进行了标准化。我们之所以选择ImageNet数据集的均值和标准差作为示例,是因为我们使用的是ResNet模型的权重,这是在ImageNet上预先训练的。将每个像素值除以255也是一种常见的做法,这样所有的值都在0到1之间,特别是当不使用预训练权重时。
归一化也适用于涉及结构化数据的问题。正如我们正在处理房价预测问题,可能会有不同的特点可能会在不同的尺度上下降。例如,距离最近的机场的距离和房子的楼龄是不同尺度的变量或特征。将它们与神经网络结合使用,可以防止梯度收敛。简单地说,损失可能不会像预期的那样减少。因此,在对算法进行训练之前,我们应该小心地将规范化应用于任何类型的数据。为了确保算法或模型的性能更好,请确保数据遵循以下特征: 1、取小值:通常在0到1之间的范围内。 2、相同范围:确保所有功能都在相同的范围内。
在实际机器学习问题中,缺失值是很常见的。从我们先前预测房价的例子来看,房屋年龄的某些领域可能会丢失。用其他情况下可能不会发生的数字替换丢失的值通常是安全的。该算法将能够识别该模式还有其他技术可用于处理更特定于域的缺失值。
特征工程是利用有关特定问题的领域知识来创建可以传递给模型的新变量或特性的过程。为了更好地理解,让我们来看看一个销售预测问题,假设我们有关于促销日期、假期、竞争者的开始日期、与竞争对手的距离以及某一天的销售的信息。在现实世界中,可能有数以百计的功能可以用来预测商店的价格。在预测销售时,可能会有一些重要的信息。一些重要的特性或派生值是: 1、离下一次促销还有几天 2、离下一个假期还有几天 3、竞争对手营业的天数
可以从领域知识中提取出更多这样的特征。对于任何机器学习算法或深度学习算法来说,提取这类特征对于算法本身来说都是很有挑战性的。对于某些领域,尤其是在计算机视觉和文本领域,现代深度学习算法帮助我们摆脱特征工程。除了这些领域,好的特性工程在以下方面总是有帮助: 1、用较少的计算资源可以更快地解决这个问题。 2、深度学习算法可以通过使用大量的数据来学习特征,而无需手工设计它们。因此,如果对数据很紧,那么关注好的特性工程是很好的。
理解过拟合和拟合不足是建立成功的机器学习和深度学习模型的关键。在本章的开头,我们简要介绍了过拟合及拟合不足,让我们详细地看一看它们,以及如何解决它们。
机器学习和深度学习中常见的问题是过度拟合或不泛化。我们说,当某一特定算法在训练数据集上表现良好但无法在未见数据集或验证和测试数据集上执行时,它便是过拟合的。这主要是因为算法识别了过于特定于训练数据集的模式。简单地说,我们可以说该算法找到了一种记忆数据集的方法,以便它在训练数据集上表现得非常好,而无法在未见数据上执行。为了避免算法过度拟合,可以使用不同的技术。其中一些技术是: 1、获取更多的数据 2、缩小网络规模 3、应用权重调整器 4、应用中断
如果能够获得更多算法可以对其进行训练的数据,这可以帮助算法通过关注一般的模式,而不是特定于小数据的模式,避免过度拟合。有几种情况下获得更多标记的数据可能是一个挑战。
有一些技术,如数据增强,可以用于在与计算机视觉相关的问题上生成更多的培训数据。数据增强是一种技术,可以通过执行不同的操作(如旋转、裁剪和生成更多数据)来稍微调整图像。有了足够的领域理解,如果捕获实际数据的代价很高,您也可以创建合成数据。当无法获得更多数据时,还有其他方法可以帮助避免过度拟合。让我们看看他们。
网络的规模一般是指网络中使用的层数或权重参数的数量。在我们在上一章中看到的图像分类的例子中,我们使用了一个Resnet模型,它有18块由内部不同层组成的块。Pytorch中的TorchVision库采用不同大小的Resnet模型,从18个区块开始,并达到152个区块。例如,如果我们使用具有152个块的Resnet块并且该模型是过度拟合的,那么我们可以尝试使用具有101个块或50个块的Resnet块尝试使用Resnet块。在我们构建的自定义体系结构中,我们可以简单地删除一些中间线性层,从而防止我们的PyTorch模型记忆训练数据集。让我们看一个示例代码片段,它演示了减少网络规模的确切含义: 前面的体系结构有三个线性层,让我们说它超越了我们的训练数据。因此,让我们重新创建容量降低的体系结构: 前面的体系结构只有两个线性层,从而减少了容量,进而可能避免过度匹配训练数据集。
帮助解决过度拟合或泛化问题的关键原则之一是建立更简单的模型。一种用于构建更简单模型的技术是通过减小其规模来降低体系结构的复杂性,另一件重要的事情是确保网络的权重不会采用更大的值。当模型的权重较大时,正则化通过惩罚模型来提供网络上的约束。无论何时模型使用较大的权重,正则化都会开始并增加损失值,从而损害模型。有两种可能的正则化。: 1、L1正则化:权重系数绝对值之和添加到成本,通常称为权重的L1范数 2、L2正则化:将所有权重系数的平方和加到成本中。它常被称为权重的l2范数。 PyTorch通过在优化器中启用weight_decay参数,提供了一种使用L2正则化的简单方法: 默认情况下,权重衰减参数被设置为零.对于权重衰减,我们可以尝试不同的值;像1e-5这样的小值在大多数情况下都是有效的。
Dropout(师姐说不是翻译成中断啦)是最常用的和最强大的用于深度学习的正则化技术之一。它是由Hinton和他在多伦多大学的学生开发的。在训练期间,将Dropout应用于模型的中间层。让我们看看如何在生成10个值的线性层输出上应用Dropout的示例: 上图显示了当将Dropout应用于具有0.2的阈值的线性层输出时发生的情况。它随机掩蔽或归零20%的数据,这样模型就不会依赖于一组特定的权重或模式,因此而过拟合。
让我们看另一个例子,其中我们应用了一个阈值为0.5的Dropout:
通常情况下,在0.2到0.5的范围内使用Dropout阈值是很常见的。并且在不同的层施加Dropout。Dropout只在训练期间使用,在测试期间,测试值按等于Dropout的因素缩小。Pytorch将Dropout提供为另一层,从而使其更易于使用。下面的代码片段演示了如何在PyTorch中使用Dropout层。
Dropout接受一个名为training的参数,需要在训练阶段将其设置为True,在验证或测试阶段设置为false。
有时,我们的模型可能无法从我们的训练数据中学习到任何模式,当模型即使在它所训练的数据集上也不能很好地执行时,这一点就很明显了。当模型不合适时,最常见的一件事是获取更多的数据,以便对算法进行训练。另一种方法是通过增加层数或增加模型使用的权重或参数的数量来增加模型的复杂性。在我们真正过拟合数据集之前,最好不要使用上述任何正则化技术。
在本节中,我们将制定解决任何机器学习问题的解决方案框架,通过将问题陈述、评估、特征工程和避免过拟合结合在一起来解决任何机器学习问题。
要定义这个问题,我们需要两件重要的事情:输入数据和问题的类型。
我们的输入数据和目标标签将是什么?例如,我们想根据他们的特色对餐馆进行分类,比如意大利、墨西哥、中国和印度的食物,通过客户的评论。要开始处理这种问题,我们需要手动手动将训练数据标注为可能的类别之一,然后才能在其上训练算法。在这个阶段,数据可用性通常是一个具有挑战性的因素。
识别问题的类型将有助于确定它是否为二进制分类、多分类、标量回归(房屋定价)或向量回归(边界框)。有时,我们可能需要使用一些无监督的技术,如聚类和降维。一旦确定了问题类型,就更容易确定应该使用哪种体系结构、损失函数和优化器。
一旦我们有了输入并确定了问题的类型,那么我们就可以开始使用以下假设来构建我们的模型: 1、可以帮助将输入映射到输出的数据中存在隐藏模式 2、我们拥有足以让模型学习的数据。
作为机器学习从业者,我们需要理解,我们可能无法建立一个具有一些输入数据和目标数据的模型。让我们以预测股价为例。让我们假设我们有代表历史价格、历史表现和竞争细节的特性,但我们可能仍然无法建立一个有意义的模型来预测股票价格,因为股票的价格实际上可能受到各种其他因素的影响,如国内政治形势、国际政治形势、自然因素,例如具有良好的季风以及许多其它可能无法由我们的输入数据表示的因素。因此,任何机器学习或深度学习模型都不可能识别模式。因此,基于域,仔细选择可以作为目标变量的真实指标的特征。所有这些都可能是模型欠拟合的原因。
机器学习还有另一个重要的假设。未来或看不见的数据将接近模式,正如历史数据所描述的那样。有时,我们的模型可能会失败,因为历史数据中从来不存在模式,或者模型训练过的数据没有涵盖某些季节性或模式。
成功的衡量将由您的业务目标直接决定。例如,当试图预测下一次机器故障将发生在风车中时,我们会更感兴趣地了解该模型能够预测故障的次数。使用简单的精度可能是错误的度量,因为大多数情况下,模型将正确地预测机器何时不会发生故障,因为这是最常见的输出。假设我们的准确率为98%,而且模型每次在预测故障率时都是错误的–这些模型在现实世界中可能没有任何用处。选择正确的成功度量对于业务问题至关重要。通常,这类问题有不平衡的数据集。
对于平衡分类问题,如果所有类都具有可能的精度,ROC和曲线下的面积(AUC)是常见的度量。对于不平衡的数据集,我们可以使用精确和回忆。对于排序问题,我们可以使用平均精度。
一旦决定了如何评估当前进度,就必须决定如何在数据集上进行评估。我们可以从三种不同的方法中选择一种评估我们的进展的方法。 1、Holdout验证集:最常用的,尤其是当您有足够的数据时 2、K-fold交叉验证:当您有有限的数据时,此策略可帮助您对数据的不同部分进行评估,从而帮助我们更好地查看性能 3、迭代k-fold验证:当您希望进一步提高模型的性能时,这种方法将有所帮助。
通过矢量化,将不同格式的可用数据转换成张量(Tensors)类型,并确保所有特征的缩放和标准化。
创建一个非常简单的模型,该模型优于基线得分。在我们以前的狗和猫的例子中,分类,基线精确度应该是0.5,我们的简单模型应该能够战胜这个分数。如果我们无法击败基线分数,则可能输入数据不包含进行必要预测所需的必要信息。记住,不要在这一步引入任何正规化或中断。
为了使模型工作我们必须做出三个重要的选择: 1、最后一层的选择:对于回归,应该是生成标量值作为输出的线性层。对于向量回归问题,它将是同一个线性层,产生多个标量输出。对于一个边框,它输出四个值。对于二进制分类,常用的是Sigmoid,而对于多类分类,则是Softmax。 2、损失函数的选择:问题的类型将帮助您决定损失函数。对于一个回归问题,如预测房价,我们使用均方误差,对于分类问题,我们使用分类交叉熵。 3、最优化:选择正确的优化算法及其一些超参数是相当棘手的,我们可以通过不同的实验来找到它们。对于大多数用例,ADAM或RMSPROP优化算法工作得更好,我们将介绍一些可用于选择学习速率的技巧。
让我们总结一下在我们的深度学习算法中,对于网络的最后一层,我们将使用什么样的损失函数和激活函数。
一旦你有了一个有足够能力超过你的基线得分的模型,就增加你的基线能力。增加您的架构容量的一些简单的技巧如下: 1、向现有体系结构添加更多层 2、向现有层添加更多权重 3、更多的训练
我们通常用足够数量的Epochs训练模型。当训练精度不断提高,验证精度停止增加,并且可能开始下降时,停止训练,这就是模型开始过度拟合的地方。一旦我们达到这个阶段,我们就需要应用正则化技术。
请记住,层数(the number of layers)、层规模( size of layers)和历元数(epochs)可能会随着问题的不同而变化。较小的体系结构可以用于简单的分类问题,但对于面部识别等复杂问题,我们的体系结构需要足够的表现力,而模型需要比简单分类问题训练更多次。
找出调整模型或算法的最佳方法是过程中最棘手的部分之一,因为有许多参数需要调整。我们可以调优以使模型正则化的一些参数是: 1、添加中断:这可以很复杂,因为这可以在不同的层之间添加,并且发现最佳位置通常是通过实验来完成的。添加中断的百分比也很棘手,因为它完全取决于我们试图解决的问题说明。通常良好的做法是从一个小数目开始,例如0.2。 2、尝试不同的架构:我们可以尝试不同的体系结构、激活函数、层数、权重或图层内部的参数。 3、添加L1或L2正则化:我们可以利用正规化 4、尝试不同的学习率:我们可以使用不同的技术,我们将在本章后面的部分中讨论这些技术。 5、添加更多特性或更多数据:这可能是通过获取更多数据或增强数据来完成的。 我们将使用我们的验证数据集调整所有上述超参数。当我们不断地迭代和调整超参数时,最终可能会出现数据泄漏问题。因此,我们应该确保我们有数据进行测试。如果模型对测试数据的性能与训练和验证相比是好的,那么我们的模型很有可能在不可见的数据上表现良好。但是,如果模型不能对测试数据执行而是对验证和训练数据执行,则存在验证数据不能很好的代表真实世界数据集,在这种情况下,我们可以使用k-fold验证或迭代k-fold验证数据集。
找到正确的训练模式是一个正在进行的研究领域,在这个研究领域已经取得了很大的进展。Pytorch提供了一些技术来调整学习速率,并提供在torch.optim.lr_sheduler包封装中。我们将探讨PyTorch提供的一些动态选择学习速率的技术:
StepLR:这个调度程序有两个重要的参数。一个是步长,这表示学习速率必须改变多少个时期,而第二参数是gamma,这决定了要改变学习速率的多少。
例如:对于学习速率为0.01,步长为10,gamma大小为0.1,对于每10次遍历数据集,学习率随gamma次数而变化。也就是说,在前10次中,学习率变化到0.001,到最后,在接下来的10次中,学习率变化到0.0001。下面的代码解释了StepLR的实现:
MultiStepLR:MultiSteppr类似于STEPPLR,但以下事实除外:步骤不在规则的间隔内;步骤作为列表给出。例如,它被作为10,15,30的列表给出,对于每个步骤值,学习速率乘以它的gamma值。下面的代码解释了MultiStepLR的实现:
ExponentialLR:这将将学习速率设置为每个时期的学习速率与gamma值的倍数。
ReduceLROnPlateau:这是最常用的学习策略之一。在这种情况下,当特定的度量(如训练损失、验证损失或准确性停滞)时,学习速率会发生变化。将学习率降低2至10倍是一种常见的做法。ReduceLROnPlateau可按以下方式实现:
在本章中,我们介绍了用于解决机器学习或深度学习问题的一些常见的最佳实践。我们讨论了各种重要步骤,例如创建问题语句、选择算法,打基线分数,增加模型的容量,直到其超出数据集,应用能够防止过度拟合的正则化技术、,提高泛化能力,调整模型或算法的不同参数,并探索不同的学习策略,以最优、更快的方式训练深度学习模式。
在下一章中,我们将涵盖负责建立最先进的卷积神经网络(CNNS)的不同组件。我们还将包括转移学习,这将帮助我们在几乎没有数据的情况下训练图像分类器。我们还将介绍帮助我们更快地训练这些算法的技术。 emmm, 先翻译一遍,,,,