Neural network 如何培训网络以获得更好的性能?

Neural network 如何培训网络以获得更好的性能?,neural-network,Neural Network,我有一个10×57300的矩阵作为输入,一个1×57300的矩阵作为输出,只包含0和1。我尝试用前馈反向传播和层递归反向传播结构训练神经网络。我尝试了那些有一个隐藏层和40个隐藏层神经元的结构。在最好的情况下,性能停止在0.133点。我用新的输入模拟了网络,但它没有给出我想要的结果。结果甚至和我训练网络的结果都不一样。您对提高网络性能有什么建议吗 inputs = input; targets = output; % Create a Fitting Network hiddenLayerSi

我有一个10×57300的矩阵作为输入,一个1×57300的矩阵作为输出,只包含0和1。我尝试用前馈反向传播和层递归反向传播结构训练神经网络。我尝试了那些有一个隐藏层和40个隐藏层神经元的结构。在最好的情况下,性能停止在0.133点。我用新的输入模拟了网络,但它没有给出我想要的结果。结果甚至和我训练网络的结果都不一样。您对提高网络性能有什么建议吗

inputs = input;
targets = output;

% Create a Fitting Network
hiddenLayerSize = 50;
net = fitnet(hiddenLayerSize);

% Choose Input and Output Pre/Post-Processing Functions
% For a list of all processing functions type: help nnprocess
net.inputs{1}.processFcns = {'removeconstantrows','mapminmax'};
net.outputs{2}.processFcns = {'removeconstantrows','mapminmax'};


% Setup Division of Data for Training, Validation, Testing
% For a list of all data division functions type: help nndivide
net.divideFcn = 'divideind';

net.divideParam.trainInd=1:28650;  % The first 94 inputs are for training.
net.divideParam.valInd=28651:42977;    % The first 94 inputs are for validation.
net.divideParam.testInd=42978:57300; % The last 5 inputs are for testing the network.

% For help on training function 'trainlm' type: help trainlm
% For a list of all training functions type: help nntrain
net.trainFcn = 'trainlm';  % Levenberg-Marquardt

% Choose a Performance Function
% For a list of all performance functions type: help nnperformance
net.performFcn = 'mse';  % Mean squared error

% Choose Plot Functions
% For a list of all plot functions type: help nnplot
net.plotFcns = {'plotperform','plottrainstate','ploterrhist', ...
  'plotregression', 'plotfit'};


% Train the Network
[net,tr] = train(net,inputs,targets);

% Test the Network
outputs = net(inputs);
errors = gsubtract(targets,outputs);
performance = perform(net,targets,outputs)

% Recalculate Training, Validation and Test Performance
trainTargets = targets .* tr.trainMask{1};
valTargets = targets  .* tr.valMask{1};
testTargets = targets  .* tr.testMask{1};
trainPerformance = perform(net,trainTargets,outputs)
valPerformance = perform(net,valTargets,outputs)
testPerformance = perform(net,testTargets,outputs)

% View the Network
view(net)

% Plots
% Uncomment these lines to enable various plots.
%figure, plotperform(tr)
%figure, plottrainstate(tr)
%figure, plotfit(net,inputs,targets)
%figure, plotregression(targets,outputs)
%figure, ploterrhist(errors)

这是我用来训练神经网络的代码。我的57300输入分成300X191组数据。我的意思是每一组输入是一个10乘191的组。这就是我为什么用“divideind”的原因。因为我使用了tansig传递函数,所以我在[-1]范围内规范化了输入和输出矩阵。但是我仍然没有从网络上得到我想要的结果

在信息如此之少的情况下,如何改进网络通常是很复杂的。在某些情况下,性能为0.133可能是一个好结果,而在其他情况下则不是这样。尽管如此,改进网络的一般思路可能是将输入标准化到[0,1]范围,执行特征选择,可能添加rbm层,并在有监督反向传播学习方案(参见深度信念网络)之前执行无监督训练,增加学习数据,或者使用交叉验证来选择自由参数并提前停止。

我不确定您是否为分类或回归目的培训网络。但如果您直接想要提高性能,我建议您做以下几件事:

1-进一步增加隐藏层中的节点数。尝试一些更大的东西,看看神经网络是否做得更好(可能是因为过度训练,但暂时忽略它)


2-如果其在数据空间中具有非常高的非线性,则再添加一个隐藏层。但是在简单神经网络的情况下,添加其中的许多将不起作用。

编辑v1:

我看到您有94个用于测试的输入,94个用于验证,5个用于测试。这个比率似乎有点容易出错

首先,10个特征向量的94个输入集非常少。对于100的特征向量是无效的:)。所以基本上问题是你没有足够的数据来训练40个神经元。如果无法生成更多数据,我建议使用新的拆分:

150培训 10验证 30测试


此信息是提高NN性能的更一般的方法:

培训方法

有多少个时代?网络可能对您的输入集进行了过度训练。 BP算法的参数(动量、适应因子等)

特征提取算法

通常,这是主要问题。该算法无法真正提取输入的特定特征

我建议以视觉方式绘制所有输入,并查看是否看到任何模式,以及是否能够以视觉方式确定分离。毕竟,神经网络是一个更复杂的统计系统


祝你好运

您可能希望尝试在其他stackexchange网站上发布此问题,如或;这些网站更关注数据模型的性能。首先,感谢您的回答。第二,我已经编辑了我的问题,我希望它能更详细地说明我在做什么。正如我所说的,在训练网络之前,寻找执行特征提取的方法。如果您对这一改变不太适应,因为它首先提供了无监督的培训,然后是有监督的培训。这里有一个可能的软件。首先,谢谢你的回答。第二,我已经编辑了我的问题,我希望它能提供更多关于我在做什么的细节。对不起,这不是一个好的答案。增加隐藏层中的节点数,或在没有适当注意的情况下增加层数,可能会导致不需要的数据拟合过度。事实上,区分好网络和坏网络的是适当的正则化,它试图将学习推广到新的看不见的输入。此外,节点的增加会导致反向传播算法的性能下降,从而导致收敛速度变慢。首先,感谢您的回答。第二,我已经编辑了我的问题,我希望它能更详细地说明我在做什么。按照建议,改变你的培训、验证和测试比率。此外,使用验证点优化自由参数。最后,按照建议执行特征提取以减少输入向量的长度,因为这可能是您的主要问题。