模型发生过拟合了怎么办?分享一个调参实例(代码片段)

Tina姐 Tina姐     2023-01-04     717

关键词:

1 什么是过拟合

过拟合:当你的模型拟合的很好,但在新的,未见过的数据上不能很好地泛化时,就发生了过拟合。

简单来讲:train loss 不断下降,但 val loss 停止下降,甚至不断增大时,就说明过拟合了。

如图,train loss 在不断下降,但是 val loss 在几个 epoch 后开始上升了,和 train loss 的差距越来越大,这就是明显的过拟合。

2 一个过拟合模型

首先,我们设计一个基线模型,让它发生过拟合。

基线模型:它有 2 个 64 个元素的密集连接层。第一层的input_shape等于卷积后的所有隐藏单元(10000个)。

我们需要预测 3 个不同的情感类别,因此最后一层有 3 个元素,并使用
SOFTMAX激活。该SOFTMAX激活功能可确保三个概率加起来为1。

base_model = models.Sequential() 
base_model.add(layers.Dense(64, activation='relu', input_shape=(NB_WORDS,))) 
base_model.add(layers.Dense(64, activation='relu')) 
base_model. add(layers.Dense(3, activation='softmax')) 
base_model.name = '基线模型'

要训练的参数数量计算为(nb 个输入 x nb 个隐藏层中的元素)+ nb 个偏置项。所以每层的参数数量是:

  • 第一层:(10000 x 64) + 64 = 640064
  • 第二层:(64 x 64) + 64 = 4160
  • 最后一层:(64 x 3) + 3 = 195

一开始,验证损失下降。但是在 epoch 3 这停止了,验证损失开始迅速增加。这是模型开始过度拟合的时候。

该训练损失继续下跌,并在 epoch=20 几乎达到零,以适应训练数据.

3 处理上述过拟合

  • 通过移除层或减少隐藏层中的元素数量来降低网络容量
  • 使用正则化,这归结为为大权重的损失函数增加成本
  • 使用 Dropout 层,它将通过将某些特征设置为零来随机删除某些特征

我们会介绍这三种方法对结果带来的影响。

3.1 减少网络容量

我们的第一个模型有大量可训练的参数。这个数字越大,模型就越容易记住每个训练样本的目标类别。显然,这对于概括新数据来说并不理想。

通过降低网络的容量,你迫使它学习重要的模式或最小化损失的模式。另一方面,过多地降低网络容量会导致欠拟合。该模型将无法学习训练数据中的相关模式。因此,要把握好度。

我们通过移除一个隐藏层并将剩余层中的元素数量减少到 16 来减少网络的容量。(之前是两个 Dense, 每个 Dense 有64个元素)

reduce_model = models.Sequential() Reduce_model.add( 
layers.Dense(16, activation='relu', input_shape=(NB_WORDS,))) 
reduction_model.add(layers.Dense(3, activation='softmax')) 
reduction_model. name = '简化模型'


我们可以看到,减少容量后,模型过拟合的速度变慢了,train loss 和 val loss的差距变小了。

但是train loss 比基线模型更大,没有基线拟合的好,毕竟我们删除了一个全连接层。

3.2 使用正则化

为了解决过拟合问题,我们可以对模型应用权重正则化。这将为大权重(或参数值)的网络损失函数增加成本。因此,您将获得一个更简单的模型,该模型将被迫仅学习训练数据中的相关模式。

有L1 正则化和 L2 正则化。

  • L1 正则化将增加关于参数绝对值的成本。这将导致某些权重为零。
  • L2 正则化将增加与参数平方值有关的成本。这导致较小的权重。
reg_model = models.Sequential() 
reg_model.add(layers.Dense(64, kernel_regularizer=regularizers.l2(0.001), activation='relu', input_shape=(NB_WORDS,))) 
reg_model.add(layers.Dense(64, kernel_regularizer=regularizers.l2(0.001), activation='relu')) 
reg_model.add(layers.Dense(3, activation='softmax')) 
reg_model.name = 'L2 正则化模型'

这是keras的正则化方法,在pytorch中不是这样的,在pytorch中,最常见的正则化为

optim = torch.optim.SGD(parameters(), lr=lr, weight_decay=1e-2)

这里的 weight_decay=1e-2就是使用了L2正则化

正则化后,val loss 没有基线大,但是过拟合也十分明显。

3.3 Dropout

我们将尝试的最后一个选项是添加 Dropout 层。Dropout 层会将设定层的输出特征随机设置为零。

drop_model = models.Sequential() 
drop_model.add(layers.Dense(64, activation='relu', input_shape=(NB_WORDS,))) 
drop_model.add(layers.Dropout(0.5)) 
drop_model.add(layers.Dense( 64, activation='relu')) 
drop_model.add(layers.Dropout(0.5)) 
drop_model.add(layers.Dense(3, activation='softmax')) 
drop_model.name = 'Dropout layers model'

带有 dropout 层的模型开始过拟合的时间晚于基线模型。损失的增加速度也比基线模型慢。

乍一看,缩减模型似乎是泛化的最佳模型。但是让我们在测试集上检查一下。正则化和Dropout的结果更好。

4 总结

如上所示,所有三个选项都有助于减少过度拟合。我们设法大大提高了测试数据的准确性。在这三个选项中,带有 Dropout 层的模型在测试数据上的表现最好。当然,也可以将这些方法组合使用。

您可以在 GitHub 上找到该代码, GitHub code

文章持续更新,可以关注微信公众号【医学图像人工智能实战营】获取最新动态,一个关注于医学图像处理领域前沿科技的公众号。坚持已实践为主,手把手带你做项目,打比赛,写论文。凡原创文章皆提供理论讲解,实验代码,实验数据。只有实践才能成长的更快,关注我们,一起学习进步~

我是Tina, 我们下篇博客见~

白天工作晚上写文,呕心沥血

觉得写的不错的话最后,求点赞,评论,收藏。或者一键三连

dropout原理解析(代码片段)

 1.Dropout简介1.1Dropout出现的原因在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象。在训练神经网络的时候经常会遇到过拟合的问题,过拟合具体表现在:模型在训练... 查看详情

过拟合及其解决方式

参考技术A过拟合经常发生:先看范例:运行结果:模型在训练集上的精度是98.5%,在测试集上的精度是90.0%,显然发生过拟合了。解决办法:加入Dropout层,模型修改为:运行结果:加入权重正则化,模型修改为运行结果:模型在... 查看详情

字符识别--模型的训练与验证(代码片段)

...具备以下功能:在训练集上训练,并在验证集上进行验证模型可以保存最优的权重,并读取权重记录训练集和验证集的精度,便于调参本节将构建验证集、模型训练和验证、模型保存与加载和模型调参等几个部分构造验证集在机... 查看详情

机器学习中的模型选择和评估(代码片段)

机器学习中的模型选择和评估1.介绍2.模型拟合效果2.1欠拟合与过拟合表现方式2.2避免欠拟合与过拟合的方法3.实例分析3.1鸢尾花数据集3.2对鸢尾花数据进行聚类1.介绍在机器学习系统中,如何训练出更好的模型、如何判断模... 查看详情

欠拟合和过拟合的一般解决方法(代码片段)

简单来说,欠拟合是指模型在训练集、验证集和测试集上均表现不佳的情况;过拟合是指模型在训练集上表现很好,到了验证和测试阶段就大不如意了,即模型的泛化能力很差。欠拟合和过拟合一直是机器学习训练中的难题,在... 查看详情

python机器学习中的模型选择和评估(代码片段)

机器学习中的模型选择和评估1.介绍2.模型拟合效果2.1欠拟合与过拟合表现方式2.2避免欠拟合与过拟合的方法3.实例分析3.1鸢尾花数据集3.2对鸢尾花数据进行聚类1.介绍在机器学习系统中,如何训练出更好的模型、如何判断模... 查看详情

模型选择欠拟合和过拟合(underfit-overfit)(代码片段)

模型选择、欠拟合和过拟合模型选择、欠拟合和过拟合训练误差和泛化误差模型选择验证数据集KKK折交叉验证欠拟合和过拟合模型复杂度训练数据集大小多项式函数拟合实验生成数据集定义、训练和测试模型三阶多项式函数拟合... 查看详情

技巧篇:存储拟合出来的球模型/拟合的球范围是否在自己满意范围(代码片段)

...想放大,或者进一步查看的时候,很难满足我们的需求。怎么办呢?下面介绍,将我们拟合得到的球模型或者柱形,或者长方体都可以存出来,然后用我们自己喜欢的软件打开,进一步测量和查看。上图是我用三维扫描仪得到的... 查看详情

机器学习七——逻辑回归实践(代码片段)

...不出来了,你刷题刷出来的做题模式就类似一个过拟合的模型。过拟合产生的原因在于数据量太少而变量过多,虽然可以拟合所有数据样本,但拟合出来的模型曲线比较曲折,无法对其他的数据做出正确的预测(以下图片来自htt... 查看详情

机器学习是什么(代码片段)

...学习是什么二、常见概念属性特征空间特征向量误差拟合模型调参正则化预测类型三、学习方式(监督与无监督)一、机器学习是什么机器学习是计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的学科。机器... 查看详情

随机森林

0.前言sklearn提供了sklearn.ensemble库,其中包括随机森林模型(分类)。但之前使用这个模型的时候,要么使用默认参数,要么将调参的工作丢给调参算法(gridsearch等)。今天想来深究一下到底是如何选择参数,如何进行调参。学会... 查看详情

tensorflow学习4-过拟合-over-fitting(代码片段)

过拟合:真实的应用中,并不是让模型尽量模拟训练数据的行为,而是希望训练数据对未知做出判断。模型过于复杂后,模型会积极每一个噪声的部分,而不是学习数据中的通用趋势。当一个模型的参数比训练数据还要多的时候... 查看详情

如何知道是不是发生了欠拟合或过拟合?

...进行图像分类。我有1000张具有平衡类的图像。当我训练模型时,我得到较低的恒定验证准确度,但验证损失会减少。这是过拟合还是欠拟合的迹象?我还应该注意,我正在尝试使用新类和不同的 查看详情

防止过拟合的方法预测鸾凤花(sklearn)(代码片段)

1.防止过拟合的方法有哪些?过拟合(overfitting)是指在模型参数拟合过程中的问题,由于训练数据包含抽样误差,训练时,复杂的模型将抽样误差也考虑在内,将抽样误差也进行了很好的拟合。产生过拟合问题的原因大体有两... 查看详情

决策树决策树调参(代码片段)

引言  在这篇文章中,我们将探讨决策树模型的最重要参数,以及它们如何防止过度拟合和欠拟合,并且将尽可能少地进行特征工程。我们将使用来自kaggle的泰坦尼克号数据。 导入数据importpandasaspdimportnumpyasnpimportmatplotliba... 查看详情

机器学习(ml)七之模型选择欠拟合和过拟合(代码片段)

...差(trainingerror)和泛化误差(generalizationerror)。前者指模型在训练数据集上表现出的误差,后者指模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似。计算训练误差和泛化误差可以使... 查看详情

模型选择+过拟合和欠拟合(动手学深度学习v2)笔记(代码片段)

...练误差和泛化误差训练误差(trainingerror):模型在训练数据集上计算得到的误差泛化误差(generalizationerror):模型应用在同样从原始样本的分布中抽取的无限多数据样本时,模型误差的期望验证数据... 查看详情

动手学深度学习3-5others(代码片段)

其他问题1.模型选择、欠拟合和过拟合1.1训练误差和泛化误差1.2模型选择1.2.1验证数据集1.2.2(K)折交叉验证由于验证数据集不参与模型训练,当训练数据不够用时,预留大量的验证数据显得太奢侈。一种改善的方法是(K)折交叉验证... 查看详情