主要内容

浅神经网络训练后性能分析

本主题介绍了一个典型的浅层神经网络工作流的一部分。有关更多信息和其他步骤,请参见多层浅层神经网络和反向传播训练.要了解如何监控深度学习训练进度,请参见监控深度学习训练进展

当培训多层浅层神经网络的训练与应用完成后,您可以检查网络性能,并确定是否需要对训练过程、网络架构或数据集进行任何更改。第一次检查培训记录,tr,这是training函数返回的第二个参数。

tr
tr =结构体字段:trainFcn: 'trainlm' trainParam: [1x1 struct] performFcn: 'mse' performParam: [1x1 struct] derivFcn: 'defaultderiv' divideFcn: 'dividerand' divideMode: 'sample' divideParam: [1x1 struct] trainInd:[2 3 5 6 9 10 11 13 14 15 18 19 20 22 23 24 25 29 30…[1 8 17 21 27 28 34 43 63 71 72 74 75 83 106 124 125…testInd:[4 7 12 16 26 32 37 42 53 60 61 67 69 78 87 89 104…num_epoch: 9 trainMask: {[NaN 1 1 NaN 1 1 NaN 1 1 NaN 1 1 NaN 1 1 NaN 1 1…} valMask: {[1 NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN…} testMask: {[NaN NaN NaN 1 NaN NaN 1 NaN NaN 1 NaN NaN…} best_epoch: 3 goal: 0 states: {1x8 cell} epoch: [0 1 2 3 4 5 6 7 8 9] time:[0.1019 0.2007 0.2188 0.2513 0.2726 0.2992 0.3306…][672.2031 94.8128 43.7489 12.3078 9.7063 8.9212 8.0412…][675.3788 76.9621 74.0752 16.6857 19.9424 23.4096…]tperf:[599.2224 97.7009 79.1240 24.1796 31.6290 38.4484…] ] mu: [1.0000e-03 0.0100 0.0100 0.1000 0.1000 0.1000 0.1000 ... ] gradient: [2.4114e+03 867.8889 301.7333 142.1049 12.4011 85.0504 ... ] val_fail: [0 0 0 0 1 2 3 4 5 6] best_perf: 12.3078 best_vperf: 16.6857 best_tperf: 24.1796

这个结构包含了所有关于网络训练的信息。例如,tr.trainIndtr.valIndtr.testInd包含分别用于训练、验证和测试集的数据点的指标。如果你想重新训练网络使用相同的数据划分,你可以设置net.divideFcn“divideInd”net.divideParam.trainIndtr.trainIndnet.divideParam.valIndtr.valIndnet.divideParam.testIndtr.testInd

tr在训练过程中,结构也会跟踪一些变量,如性能函数的值,梯度的大小等。您可以使用培训记录来绘制绩效进度图plotperf命令:

plotperf (tr)

图训练记录包含一个轴对象。标题为Performance为6.3064的axis对象包含4个类型为line的对象。这些对象代表Test, Validation, Train。

房地产tr.best_epoch指示验证性能达到最小值的迭代。在训练停止之前,继续训练6次以上的迭代。

这一数字并不表明培训存在任何重大问题。验证和测试曲线非常相似。如果测试曲线在验证曲线增加之前显著增加,那么可能发生过拟合。

验证网络的下一步是创建一个回归图,它显示了网络输出和目标之间的关系。如果训练是完美的,网络输出和目标会完全相等,但在实践中这种关系很少是完美的。对于体脂肪的例子,我们可以使用以下命令创建一个回归图。第一个命令计算训练有素的网络对数据集中所有输入的响应。下面六个命令提取属于训练、验证和测试子集的输出和目标。最后一个命令创建三个用于训练、测试和验证的回归图。

bodyfatOutputs =净(bodyfatInputs);鳟鱼= bodyfatOutputs (tr.trainInd);输出电压= bodyfatOutputs (tr.valInd);tsOut = bodyfatOutputs (tr.testInd);trTarg = bodyfatTargets (tr.trainInd);vTarg = bodyfatTargets (tr.valInd);tsTarg = bodyfatTargets (tr.testInd);plotregression (trTarg、鳟鱼、“火车”vTarg电压输出,“验证”tsTarg tsOut,“测试”

图回归(plotreregression)包含3个轴对象。标题为Train: R=0.91107的轴对象1包含3个类型为line的对象。这些对象表示Y = T, Fit, Data。带有标题Validation: R=0.8456的axis对象2包含3个类型为line的对象。这些对象表示Y = T, Fit, Data。轴对象3标题测试:R=0.87068包含3个类型为line的对象。这些对象表示Y = T, Fit, Data。

这三个图代表训练、验证和测试数据。每个图中的虚线表示完美的结果- outputs = targets。实线表示输出与目标之间的最佳拟合线性回归线。R值表示输出和目标之间的关系。如果R = 1,这表明在输出和目标之间存在精确的线性关系。如果R接近于零,则输出与目标之间不存在线性关系。

对于本例,训练数据表明非常合适。验证和测试结果也显示了较大的R值。散点图有助于显示某些数据点的拟合很差。例如,测试集中有一个数据点,其网络输出接近35,而对应的目标值约为12。下一步将是研究这个数据点,以确定它是否表示外推(即,它是否在训练数据集之外)。如果是,则应该将其包含在训练集中,并收集额外的数据用于测试集。

改善结果

如果网络不够准确,可以尝试初始化网络并再次进行训练。每次初始化前馈网络时,网络参数都是不同的,可能会产生不同的解决方案。金宝搏官方网站

网= init(净);net = train(net, bodyfatInputs, bodyfatTargets);

第二种方法是,你可以将隐藏的神经元数量增加到20个以上。隐藏层中神经元的数量越多,网络的可优化参数就越多,网络的灵活性就越大。(逐渐增加图层大小。如果隐藏层太大,可能会导致问题的特征不足,网络必须优化更多的参数,而不是有数据向量来约束这些参数。)

第三种选择是尝试不同的训练功能。的贝叶斯正则化训练trainbr,例如,有时可以产生比使用早期停止更好的泛化能力。

最后,尝试使用额外的训练数据。为网络提供额外的数据更有可能产生一个新的网络。