Matlab中的神经网络工具箱每次都会得到不同的结果,即使初始权重都是零也是如此

时间:2013-12-25 11:08:10

标签: matlab machine-learning neural-network

为什么应该关闭并重新打开MATLAB窗口以再次运行神经网络以获得相同的结果?这个过程中哪些参数有效?

编辑(有关我的问题的更多详情) 如果我不关闭MATLAB的所有窗口并且不重新打开它们以运行另一个网络(例如由另一个神经元运行),则获得的结果与每次关闭并重新打开时不同窗户。例如:我通过隐藏层中的5个神经元运行ANN并获得R(1)= 0.97,然后我关闭并重新打开我的m.file并运行5个神经元并获得R(2)= 0.58。现在,如果我不要关闭,不要重新打开,我可能得到R(1)= 0.99和R(2)= 0.7(R是回归)。哪些参数有效,以便这些答案不同?

我的代码如下:

clc
clear
for m=6:7

   % P is input matrix for training
   % T is output matrix 

   [Pn,minP,maxP,Tn,minT,maxT] = premnmx(P,T);

   net=newff(minmax(Pn),[m,1],{'logsig','purelin'},'trainlm');

   net.trainParam.show =100;
   net.trainParam.lr = 0.09;
   net.trainParam.epochs =1000;
   net.trainParam.goal = 1e-3; 

   [net,tr]=train(net,Pn,Tn);
   diff= sim(net,Pn);
   diff1 = postmnmx(diff,minT,maxT)

   %testing===================================================================
   [Pn,minP,maxP,Tn,minT,maxT] = premnmx(P,T);
   % Pt is input matrix data for testing 
   % Tt is output matrix data for testing

   Ptn = tramnmx(Pt,minP,maxP)
   diff= sim(net,Ptn);
   diff2 = postmnmx(diff,minT,maxT)

   msetr=mse(diff1-T)
   msets=mse(diff2-Tt)

   y=(1/n)*sum(diff2); % n is number of testing data
   R2=((sum((Tt-y).^2))-(sum((diff2-Tt).^2)))/(sum((Tt-y).^2))

   net.IW{1,1}=zeros(m,5);
   net.LW{2,1}=zeros(2,m);
   net.b{1,1}=zeros(m,1);
   net.b{2,1}=zeros(2,1);

end

当我运行时,每个神经元数量的答案与我不使用" for ... end"通过重新打开m文件和MATLAB窗口循环并运行每个神经元数量。 但是我给权重零,没有解决我的问题。

1 个答案:

答案 0 :(得分:0)

我不太清楚Matlab窗口你是什么意思,但你可以通过放置

来控制nntraintool GUI(nntraintool('close'))的弹出窗口
yournet.trainParam.showWindow = false;
yournet.trainParam.showCommandLine = false; 

在您的网络yournet定义之后但在培训功能之前。

编辑:我对OP的编辑的回复 我根据您的情况附加了我的培训和测试代码,我尝试了解y = x.^2,我的培训数据为[{1}}的[1,3,5,7,9]和[2,4, 6,8]进行测试。然而,我应该说我每次都有不同的权重,即使初始权重都是零。这意味着给定6或7的隐藏层节点,反向传播将不会实现唯一的解决方案。请参阅下面的修订版:

x

实际上如果添加

clc
clear

for m=6:7

   % P is input matrix for training
   % T is output matrix 
   P=[1 3 5 7 9];
   T=P.^2;
   [Pn,minP,maxP,Tn,minT,maxT] = premnmx(P,T);
   clear net
   net.IW{1,1}=zeros(m,1);
   net.LW{2,1}=zeros(1,m);
   net.b{1,1}=zeros(m,1);
   net.b{2,1}=zeros(1,1);
   net=newff(minmax(Pn),[m,1],{'logsig','purelin'},'trainlm');

   net.trainParam.show =100;
   net.trainParam.lr = 0.09;
   net.trainParam.epochs =1000;
   net.trainParam.goal = 1e-3; 

   [net,tr]=train(net,Pn,Tn);
   diff= sim(net,Pn);
   diff1 = postmnmx(diff,minT,maxT)

   %testing===================================================================
   [Pn,minP,maxP,Tn,minT,maxT] = premnmx(P,T);
   % Pt is input matrix data for testing 
   % Tt is output matrix data for testing
   Pt=[2 4 6 8];
   Tt=Pt.^2;
   n=length(Pt);
   Ptn = tramnmx(Pt,minP,maxP)
   diff= sim(net,Ptn);
   diff2 = postmnmx(diff,minT,maxT)

   msetr=mse(diff1-T)
   msets=mse(diff2-Tt)

   y=(1/n)*sum(diff2); % n is number of testing data
   R2=((sum((Tt-y).^2))-(sum((diff2-Tt).^2)))/(sum((Tt-y).^2))


end

之前

aa=net.LW(2,1);
aa{1}

每次运行时,您都会发现重量不同。不同的Matlab神经网络工具箱结果有两个原因:(1)随机数据划分(2)随机权重初始化。即使你每次避免(2)你都初始化重量,(1)仍然存在,因为[net,tr]=train(net,Pn,Tn); 随机化了输入/目标对的顺序。

妥协这一点的一个技巧是记录第一次的体重。就我而言,我补充道:

dividerand

bb = [ -0.2013 -0.8314 0.4717 0.4266 0.1441 -0.6205]; net.LW{2,1} = bb; bbb = [-16.7956 -16.8096 16.8002 16.8001 -16.8101 -16.8416]'; net.IW{1}=bbb; bbbb=0.2039; bbbbb=[-16.8044 -10.0608 3.3530 -3.3563 -10.0588 -16.7584]'; net.b{1}=bbbbb; net.b{2}=bbbb; 之前,结果不会改变。您可能需要记录[net,tr]=train(net,Pn,Tn);net.bnet.IW值,然后每次在循环中使用它们net.LW {{1}第一次试运行,save获取循环运行中netload netnet.b的值。

但我认为这种方法没有多大意义。我强烈建议你:

  1. 初始化兰特重量。

  2. 使用指定隐藏节点数的外部循环net.IW

  3. 使用内部循环创建一个网络,每个m都有一组新的随机初始权重;然后在{2}矩阵中训练,评估和存储net.LW

  4. 在存储的搜索结果中搜索性能可接受的最小网络,记录m

  5. 在具有确定的R2值的循环中运行多次,并仅存储当前最佳设计的索引或权重。

  6. 选择性能最佳的权重