深度学习种 数据shuffle对模型性能的影响

博客部分内容参照链接:https://blog.csdn.net/g_b_l/article/details/109600536

相同的两个目标检测实验,模型进行shuffle和未进行shuffle时训练的loss图,发现:未经shuffle的loss曲线出现周期性的震荡,测试后模型的泛化效果也很差。如下图1(未shuffle)和图2(shuffle)所示:

                                                                                                                  图1 未shuffle实验的loss曲线

                                                                                                                       图2 未shuffle实验的loss曲线

在模型训练前,我们往往对数据进行shuffle,即随机打乱数据,为什么要这么做呢?不这么做会出现什么问题?何时应该shuffle,何时不该shuffle呢?

下面,本文就以上三个问题发表下自己的拙见。

Q1:为什么要进行shuffle?

A1:不论是机器学习还是深度学习,我们总是基于数据独立同分布的假设条件,也就是说,数据的出现应该是随机的,而不是按照某种顺序排列好的。以上就是需要shuffle的根本原因。因此,我们需要在每个epoch的开始把数据shuffle一下。

 

Q2:不shuffle会出现什么问题?

A2:泛化能力差

①模型学到的可能只是数据次序,并未学到有用的信息,导致泛化能力差。

②如果数据是排序过的,比如按类别排序,会导致模型一会儿过拟合这个类,一会儿过拟合那个类,这一方面会使得训练过程的loss周期性震荡;另一方面,在训练结束时,模型总是对最近训练的那类数据过拟合而导致泛化能力差

比如做公式识别(将图片的公式转换为latex形式),如果不shuffle,按图片的宽高比排列数据,且第一张图片和最后一张图片的宽高比相差很大,在这种情况下,不shuffle直接训练,就会出现loss周期性震荡的现象,比如每个epoch的开始,loss会突然上升很多,然后逐渐下降,等下一个epoch开始的时候,loss又会突然上升,循环往复。

 

Q3:何时应该shuffle,何时不该shuffle呢?

A3:当我们使用优化器进行模型训练时,比如使用SGD优化方法,不可避免地,在结束模型训练时,模型对刚刚学习过的那类数据有着更好的表现。

因此,①如果我们想让模型泛化能力更强,我们应该对数据进行shuffle,这样模型最后见过的数据在一定程度上是能代表总体的,有着更强的泛化能力,通常情况下,我们都是要进行shuffle的。

②如果我们想让模型学会某种次序关系或者我们希望模型对某部分数据表现的更好一点,那么我们则要根据自己的目的来决定数据的顺序,并决定是局部shuffle还是完全不shuffle比如,对于时间序列数据,根据过去的数据预测未来的数据,我们则希望越近期的数据,模型给予更高的关注度,一种方式就是将近期的数据放在后面,那么等模型训练完的时候,最近见过的数据就是近期的数据,自然对近期数据有更高的关注,这样在预测未来数据的时候,近期的数据能发挥更大的作用。

所以,是否shuffle要具体情况具体分析。

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 MATLAB 中,可以使用深度学习工具箱来构建回归模型。以下是一个简单的示例,展示如何使用深度学习工具箱来构建一个回归神经网络模型。 首先,需要准备用于训练和测试模型数据。这些数据应该已经被分成了训练集和测试集,并且已经被标记好了。例如,数据可以是一个包含输入特征和目标输出变量的表格。 接下来,可以定义模型的架构。在这个例子中,我们将使用一个带有多个隐藏层的全连接神经网络。以下是一个简单的代码示例: ``` inputSize = size(trainingData,2)-1; layers = [ fullyConnectedLayer(16) reluLayer fullyConnectedLayer(8) reluLayer fullyConnectedLayer(1) regressionLayer]; ``` 这个模型包含三个全连接层和两个激活函数层。最后一层是一个回归层,用于预测目标输出变量。 接下来,可以使用 `trainingOptions` 函数来设置训练选项,例如学习率、迭代次数和优化器。以下是一个示例: ``` options = trainingOptions('adam', ... 'MaxEpochs',100, ... 'MiniBatchSize',64, ... 'InitialLearnRate',0.01, ... 'Shuffle','every-epoch', ... 'ValidationData',{testData(:,1:end-1),testData(:,end)}, ... 'Plots','training-progress', ... 'Verbose',false); ``` 最后,可以使用 `trainNetwork` 函数来训练模型并测试其性能。以下是一个示例: ``` net = trainNetwork(trainingData(:,1:end-1),trainingData(:,end),layers,options); predictions = predict(net,testData(:,1:end-1)); rmse = sqrt(mean((predictions - testData(:,end)).^2)); ``` 这个例子展示了如何使用 MATLAB 中的深度学习工具箱构建回归模型。你可以根据自己的需求调整模型的架构和训练选项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值