Matlab遗传算法优化的BP神经网络(两个隐含层)

看了王小川的《MATLAB神经网络43个案例分析》,第三章的遗传算法优化BP神经网络,讲了只有一个隐含层的神经网络如何使用遗传算法优化,这个代码网络上现在都有,我刚开始用这个代码跑了一下自己的样本,结果效果不好,除了要修改样本之外,我考虑到了是不是因为神经网络的层数较为单一了,只有一个隐含层,学习的效果不会太好,于是打算着手修改加一个 隐含层,五一之前调了一次,没改的出来,五一之后静下心重看了一遍,虽然能调试出来,但是效果还不是很好,希望大家能给些指点。

构建的神经网络有两个隐含层,原书上只给出一个,所以原hiddennum要改为hiddennum1和hiddennum2,然后有一个newff的写法问题,说有新旧写法,这里引用一下matlab中newff新旧用法差异。

%节点个数
inputnum=5;
hiddennum1=8;
hiddennum2=8;
outputnum=1;

%构建网络
net=newff(inputn,outputn,[hiddennum1 hiddennum2]);

然后节点总数就得修改了

%节点总数
numsum=inputnum*hiddennum1+hiddennum1+hiddennum1*hiddennum2+hiddennum2+hiddennum2*outputnum+outputnum;

fun函数也需要修改,多加一个隐含层

function error = fun(x,inputnum,hiddennum1,hiddennum2,outputnum,net,inputn,outputn)

修改权值和偏置,这边如果算的不对后面会提示出错,也就是reshape,错误RESHAPE,请勿更改元素数目,大致的意思就是w1,w2,w3里面所存的元素数量和你建立的神经网络结构不匹配,像我用的网络是5-8-8-1,

w1的范围是x(1:40),B1的范围是x(41:48)

w2的范围是x(49:112),B2的范围是x(113:120)

w3的范围是x(121:128),B3的范围是x(128:136)

这里我琢磨了挺久,不知道为什么数据的范围是这样的,其实这个和我们选择的网络有关系,输入层到隐含层1,5—8,

w1就是5x8=40个,然后偏置b1=8,隐含层1到隐含层2,8—8,w2就是8x8=64,偏置b2依然是8,隐含层2到输出层,8—1,w3就是8,b3=8。要花点耐心查一下。

w1=x(1:inputnum*hiddennum1);
B1=x(inputnum*hiddennum1+1:inputnum*hiddennum1+hiddennum1);
w2=x(inputnum*hiddennum1+hiddennum1+1:inputnum*hiddennum1+hiddennum1+hiddennum1*hiddennum2);
B2=x(inputnum*hiddennum1+hiddennum1+hiddennum1*hiddennum2+1:inputnum*hiddennum1+hiddennum1+hiddennum1*hiddennum2+hiddennum2);
w3=x(inputnum*hiddennum1+hiddennum1+hiddennum1*hiddennum2+hiddennum2+1:inputnum*hiddennum1+hiddennum1+hiddennum1*hiddennum2+hiddennum2+hiddennum2*outputnum);
B3=x(inputnum*hiddennum1+hiddennum1+hiddennum1*hiddennum2+hiddennum2+hiddennum2*outputnum+1:inputnum*hiddennum1+hiddennum1+hiddennum1*hiddennum2+hiddennum2+hiddennum2*outputnum+outputnum);

赋值问题是参见的百度的一个:

net.IW 属性定义了从网络输入向量到网络层的权值向量(即输入层的权值向量)结构。其值为Nl*Ni的细胞矩阵,Nl为网络层数(net.numLayers),Ni为输入向量数(net.numInputs)。通过访问net.IW{i,j},可以获得第i 个网络层来自第j 个输入向量的权值向量值。 所以一般情况下net,iw{1,1}就是输入层和隐含层之间的权值。

net.LW定义了从一个网络层到另一个网络层的权值向量结构。其值为Nl*Nl的细胞矩阵,Nl为网络层数(net.numLayers)。通过访问net.LW{i,j},可以获得第i 个网络层来自第j 个网络层的权值向量值。 因此,如果网络是单隐含层,net.lw{2,1}就是输出层和隐含层之间的权值

%网络权值赋值
net.iw{1,1}=reshape(w1,hiddennum1,inputnum);
net.lw{2,1}=reshape(w2,hiddennum2,hiddennum1);
net.lw{3,2}=reshape(w3,outputnum,hiddennum2);
net.b{1}=reshape(B1,hiddennum1,1);
net.b{2}=reshape(B2,hiddennum2,1);
net.b{3}=B3;

然后就可以看结果了,因为神经网络容易陷入局部最小,所以可能还需要对样本进行修改。

Matlab遗传算法优化的BP神经网络(两个隐含层)_第1张图片

 

你可能感兴趣的:(Matlab遗传算法优化的BP神经网络(两个隐含层))