MATLAB中的神经网络,初始权重

时间:2011-10-17 16:00:05

标签: matlab neural-network

我使用newff(...)在MATLAB中创建了神经网络。当您使用相同的输入和输出进行训练时,不同运行的训练结果会有所不同。我知道它正在发生,因为每次运行它时权重都不同。我的问题是每次训练我的NN时如何使初始权重相同,这样我才能得到相同的结果? 另外,是否可以从训练No1中保存一些重量,后者用它来训练No2,以及如何?

TNX

4 个答案:

答案 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');