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

Posted

技术标签:

【中文标题】MATLAB 中的神经网络,初始权重【英文标题】:Neural Networks in MATLAB, initial weights [closed] 【发布时间】:2011-12-09 10:18:35 【问题描述】:

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

Tnx

【问题讨论】:

你想实际训练神经网络吗?如果您在每个训练周期中使用相同的权重(即权重不变),那么您就无法训练神经网络……那么您的目标是什么? 是的,我确实想训练神经网络。在我的 .m 文件中,我创建、训练和模拟 NN。但是当我第三次运行它时,我得到了网络训练的最佳性能。所以,我的想法是保存第二次运行的权重,并在下次使用它们作为初始权重(所以我不需要连续运行 3 次)。 【参考方案1】:

到generate reproducible results,需要在代码开头手动将随机数生成器设置为相同的种子/状态。这可以在number of ways 中完成(取决于您拥有的 MATLAB 版本):

旧式:

rand('twister',1234)

更新后的样式:

RandStream.setGlobalStream( RandStream('mt19937ar','Seed',1234) );

R2011a 中引入了new function,简化了最后一次调用:

rng(1234,'twister')

后一种语法是推荐的方法。

【讨论】:

【参考方案2】:

作为旁注,而不是直接答案,有一个叫做Nguyen Widrow initialization and it's already implemented in Matlab's Neural Net toolbox 的东西。

根据我的经验,它运行良好,可以帮助神经网络更快地收敛。我发现它也使结果更加一致。我建议按照Amro's post 使用它以及固定随机种子。

【讨论】:

Chris 是对的,请仔细检查默认使用哪种权重初始化,因为在 MATLAB 的最新版本中,默认不是随机初始化,而是 Nguyen Widrow 初始化算法。【参考方案3】:

不同的 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.layersi.initFcn='initnw';

【讨论】:

开始格式化您的代码,失去了耐心 ;-) 请自己编辑并删除反引号【参考方案4】:
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.IW1,1=wb1;
    n.LW2,1=wb2;
    n.b1=bb1;
    n.b2=bb2;


And after training for saving the network you want :

[net tr] = train(net,inputs,targets);

wb11=n.IW1,1;
    wb22=n.LW2,1;
    bb11=n.b1;
    bb22=n.b2;

    wbzz=[wb11(:);wb22(:);bb11;bb22]';

    xlswrite('weight.xlsx',wbzz,'Sheet1');

【讨论】:

以上是关于MATLAB 中的神经网络,初始权重的主要内容,如果未能解决你的问题,请参考以下文章

pytorch卷积层中的第一个初始化权重是啥

MATLAB 中的神经网络

请问matlab中RBF神经网络newrbe函数用的啥算法

MATLAB深度学习单层神经网络

为啥要将神经网络的权重初始化为随机数? [关闭]

使用 Tensorflow 初始化神经网络权重