为什么应该关闭并重新打开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窗口循环并运行每个神经元数量。 但是我给权重零,没有解决我的问题。
答案 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.b
和net.IW
值,然后每次在循环中使用它们net.LW
{{1}第一次试运行,save
获取循环运行中net
,load net
和net.b
的值。
但我认为这种方法没有多大意义。我强烈建议你:
初始化兰特重量。
使用指定隐藏节点数的外部循环net.IW
使用内部循环创建一个网络,每个m都有一组新的随机初始权重;然后在{2}矩阵中训练,评估和存储net.LW
。
在存储的搜索结果中搜索性能可接受的最小网络,记录m
。
在具有确定的R2
值的循环中运行多次,并仅存储当前最佳设计的索引或权重。
选择性能最佳的权重