遗传算法优化BP神经网络的实例

本文内容为将遗传算法与BP神经网络算法相结合,优化神经网络的 权值阈值

BP网络是一类多层的前馈神经网络。它的名字源于在网络训练的过程中,调整网络的权值的算法是误差的反向传播的学习算法,即为BP学习算法。其具有结构简单,可调整的参数多,训练算 法好等优点。据统计,80以上的神经网络模型都是采用了BP网络或其变形。但其也具有学习收敛速度太慢、不能保证收敛到全局最小点等缺陷。

我们忽略实际工程问题背景,直接引入9组样本数据,每组样本数据含有15个变量(输入参数)。其结果(输出参数)为三种,我们分别用(1,0,0)、(0,1,0)和(0,0,1)来表示。同时为了对训练好的网络进行测试,另有三组新数据作为网络的测试数据。

样本数据和测试数据如下:

%%样本数据
%%样本输入参数
0.2286    0.2090    0.0442    0.2603    0.3690    0.0359    0.1759    0.0724   0.2634
0.1292    0.0947    0.0880    0.1715    0.2222    0.1149    0.2347    0.1909   0.2258
0.0720    0.1393    0.1147    0.0702    0.0562    0.1230    0.1829    0.1340   0.1165
0.1592    0.1387    0.0563    0.2711    0.5157    0.5460    0.1811    0.2409   0.1154
0.1335    0.2558    0.3347    0.1491    0.1872    0.1977    0.2922    0.2842   0.1074
0.0733    0.0900    0.1150    0.1330    0.1614    0.1248    0.0655    0.0450   0.0657
0.1159    0.0771    0.1453    0.0968    0.1425    0.0624    0.0774    0.0824   0.0610
0.0940    0.0882    0.0429    0.1911    0.1506    0.0832    0.0227    0.1064   0.2623
0.0522    0.0393    0.1818    0.2545    0.1310    0.1640    0.2056    0.1909   0.2588
0.1345    0.1430    0.0378    0.0871    0.0500    0.1002    0.0925    0.1586   0.1155
0.0090    0.0126    0.0092    0.0060    0.0078    0.0059    0.0078    0.0116   0.0050
0.1260    0.1670    0.2251    0.1793    0.0348    0.1503    0.1852    0.1698   0.0978
0.3619    0.2450    0.1516    0.1002    0.0451    0.1837    0.3501    0.3644   0.1511
0.0690    0.0508    0.0858    0.0789    0.0707    0.1295    0.1680    0.2718   0.2273
0.1828    0.1328    0.0670    0.0909    0.0880    0.0700    0.2668    0.2494   0.3220
%%样本输出参数
1,0,0     1,0,0     1,0,0     0,1,0     0,1,0     0,1,0     0,0,1     0,0,1    0,0,1

%%测试数据
%%测试输入参数
0.2101    0.2593    0.2599
0.0950    0.1800    0.2235
0.1298    0.0711    0.1201
0.1359    0.2801    0.0071
0.2601    0.1501    0.1102
0.1001    0.1298    0.0683
0.0753    0.1001    0.0621
0.0890    0.1891    0.2597
0.0389    0.2531    0.2602
0.1451    0.0875    0.1167
0.0128    0.0058    0.0048
0.1590    0.1803    0.1002
0.2452    0.0992    0.1521
0.0512    0.0802    0.2281
0.1319    0.1002    0.3205
%%测试输出参数
1,0,0     0,1,0     0,0,1
BP网络算法的实现:
  • 网络创建

对于本实例而言,样本有15个输入参数,3个输出参数。故我们取输入层神经元n1个数为15,输出层神经元n3个数为3。而隐含层神经网络个数n2由其与输入层神经元个数关系,得到其值为31。

其中权值个数为15 × 31 + 31 × 3 = 588 15\times31+31\times3=588 1 5 ×3 1 +3 1 ×3 =5 8 8,阈值个数为31 + 3 = 34 31+3=34 3 1 +3 =3 4。所以遗传算法优化参数的个数为592。

神经网络的隐含层神经元的传递函数采用S型正切函数 tansig(),输出层神经元的传递函数采用S型对数函数 logsig()。P为输入样本矩阵,则创建网络可以用代码:

net=newff(minmax(P),[hiddennum,outputnum],{'tansig','logsig'},'trainlm');
  • 网络训练和测试

网络训练是不断修正权值和阈值的过程,使误差越来越小。训练函数为 train()。通过以下代码进行网络参数设置和调用函数。代码如下:

%% 设置网络参数:训练次数为1000,训练目标为0.01,学习速率为0.1
net.trainParam.epochs=1000;
net.trainParam.goal=0.01;
LP.lr=0.1;
net.trainParam.show=NaN;

网络训练之后,再对网络进行测试。P_test为测试数据。测试代码如下:

Y=sim(net,P_test);
遗传算法的实现:

实例使用谢菲尔德工具箱,实现种群初始化,适应度函数,选择、交叉、变异和重插来优化BP神经网络中的权值和阈值。其中参数有:种群大小为40,遗传迭代次数为50,变量二进制位数为10,交叉概率设置为0.7,变异概率设置为0.01,代沟设置为0.95。

MATLAB程序实现:

案例将神经网络算法中预测样本所得到的误差值的范数座位遗传算法中的目标函数。误差越小则表示网络的预测精度越高,在遗传算法部分得到的该个体的适应度值也越大。

神经网络算法代码:
function err=Bpfun(x,P,T,hiddennum,P_test,T_test)
%% 训练&测试BP网络
%% 输入
% x:一个个体的初始权值和阈值
% P:训练样本输入
% T:训练样本输出
% hiddennum:隐含层神经元数
% P_test:测试样本输入
% T_test:测试样本期望输出
%% 输出
% err:预测样本的预测误差的范数

inputnum=size(P,1);       % 输入层神经元个数
outputnum=size(T,1);      % 输出层神经元个数
%% 新建BP网络
net=newff(minmax(P),[hiddennum,outputnum],{'tansig','logsig'},'trainlm');
%% 设置网络参数:训练次数为1000,训练目标为0.01,学习速率为0.1
net.trainParam.epochs=1000;
net.trainParam.goal=0.01;
LP.lr=0.1;
net.trainParam.show=NaN;
% net.trainParam.showwindow=false;  %高版MATLAB
%% BP神经网络初始权值和阈值
w1num=inputnum*hiddennum; % 输入层到隐层的权值个数
w2num=outputnum*hiddennum;% 隐层到输出层的权值个数
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.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=reshape(B2,outputnum,1);
%% 训练网络以
net=train(net,P,T);
%% 测试网络
Y=sim(net,P_test);
err=norm(Y-T_test);
遗传算法主函数:
%% 加载神经网络的训练样本 测试样本每列一个样本 输入P 输出T
%样本数据就是前面问题描述中列出的数据
load data
% 初始隐层神经元个数
hiddennum=31;
% 输入向量的最大值和最小值
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)];   %区域描述器
Chrom=crtbp(NIND,PRECI*N);                      %初始种群
%% 优化
gen=0;                                 %代计数器
X=bs2rv(Chrom,FieldD);                 %计算初始种群的十进制转换
ObjV=Objfun(X,P,T,hiddennum,P_test,T_test);        %计算目标函数值
while gen
最终结果:

最小误差范值err=0.05185。误差进化图如下:

遗传算法优化BP神经网络的实例

需要源码请在文章下留言

Original: https://blog.csdn.net/lxy_1015/article/details/112164900
Author: lxy_1015
Title: 遗传算法优化BP神经网络的实例

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/691270/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球