我建立了一个神经网络,我想将输入数据(每个输入数据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);
谢谢!
答案 0 :(得分:4)
使用神经网络是一种创造性工作。所以没有人不能给你唯一真实的答案。但我可以根据自己的经验给出一些建议。
nntool
会自动检查它,所以我们可以跳过这一步。rand
在matlab开始时给你总是相同的数字,所以如果你创建你的数据集只有一次你可以使用相同的集合。这个问题也与非同质数据有关。可能有些部分数据比其他部分更重要。因此,如果一些不同的随机集将给出相同的错误数据是可以的,我们可以更进一步。如果没有 - 我们需要处理数据并更仔细地拆分它。有时我会避免使用dividerand
并手动分割数据。关于隐藏层中的单元数,有一些 经验法则:在所有隐藏层中使用相同数量的单位,以及 使用至少相同数量的单位之间的最大值 类的数量和功能的数量。但是可以达到 三倍的价值。鉴于我们选择的功能数量很多 在隐藏层中保留相同数量的单位。
评论中的一些建议: 数据拆分方法(用于列车和测试数据集)取决于您的数据。例如,我研究了行业数据,发现在数据集的最后部分,技术参数(某些设备的压力)发生了变化。所以我必须获取两种操作模式的数据来训练数据集。但是对于你的情况,我不会有同样的问题...我建议你尝试几个随机集(只是检查它们真的不同!)。
为了测量净误差,我通常会计算出错误的全向量 - 我训练网络,然后检查所有值的工作以获得整个误差向量。得到像直方图等一些有用的变量是有用的,我可以看到我的网出错了。让sse(或mse)接近零是没有必要甚至是有害的 - 通常这意味着你已经超越了网络。对于第一个近似值,我通常会尝试在训练数据集上获得80-95%的正确值,然后在测试数据集上尝试网络。