我使用newff(...)在MATLAB中创建了神经网络。当您使用相同的输入和输出进行训练时,不同运行的训练结果会有所不同。我知道它正在发生,因为每次运行它时权重都不同。我的问题是每次训练我的NN时如何使初始权重相同,这样我才能得到相同的结果? 另外,是否可以从训练No1中保存一些重量,后者用它来训练No2,以及如何?
TNX
答案 0 :(得分:6)
要generate reproducible results,您需要在代码开头手动将随机数生成器设置为相同的种子/状态。这可以在number of ways中完成(取决于您拥有的MATLAB版本):
旧式:
rand('twister',1234)
更新后的风格:
RandStream.setGlobalStream( RandStream('mt19937ar','Seed',1234) );
在R2011a中引入了new function,简化了最后一次通话:
rng(1234,'twister')
后一种语法是推荐的方法。
答案 1 :(得分:2)
作为旁注而非直接回答,有一种称为Nguyen Widrow initialization and it's already implemented in Matlab's Neural Net toolbox的东西。
根据我的经验,它运作良好,有助于神经网络更快地收敛。我发现它也使结果更加一致。我建议按照Amro's post使用它和固定随机种子。
答案 2 :(得分:2)
不同的Matlab神经网络工具箱结果是由于两个原因:1随机数据划分2随机权重初始化
对于不同的数据划分问题,使用函数“divideblock”或“divideint”而不是“dividerand”,如下所示:
net.dividefcn='divideblock;
net.divideparam.trainratio=.7;
net.divideparam.valratio=.15;
net.divideparam.testratio=.15;
对于随机权重初始化问题,似乎(我不确定)所有Matlab初始化函数(“initzero”,“initlay”,“initwb”,“initnw”)几乎是随机的。所以你应该强制这个函数每次调用产生类似的结果。
RandStream.setGlobalStream (RandStream ('mrg32k3a','Seed', 1234));
然后使用其中一个:
net.initFcn='initlay';
net.layers{i}.initFcn='initnw';
答案 3 :(得分:-1)
If you really want to have the weights before and after the training of NN you can use these codes :
for n1=4:8
wb1=rand(n1,n_input);
wb2=rand(n_output,n1);
bb1=rand(n1,1);
bb2=rand(n_output,1);
wb=[wb1(:);wb2(:);bb1;bb2]';
xlswrite(['weight' num2str(n1) '.xlsx'],wb,'Sheet1',num2str(n1));
end
if n1==4
wb = xlsread(['weight' num2str(n1) '.xlsx']);
i1 = n1*n_input;
i2 = n_output*n1;
i3 = n1;
i4 = n_output;
f1=wb(1:i1);
f2=wb(i1+1:i1+i2);
f3=wb(i1+i2+1:i1+i2+i3);
f4=wb(i1+i2+i3+1:i1+i2+i3+i4);
wb1=reshape(f1,n1,n_input);
wb2=reshape(f2,n_output,n1);
bb1=reshape(f3,n1,1);
bb2=reshape(f4,n_output,1);
elseif n1==5
wb=xlsread(['weight' num2str(n1) '.xlsx']);
i1=n1*n_input;
i2=n_output*n1;
i3=n1;
i4=n_output;
f1=wb(1:i1);
f2=wb(i1+1:i1+i2);
f3=wb(i1+i2+1:i1+i2+i3);
f4=wb(i1+i2+i3+1:i1+i2+i3+i4);
wb1=reshape(f1,n1,n_input);
wb2=reshape(f2,n_output,n1);
bb1=reshape(f3,n1,1);
bb2=reshape(f4,n_output,1);
elseif n1==6
wb=xlsread(['weight' num2str(n1) '.xlsx']);
i1=n1*n_input;
i2=n_output*n1;
i3=n1;
i4=n_output;
f1=wb(1:i1);
f2=wb(i1+1:i1+i2);
f3=wb(i1+i2+1:i1+i2+i3);
f4=wb(i1+i2+i3+1:i1+i2+i3+i4);
wb1=reshape(f1,n1,n_input);
wb2=reshape(f2,n_output,n1);
bb1=reshape(f3,n1,1);
bb2=reshape(f4,n_output,1);
elseif n1==7
wb=xlsread(['weight' num2str(n1) '.xlsx']);
i1=n1*n_input;
i2=n_output*n1;
i3=n1;
i4=n_output;
f1=wb(1:i1);
f2=wb(i1+1:i1+i2);
f3=wb(i1+i2+1:i1+i2+i3);
f4=wb(i1+i2+i3+1:i1+i2+i3+i4);
wb1=reshape(f1,n1,n_input);
wb2=reshape(f2,n_output,n1);
bb1=reshape(f3,n1,1);
bb2=reshape(f4,n_output,1);
elseif n1==8
wb=xlsread(['weight' num2str(n1) '.xlsx']);
i1=n1*n_input;
i2=n_output*n1;
i3=n1;
i4=n_output;
f1=wb(1:i1);
f2=wb(i1+1:i1+i2);
f3=wb(i1+i2+1:i1+i2+i3);
f4=wb(i1+i2+i3+1:i1+i2+i3+i4);
wb1=reshape(f1,n1,n_input);
wb2=reshape(f2,n_output,n1);
bb1=reshape(f3,n1,1);
bb2=reshape(f4,n_output,1);
end
net = newff(inputs,targets,4,{'tansig','purelin'},'trainlm');
n.IW{1,1}=wb1;
n.LW{2,1}=wb2;
n.b{1}=bb1;
n.b{2}=bb2;
And after training for saving the network you want :
[net tr] = train(net,inputs,targets);
wb11=n.IW{1,1};
wb22=n.LW{2,1};
bb11=n.b{1};
bb22=n.b{2};
wbzz=[wb11(:);wb22(:);bb11;bb22]';
xlswrite('weight.xlsx',wbzz,'Sheet1');