【BP-GA】基于GA的BP神经网络优化算法
Navigator
- BP-network
- GA优化BP思路
- BP创建
- 激活函数设置
- GA
- 种群初始化
- 适应度函数
- 选择算子
- 交叉算子
- 变异算子
- Code
- GA对比
- Reference
BP-network
BP网络是前向神经网络中最核心的部分,但是存在一些缺陷,学习收敛速度较慢,不能保证收敛到全局最小点,网络结构不确定等。
GA优化BP思路
主要部分为:BP神经网络确定,GA优化权值和阈值,BP进行训练&预测
BP创建
BP创建一般遵循以下原则
- 对于一般的模式识别问题,三层网络即可适用
- 三层网络中,隐藏层神经元个数n2n_2n2和输入层神经元个数n1n_1n1具有如下近似关系:
n2=2×n1+1n_2=2\times n_1+1 n2=2×n1+1 - 泛化能力的设置:将测试样本的测试误差的范数作为衡量网络的一个泛化能力的标准,通过该误差计算个体适应度值,个体误差范数越小,个体适应度值越大
激活函数设置
隐藏层的传递函数使用S
型tansig
,输出层神经元的传递函数使用S
型对数函数logsig()
GA
种群初始化
使用二进制编码,由输入层与隐藏层链接权值,隐藏层权值,隐藏层与输出层权值,输出层权值四部分组成,每个权值和阈值使用M
位的二进制编码,将所有权值和阈值编码链接为一个个体编码。
适应度函数
采用预测样本的预测值与期望值的误差矩阵的范数作为目标函数的输出,适应度函数采用排序的适应度配分函数
FitnV=ranking(obj)FitnV=ranking(obj) FitnV=ranking(obj)
其中obj
为目标函数的输出
选择算子
选择算子使用随机遍历抽样(sus
)
交叉算子
使用简单的单点交叉算子
变异算子
变异以一定概率产生变异基因数,使用随机方法选择出变异的基因,如果所选择基因的编码为1则转为0,反之则转为1.
Code
%% BP network (未经过GA优化版本)
% # of hidden layers: 31
net = feedforwardnet(31);
net.layers{2}.transferFcn='logsig';% set training parameters
net.trainParam.epochs = 1000;
net.trainParam.goal = 0.01;
net.trainParam.lr = 0.1;% train & test network
net = train(net, P, T);
Y = sim(net, P_test);%% GA-BP
clc;
clear all;
close all;load data;
nHidden = 31;
% max/min value of input vector 输入向量
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];
nInput = size(P, 1); % 输入层的神经元的个数
nOutput = size(T, 1); % 隐含层的神经元的个数
w1num = nInput*nHidden; % 输入层到隐藏层的权值个数
w2num = nOutput*nHidden; % 隐藏层到输出层的权值个数
N = w1num+nHidden+w2num+nOutput; % 待优化变量的数量% GA参数
NIND = 40; % 种群大小
MAXGEN = 50; % 最大遗传代数
PRECI = 10; % 个体长度
GGAP = 0.95; % 代沟
px = 0.7; % 排序
pm = 0.1; % 变异概率
trace = zeros(N+1, MAXGEN); % 寻优结果FieldD = [repmat(PRECI, 1, N); repmat([-0.5; 0.5], 1, N); repmat([1; 0; 1; 1], 1, N)]; % 区域描述器, Matrix describing the length and how to decode each substring in the chromsome.
Chrom = crtbp(NIND, PRECI*N); % 创建初始种群
gen = 0;
X = bs2rv(Chrom, FieldD); % 初始种群的十进制转换
ObjV = Objfunc(X, P, T, nHidden, P_test, T_test);
while gen<MAXGENfprintf('Generation: %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 = Objfunc(X, P, T, nHidden, P_test, T_test); % 子代目标函数值[Chrom, ObjV] = reins(Chrom, SelCh, 1, 1, ObjV, ObjVSel); % 将子代重插入到父代中,得到新的种群gen = gen+1;% 获取每代的最优解(Y)以及序号(I)[Y, I] = min(ObjV);trace(1:N, gen) = X(I, :);trace(end, gen)=Y;
end%% plot evolutionary figure
figure(1);
plot(1:MAXGEN, trace(end, :));
grid on;
xlabel('Generations of GA');
ylabel('Error');
title('Process of evolutionary');% output optimized information
bestX = trace(1:end-1, end);
bestErr = trace(end, end);
%fprintf('Optimal initial weights and threshold:\nX= ', num2str(bestX'));
fprintf('Minimum Error = %d\n', num2str(bestErr));
GA对比
clc;
%% 对比使用GA前后的差别
%% 使用随机权重和阈值
nInput = size(P, 1); % 输入层神经元的个数
nOutput = size(T, 1); % 输出层神经元的个数% BP
net = feedforwardnet(nHidden);
net = configure(net, P, T); % 配置训练集数据
net.layers{2}.transferFcn = 'logsig';
% 设置网络参数
net.trainParam.epochs = 1000;
net.trainParam.goal = 0.01;
net.trainParam.lr = 0.1;
net.trainParam.showWindow = false;% 训练网络
net = train(net, P, T);disp(['1. 使用随机权值和阈值']);
Y1 = sim(net, P_test)
err1 = norm(Y1-T_test); % 测试样本的仿真误差
err11 = norm(sim(net, P)-T); % 训练样本的仿真误差
fprintf('Test samples error = %.4f\n', err1);
fprintf('Train samples error = %.4f\n', err11);%% 优化参数
% BP
net = feedforwardnet(nHidden);
net = configure(net, P, T); % 配置训练集数据
net.layers{2}.transferFcn = 'logsig';
% 设置网络参数
net.trainParam.epochs = 1000;
net.trainParam.goal = 0.01;
net.trainParam.lr = 0.1;
net.trainParam.showWindow = false;w1num = nInput*nHidden;
w2num = nOutput*nHidden;
w1 = bestX(1:w1num);
B1 = bestX(w1num+1:w1num+nHidden);
w2 = bestX(w1num+nHidden+1: w1num+nHidden+w2num);
B2 = bestX(w1num+nHidden+w2num+1: w1num+nHidden+w2num+nOutput);
net.iw{1, 1}=reshape(w1, nHidden, nInput);
net.lw{2, 1}=reshape(w2, nOutput, nHidden);
net.b{1}=reshape(B1, nHidden, 1);
net.b{2} = reshape(B2, nOutput, 1);% train
net = train(net, P, T);
disp(['2. 使用优化后的权值和阈值']);
Y2 = sim(net, P_test)
err2 = norm(Y2-T_test);
err21 = norm(sim(net, P)-T);
fprintf('Test samples error = %.4f\n', err2);
fprintf('Train samples error = %.4f\n', err21);
Reference
Matlab智能算法
【BP-GA】基于GA的BP神经网络优化算法相关推荐
- 基于遗传算法的BP神经网络优化算法(GA BP)实用算例
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.工程背景 二.代码(部分) 1.引入库 2.读入数据 进化过程 注意 具体安装步骤 声明 前言 基于遗传算法的BP ...
- 一文概览神经网络优化算法
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一.机器学习的优化 机器学习的优化(目标),简单来说是:搜索模型的 ...
- Paper:论文解读《Adaptive Gradient Methods With Dynamic Bound Of Learning Rate》中国本科生提出AdaBound的神经网络优化算法
Paper:论文解读-<Adaptive Gradient Methods With Dynamic Bound Of Learning Rate>中国本科生(学霸)提出AdaBound的 ...
- 各种神经网络优化算法:从梯度下降到Adam方法
在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯度下降,还是Adam方法? 这篇文章介绍了不同优化算法之间的主要区别,以及如何选择最佳 ...
- 【深度学习】从梯度下降到 Adam!一文看懂各种神经网络优化算法
王小新 编译自 Medium 量子位 出品 | 公众号 QbitAI,编辑:AI有道 在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯 ...
- 神经网络优化算法总结【SGD】---【Adam】
在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯度下降,还是Adam方法? 这篇文章介绍了不同优化算法之间的主要区别,以及如何选择最佳 ...
- 深度学习教程(6) | 神经网络优化算法(吴恩达·完整版)
作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/35 本文地址:https://www.showmeai.tech/article-d ...
- 神经网络优化算法总结
Datawhale干货 编译:王小新,来源:量子位 在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯度下降,还是Adam方法? 这篇文 ...
- 从梯度下降到 Adam!一文看懂各种神经网络优化算法
来源丨量子位 编辑丨极市平台 导读 在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯度下降,还是Adam方法?这篇文章介绍了不同优化算 ...
- NeurIPS'18 | 种群进化随机梯度下降深度神经网络优化算法框架
,欢迎关注公众号:论文收割机(paper_reader) 因为排版问题,很多图片和公式无法直接显示,欢迎关注我们的公众号点击目录来阅读原文. 原文点击 ↓ 种群进化随机梯度下降深度神经网络优化算法框架 ...
最新文章
- PLM和PDM相互关系
- iOS学习笔记(1)--认识Xcode6.1的Interface Builder和常用快捷键
- [转]Javascript的IE和Firefox(火狐)兼容性
- chmod 是一条在Unix系统中用于控制用户对文件的权限的命令
- C语言浮点数的输出方法和示例
- 5G火车站来了!上海虹桥火车站5G网络建设正式启动...
- 基于Salt Event系统构建Master端returner
- 阿里云盘帮我扩容了10个T,拿来吧你!
- 45本程序员圣经级别书籍,包邮送到家
- linux无法运行sssverify,Synopsys Design Compiler在fedora Core 9下面的安装
- 职场生涯规划中必须学会的十种能力
- .NET调用百度天气api经验
- 计算机硬件 平面图,看懂室内平面图画法、平面配置原则,一次了解常见的平面图种类!...
- Android指南针应用
- 一个月薪10000的北京程序员的真实生活
- C语言六边形扫雷:寻宝模式
- 面试题 10.11. 峰与谷 ( 思维 )
- 从月薪3千到3万,需要努力多久?
- 达飞云贷:玩转节日,给你不一样的惊喜!
- 微信公众号根据openid获取unionid
热门文章
- 计算机测色配色应用,计算机测配色方法及注意事项
- 视频教程-全国计算机二级MS OFFICE考前冲刺课程-计算机等级考试
- 中国熊果苷市场运营效益及投资盈利预测报告(新版)2022-2027年
- 报错: EBUSY: resource busy or locked, lstat ‘C:\hiberfil.sys‘
- Float类型出现舍入误差的原因
- maven项目install报错:\target\surefire-reports for the individual test results
- 教会如何使用WordPress提供在线讲道
- 优化UE4性能 、减少DrawCall——材质中使用自定义基元数据
- Android reboot那点事儿
- Python中pass的使用