Matlab中的神经网络工具箱每次都会得到不同的结果,即使初始权值都为零
为什么要关闭并重新打开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的所有窗口,也不重新打开它们来运行另一个网络,例如由其他数量的神经元运行,那么每次关闭和重新打开窗口时得到的结果都是不同的。例如:我在隐藏层中通过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肯定是不一样的。我建议你点击“编辑”将代码粘贴到你的原始帖子上,这样人们就可以了解更多细节。是的,我每一层的神经元数量每次都不一样。请看我的代码添加在我原来的帖子