Matlab中的神经网络工具箱每次都会得到不同的结果,即使初始权值都为零

Matlab中的神经网络工具箱每次都会得到不同的结果,即使初始权值都为零,matlab,machine-learning,neural-network,Matlab,Machine Learning,Neural Network,为什么要关闭并重新打开MATLAB窗口以再次运行神经网络以获得相同的结果?在此过程中,哪些参数是有效的 编辑有关我的问题的更多详细信息 如果我不关闭MATLAB的所有窗口,也不重新打开它们来运行另一个网络,例如由其他数量的神经元运行,那么每次关闭和重新打开窗口时得到的结果都是不同的。例如:我在隐藏层中通过5个神经元运行ANN,得到R1=0.97,然后我关闭并重新打开我的m.file,通过5个神经元运行,得到R2=0.58。现在,如果我不关闭也不重新打开,我可能得到R1=0.99,R2=0.7 R

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

编辑有关我的问题的更多详细信息
如果我不关闭MATLAB的所有窗口,也不重新打开它们来运行另一个网络,例如由其他数量的神经元运行,那么每次关闭和重新打开窗口时得到的结果都是不同的。例如:我在隐藏层中通过5个神经元运行ANN,得到R1=0.97,然后我关闭并重新打开我的m.file,通过5个神经元运行,得到R2=0.58。现在,如果我不关闭也不重新打开,我可能得到R1=0.99,R2=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
当我运行它时,每个神经元数量的答案与我不使用a的时间不同。。通过重新打开m文件和MATLAB窗口,结束循环并为每个神经元运行。
然而,我给权重赋值为零,并没有解决我的问题。

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

yournet.trainParam.showWindow = false;
yournet.trainParam.showCommandLine = false; 
在网络定义之后,但在培训功能之前

编辑:我对OP编辑的回复 我附上了基于您的培训和测试代码,我尝试学习y=x.^2,我的培训数据为[1,3,5,7,9]表示x,以及[2,4,6,8]表示测试。然而,我应该说,我每次都得到不同的权重,即使初始权重都为零。这意味着给定6或7的隐藏层节点,反向传播将无法实现唯一的解决方案。请参阅下面我的修订:

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}
就在之前

[net,tr]=train(net,Pn,Tn);
你会发现每次跑步的重量都不一样。不同的Matlab神经网络工具箱结果是因为两个原因:1随机数据分割,2随机权重初始化。即使每次避免2时将初始权重归零,1仍然存在,因为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]之前=列车网,Pn,Tn;,那么结果不会改变。您可能需要在自己的案例中记录net.b、net.IW和net.LW值,并在每次循环中使用它们,为第一次试运行保存您的net,并加载net以获得循环运行中net.b、net.IW和net.LW的值

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

初始化rand权重

使用指定隐藏节点数m的外部循环

使用一个内部循环,为每m创建一个具有一组新的随机初始权重的网络;然后训练、评估R2并将其存储在二维矩阵中

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

使用确定的m值在循环中运行几次,只存储当前最佳设计的索引或权重

选择具有最佳性能的权重


如果我不关闭MATLAB的所有窗口,也不重新打开它们来运行另一个网络,比如由其他数量的神经元运行,那么每次关闭和重新打开窗口时得到的结果都是不同的。例如:我用隐藏层中的5个神经元运行ANN,得到R1=0.97,然后我关闭并重新打开我的m.file,然后用5个神经元运行,得到R2=0.58。现在,如果我不关闭也不重新打开,我可能得到R1=0.99,R2=0.7,R是回归。什么参数有效,使这些答案不同?可能会得到不同的结果。这是由于每次重新运行程序时的权重初始化导致初始权重不同。然而,我不认为这与关闭打开的窗口有什么关系。我给每个权重和层权重和偏差赋值,因为我使用了for..end循环,例如:对于m=0:10,所以m是隐藏层中的神经元数量,在我写end之前给每个权重赋值。但答案不同。梅应该写没有matlab工具的安!怎么做?你的隐藏层每次都不一样?因此,R肯定是不一样的。我建议你点击“编辑”将代码粘贴到你的原始帖子上,这样人们就可以了解更多细节。是的,我每一层的神经元数量每次都不一样。请看我的代码添加在我原来的帖子