Main Content

划分数据以实现最优神经网络训练

本主题介绍典型多层网络工作流的一部分。有关详细信息和其他步骤,请参阅多层浅层神经网络与反向传播训练

在训练多层网络时,通常的做法是首先将数据分成三个子集。第一个子集是训练集,用于计算梯度和更新网络权重及偏置。第二个子集是验证集。在训练过程中会监控基于验证集的误差。验证误差通常在训练的初始阶段减小,训练集误差也是如此。然而,当网络开始过拟合数据时,基于验证集的误差通常开始增大。网络权重和偏置以最小的验证集误差保存。这种方法在提高浅层神经网络泛化能力,避免过拟合中进行更详细的讨论。

训练期间不使用测试集误差,但测试集误差用于比较不同模型。在训练过程中绘制测试集误差也很有用。如果测试集误差与验证集误差达到最小值所需的迭代次数显著不同,这可能表示数据集的划分不佳。

可使用四个函数将数据划分为训练集、验证集和测试集。它们是 dividerand(默认值)、divideblockdivideintdivideind。数据划分通常在您训练网络时会自动执行。

函数

算法

dividerand

随机划分数据(默认值)

divideblock

将数据划分为连续数据块

divideint

使用交错选择划分数据

divideind

按索引划分数据

您可以使用以下属性访问或更改网络的划分函数:

net.divideFcn

每个划分函数都采用自定义其行为的参数。这些值会被存储,且可以通过以下网络属性进行更改:

net.divideParam

每当对网络进行训练时,都会自动访问划分函数,该函数用于将数据划分为训练子集、验证子集和测试子集。如果 net.divideFcn 设置为 'dividerand'(默认值),则使用划分参数 net.divideParam.trainRationet.divideParam.valRationet.divideParam.testRatio 将数据随机分成三个子集。归入训练集的数据占比为 trainRatio/(trainRatio+valRatio+testRatio),其他两个子集的公式类似。训练、测试和验证的默认比率分别为 0.7、0.15 和 0.15。

如果 net.divideFcn 设置为 'divideblock',则使用原始数据集的三个连续数据块将数据分成三个子集(训练取第一个数据块,验证取第二个数据块,测试取第三个数据块)。归入每个子集的原始数据占比同样由用于 dividerand 的三个划分参数决定。

如果 net.divideFcn 设置为 'divideint',则数据将通过交错方法进行划分,就像发牌一样。这样做是为了让不同百分比的数据归入三个子集。归入每个子集的原始数据占比同样由用于 dividerand 的三个划分参数决定。

net.divideFcn 设置为 'divideind' 时,数据按索引划分。三个子集的索引由划分参数 net.divideParam.trainIndnet.divideParam.valIndnet.divideParam.testInd 定义。这些索引的默认赋值是空数组,因此在使用该选项时必须设置索引。