gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:23:45 24 4
gpt4 key购买 nike

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

编辑(有关我的问题的更多详细信息)如果我不关闭 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 窗口来运行每个神经元数量的时间不同。但是我给权重赋予零值,并没有解决我的问题。

最佳答案

我不太清楚Matlab窗口是什么意思,但是你可以通过输入来控制nntraintool GUI的弹出(nntraintool('close'))

yournet.trainParam.showWindow = false;
yournet.trainParam.showCommandLine = false;

在网络 yournet 的定义之后、训练函数之前。

编辑:我对OP编辑的回复我根据你的代码附上了我的训练和测试代码,我尝试学习y = x.^2,并且我的训练数据是x的[1,3,5,7,9] 和 [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]=train(net,Pn,Tn);之前,结果不会改变。您可能需要根据自己的情况记录 net.bnet.IWnet.LW 值并使用它们每次在循环中(保存第一次试运行的net,并加载net以获取net.b的值net.IWnet.LW 在循环运行中)。

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

  1. 初始化兰特权重。

  2. 使用指定隐藏节点数量的外循环,m

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

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

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

  6. 选择性能最佳的权重

关于matlab - 即使初始权重全为零,Matlab 中的神经网络工具箱每次都会得到不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20772089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com