神经网络对测试数据的预测只有50%

时间:2017-05-15 05:52:59

标签: matlab machine-learning neural-network artificial-intelligence

我建立了一个神经网络,我想将输入数据(每个输入数据400个特征)分类为五种阿拉伯方言之一。我使用net.divideFcn = 'dividerand';将“train data”,“验证数据”和“test date”中的trainig数据转移。我使用trainbr作为训练函数,这导致了长时间的训练,这是因为我在训练数据中有9000个元素。 对于网络架构,我使用了两层,首先是10个感知器,第二个是5,5因为我使用了一个与所有策略。 网络训练通常以达到最小梯度而不是最小误差结束。

如何让网络更好地预测?这可能是泛化的问题(网络很好地学习了训练数据,但对新数据的测试往往会失败? 我应该在第一层添加更多的感知器吗?我问的是因为当我在第一层有10个感知器时,我花了大约一个小时来训练网络,所以时间会增加。

这是我网络的代码:

[Test] = load('testData.mat');
[Ex] = load('trainData.mat');

Ex.trainVectors = Ex.trainVectors';
Ex.trainLabels = Ex.trainLabels';

net = newff(minmax(Ex.trainVectors),[10 5] ,{'logsig','logsig'},'trainlm','learngdm','sse');
net.performFcn = 'mse';
net.trainParam.lr = 0.01;
net.trainParam.mc = 0.95;
net.trainParam.epochs = 1000;
net.trainParam.goal = 0;
net.trainParam.max_fail = 50;

net.trainFcn = 'trainbr';   

net.divideFcn = 'dividerand';
net.divideParam.trainRatio = 0.7;
net.divideParam.valRatio = 0.15;
net.divideParam.testRatio = 0.15;

net = init(net);

net = train(net,Ex.trainVectors,Ex.trainLabels);

谢谢!

1 个答案:

答案 0 :(得分:4)

使用神经网络是一种创造性工作。所以没有人不能给你唯一真实的答案。但我可以根据自己的经验给出一些建议。

  1. 首先 - 检查培训结束时的网络错误(在培训和验证数据集上。在开始使用测试数据集之前)。你告诉它是最低的,但它的实际价值是多少?如果它也是50%,那么我们有错误的数据或错误的网络架构。
  2. 如果列车数据集的错误正常。下一步 - 让我们检查您的网络系数在验证步骤中的变化程度。这里的错误是什么呢?如果他们发生了巨大的变化,那就是我们的架构是错误的:网络没有能力进行概括,并且会重新培训每一个新​​的数据集。
  3. 在改变架构之前我们还能做些什么?我们可以改变时代的数量。有时我们可以获得好的结果,但它是某种类型的随机 - 我们必须确保在训练的结束步骤中系数的变化很小。但是我记得nntool会自动检查它,所以我们可以跳过这一步。
  4. 我还想向您推荐一件事 - 更改列车数据集。也许你知道rand在matlab开始时给你总是相同的数字,所以如果你创建你的数据集只有一次你可以使用相同的集合。这个问题也与非同质数据有关。可能有些部分数据比其他部分更重要。因此,如果一些不同的随机集将给出相同的错误数据是可以的,我们可以更进一步。如果没有 - 我们需要处理数据并更仔细地拆分它。有时我会避免使用dividerand并手动分割数据。
  5. 有时候我试图改变激活功能的类型。但是在这里你使用感知器...所以这个想法 - 尝试使用sigma或线性神经元而不是感知器。这很少会带来重大改进,但可以提供帮助。
  6. 如果所有这些步骤都无法满足您的需求,则必须更改网络架构。并且第一层中的神经元数量是您必须要做的第一个。通常当我在神经网络上工作时,我花了很多时间不仅尝试不同数量的神经元,而且尝试不同类型的网络。 例如,我发现了有关您主题的有趣文章link at Alberto Simões article。这就是他们所说的:
  7.   

    关于隐藏层中的单元数,有一些   经验法则:在所有隐藏层中使用相同数量的单位,以及   使用至少相同数量的单位之间的最大值   类的数量和功能的数量。但是可以达到   三倍的价值。鉴于我们选择的功能数量很多   在隐藏层中保留相同数量的单位。

    评论中的一些建议: 数据拆分方法(用于列车和测试数据集)取决于您的数据。例如,我研究了行业数据,发现在数据集的最后部分,技术参数(某些设备的压力)发生了变化。所以我必须获取两种操作模式的数据来训练数据集。但是对于你的情况,我不会有同样的问题...我建议你尝试几个随机集(只是检查它们真的不同!)。

    为了测量净误差,我通常会计算出错误的全向量 - 我训练网络,然后检查所有值的工作以获得整个误差向量。得到像直方图等一些有用的变量是有用的,我可以看到我的网出错了。让sse(或mse)接近零是没有必要甚至是有害的 - 通常这意味着你已经超越了网络。对于第一个近似值,我通常会尝试在训练数据集上获得80-95%的正确值,然后在测试数据集上尝试网络。