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

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

我制作了一个神经网络,我想将输入数据(每个输入数据 400 个特征)分类为五种阿拉伯方言之一。我使用 net.divideFcn = 'dividerand'; 将训练数据分为“训练数据”、“验证数据”和“测试日期”。我使用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. 首先 - 在训练结束时检查网络错误(在训练和验证数据集上。在开始使用测试数据集之前)。你说它是最小值,但它的实际值(value)是多少?如果也是 50%,那么我们就有错误的数据或错误的网络架构。
  2. 如果训练数据集的错误是正常的。下一步 - 让我们检查您的网络系数在验证步骤中发生了多少变化。这里的错误是怎么回事。如果它们发生了巨大的变化,那么我们的架构就是错误的:网络不具备泛化能力,并且会在每个新数据集上进行重新训练。
  3. 在改变架构之前我们还能做什么?我们可以改变纪元的数量。有时我们可以获得很好的结果,但它是某种类型的随机性 - 我们必须确保训练结束时系数的变化很小。但我记得 nntool 会自动检查它,所以也许我们可以跳过这一步。
  4. 我还想向您推荐一件事 - 更改列车数据集。也许您知道 rand 在 matlab 开始时总是给您相同的数字,因此,如果您仅创建一次数据集,则始终可以使用相同的数据集。这个问题也与非同质数据有关。数据的某些部分可能比其他部分更重要。因此,如果一些不同的随机集会给出相同的错误数据,那就可以了,我们可以更进一步。如果不是——我们需要处理数据并更仔细地分割它。有时我会避免使用 dividerand 并手动划分数据。
  5. 有时我尝试更改激活函数的类型。但在这里你使用感知器......所以这个想法 - 尝试使用西格​​玛或线性神经元而不是感知器。这很少会带来显着的改进,但可以有所帮助。
  6. 如果所有这些步骤都不能满足您的需求,您就必须更改网络架构。第一层神经元的数量是你首先要做的。通常,当我研究神经网络时,我会花费大量时间不仅尝试不同数量的神经元,而且还尝试不同类型的网络。 例如,我发现关于您的主题的有趣文章:link at Alberto Simões article 。他们就是这么说的:

Regarding the number of units in the hidden layers, there are some rules of thumb: use the same number of units in all hidden layers, and use at least the same number of units as the maximum between the number of classes and the number of features. But there can be up to three times that value. Given the high number of features we opted to keep that same number of units in the hidden layer.

<小时/>

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

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

关于matlab - 神经网络对测试数据的预测只有 50%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43972358/

相关文章:

r - 如何将 R 数据转换为 matlab 矩阵

image - Matlab毒药和数字

python - OneHotEncoder categorical_features 已弃用,如何转换特定列

c# - 是否可以通过基于屏幕截图的机器学习来识别敌人?

python - Neurolab 的 newff 示例中出现错误

python-3.x - 为什么单层 MLP 在数字分类器中优于多层?

math - 多边形的交集和并集

c++ - 在 C++ 中定义类似 Matlab 的 .* 运算符?

python - 有人可以解释批量大小和每个时期的步骤之间的关系吗?

machine-learning - 同时对不同的输出使用不同的损失函数 Keras?