700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 遗传算法之优化BP神经网络

遗传算法之优化BP神经网络

时间:2022-01-25 16:18:32

相关推荐

遗传算法之优化BP神经网络

GA算法优化BP神经网络(matlab)

这里我首先要介绍一下BP神经网络的一些特点,因为在以下的编程中,我将把这些特点运用在其中,防止大家不知道为什么这样做。

1.bp神经网络的层数一般3层效果较好,即只包含输入层、一层的隐藏层、输出层。

2.bp神经网络的隐藏层神经元个数一般为输入层神经元个数的2倍再加1,即hiddennum=inputnum*2+1。

3.我们用的是遗传算法工具箱来解决的问题

1.GA算法优化神经网络的参数介绍

本遗传算法优化的部分是输入层与隐藏层的权值w1和偏置b1;隐藏层与输出层的权值w2和偏置b2。

2.准备训练的数据

本文是利用bp神经网络进行分类,是分类问题,一共采取的共12组数据,其中9组数据作为训练,3组数据作为测试,数据如下:

所有数据已经进行完归一化操作。

训练集数据如下:

标签值:

3.构建bp神经网络算法

这一步我们主要是构建了bp神经网络,并将神经网络的误差计算了出来,为下一步构造适应度函数奠定基础,我已经将代码的解释详细地写在了代码注释中。

%%将神经网络作为遗传算法主函数function error=Bpnetfun(x,P,T,hiddennum,P_test,T_test)%%设置bp神经网络的误差函数作为适应度函数%%设置函数其中的参数,x为,P为输入的训练样本,T为训练样本的输出%%hiddennum为隐藏层神经元个数%%p_test表示测试样本的输入 T_test表示测试样本的输出%% 1.输入神经网络的输入层和输出层的结构inputnum=size(P,1)%输入层的神经元个数以输入数据为依据outputnum=size(T,1)%输出层同上%% 2.建立 BP 神经网络的结构net=feedforwardnet(hiddennum) %feedforwardnet是建立前馈神经网络,当然也可以用netffnet=configure(net,P,T)net.layers{2}.transferFcn='logsig';%表示的是隐藏层到输出层的激活函数为s型对数函数%% 3.设置参数,训练次数为1000,训练目标为0.01,学习速率为0.1net.trainParam.epochs=1000;net.trainParam.goal=0.01;net.trainParam.lr = 0.1;net.trainParam.show=NaN; % 不显示图形框%% BP神经网络初始权值和阈值w1num=inputnum*hiddennum; % 输入层到隐层的w个数w2num=outputnum*hiddennum;% 隐含层到输出层的w个数w1=x(1:w1num); %初始输入层到隐含层的权值B1=x(w1num+1:w1num+hiddennum); %隐层神经元阈值w2=x(w1num+hiddennum+1:w1num+hiddennum+w2num); %初始隐层到输出层的权值B2=x(w1num+hiddennum+w2num+1:w1num+hiddennum+w2num+outputnum); %输出层阈值net.iw{1,1}=reshape(w1,hiddennum,inputnum);%net.iw{1,1}代表输入层与隐藏层之间的权值net.lw{2,1}=reshape(w2,outputnum,hiddennum);%net.lw{2,1}隐藏层与输出层之间的权值net.b{1}=reshape(B1,hiddennum,1);net.b{2}=reshape(B2,outputnum,1);%% 训练网络net=train(net,P,T);%% 测试网络Y=sim(net,P_test);error=norm(Y-T_test);%norm这个函数可以百度一下,有点类似于计算均方误差,默认是2次方end

4.构建遗传算法的适应度函数

这里我们需要借助上面的部分构建适应度函数Obj,用来评判种群的好坏。

%%构建Obj函数用来作为ga的目标函数function Obj=Objfun(X,P,T,hiddennum,P_test,T_test)%% 用来分别求解种群中各个个体的目标值%% 输入% X:所有个体的初始权值和阈值% P:训练样本输入% T:训练样本输出% hiddennum:隐含层神经元数% P_test:测试样本输入% T_test:测试样本期望输出%% 输出% Obj:所有个体的预测样本的预测误差的范数%这里是m个种群,每个m中含有n个参数[M,N]=size(X);Obj=zeros(M,1);%初始化一个空向量用来存放每个种群的errorfor i=1:M %用循环来保存每个种群的errorObj(i)=Bpnetfun(X(i,:),P,T,hiddennum,P_test,T_test);end

5.构建遗传算法来优化bp神经网络的权值w和偏置b

这里有些地方要说明一下,首先是变量的个数:我们输入层有15个神经元,隐藏层有31个神经元,输出层有3个(我们这里做的是3分类问题),那么w1就有31x15个,b1有31个;w2有15x3个,b2有3个,一共加起来有592个参数。其次是关于种群初始化:我们设定有40个种群,这40个种群中每个种群都含有592个变量,且都需要用2进制表示。所以初始化时,需要生成40*5920维度的矩阵。代码详细部分如下:

clcclear close all%% 加载神经网络的训练样本 测试样本每列一个样本 输入P 输出T%样本数据就是前面问题描述中列出的数据load data% warning('off')% 初始隐层神经元个数hiddennum=31;%一般情况下,bp网络的隐藏层神经元个数为输入层神经元个数的两倍加1% 输入向量的最大值和最小值threshold=[0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1];inputnum=size(P,1); % 输入层神经元个数outputnum=size(T,1);% 输出层神经元个数w1num=inputnum*hiddennum; % 输入层到隐层的权值个数w2num=outputnum*hiddennum;% 隐层到输出层的权值个数N=w1num+hiddennum+w2num+outputnum; %待优化的变量的个数%% 定义遗传算法参数NIND=40; %个体数目MAXGEN=50;%最大遗传代数PRECI=10; %变量的二进制位数GGAP=0.95;%代沟px=0.7; %交叉概率pm=0.01; %变异概率trace=zeros(N+1,MAXGEN);%寻优结果的初始值(初始化操作)FieldD=[repmat(PRECI,1,N);repmat([-0.5;0.5],1,N);repmat([1;0;1;1],1,N)];%区域描述器,这一项主要是用来控制个体由2进制变成10进制的规则(个人理解就是数据由2进制转化为10进制并对样本进行归一化的过程)Chrom=crtbp(NIND,PRECI*N);%初始种群 这里会生成一个40 x(10*N)的矩阵,即每一个种群中都包含了N个2进制的数用来表示N个个体%% 优化gen=0; %代计数器X=bs2rv(Chrom,FieldD); %计算初始种群的十进制转换(根据上述规则将X的2进制转化为10进制)ObjV=Objfun(X,P,T,hiddennum,P_test,T_test); %计算目标函数值(将X带入适应度函数进行判断)while gen<MAXGENfprintf('%d\n',gen)FitnV=ranking(ObjV);%分配适应度值SelCh=select('sus',Chrom,FitnV,GGAP); %选择SelCh=recombin('xovsp',SelCh,px); %重组SelCh=mut(SelCh,pm); %变异X=bs2rv(SelCh,FieldD);%子代个体的十进制转换ObjVSel=Objfun(X,P,T,hiddennum,P_test,T_test); %计算子代的目标函数值(经过交叉变异重组后再次计算适应度)[Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入子代到父代,得到新种群X=bs2rv(Chrom,FieldD);%上述while中的计算都是用的2进制编码形式,接着将新的X转换为10进制gen=gen+1;%代计数器增加%获取每代的最优解及其序号,Y为最优解个体的值,I为个体的序号[Y,I]=min(ObjV);trace(1:N,gen)=X(I,:); %记下每代的最优值trace(end,gen)=Y; %记下每代的最优值end%% 画进化图figure(1);plot(1:MAXGEN,trace(end,:));grid onxlabel('遗传代数')ylabel('误差的变化')title('进化过程')bestX=trace(1:end-1,end);bestErr=trace(end,end);fprintf(['最优初始权值和阈值:\nX=',num2str(bestX'),'\n最小误差err=',num2str(bestErr),'\n'])

最后运行就可以了,它会一直跳,需要等一会,不要着急。大家有啥问题可以在评论区提问,最终运行结果如下:

当然了,除了GA优化神经网络,还有粒子群,蚁群,人工鱼,蜂群等都可以用来优化神经网络,大家可以试试。作为初学者,下次准备利用GA优化预测型的bp神经网络。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。