MATLAB BP神经网络的设计与优化
MATLAB BP神经网络的设计与优化
- 前言
- 一、数据集划分
- 二、网络拓扑结构确定
- 2.1 输入层与输出层
- 2.2 隐藏层个数与单元数
- 2.3 传递函数、学习函数与性能函数
- 三.初始权值、阈值的确定
- 3.1 随机给定[-1 1]
- 3.2 优化算法优化初始权值、阈值
- 四、训练参数设定
- 五、训练及训练效果评价
- 六、训练结果
- 七、传统BP训练与自适应学习率+动量学习训练对比
- 总结
前言
- BP(Back Propagation)神经网络,利用误差的反向传播进行权值阈值更新的前馈型神经网络,常用于解决拟合或者分类问题 。
关于神经网络和BP神经网络计算原理的详细说明和推导很多优秀的博主都已经做了相关工作:
- 神经网络学习 之 BP神经网络
- BP神经网络通俗教程(matlab实现方法)
- 一文搞定BP神经网络——从原理到应用(原理篇)
本文主要目的是针对自己在学习和做项目过程中应用BP神经网络的经验做一些总结。内容主要包括基于MATLAB的BP神经网络设计步骤以及相关优化方面的介绍。如果你已经大概了解完计算原理,正在为你对大小论文的内容进行探索,或许阅读本文可以加快你的进程。
一、数据集划分
为了避免模型在训练过程中出现过拟合的情况,针对自己的数据体量的不同,我们可以采用不同对方式对数据集进行划分。
数据集足够大时,可以采用训练集、测试集、验证集的划分方式,划分比例为:0.7 、0.15 、0.15 工具箱默认划分方式。
采用训练集、测试集的划分方式,一般比例为:0.8、0.2。
数据集少时采用留一法,进行循环交叉验证。
数据集少时,还可以通过一些方法实现数据集的增量,例如加入白噪声之后的数据以及旋转、缩小、放大后的图像。
二、网络拓扑结构确定
2.1 输入层与输出层
确定模型的输入与输出,例如研究x,y,z对t的影响。输入为3个,输出为1个,这里我想表达的是确定研究因素x y z的过程。很多因素可能是在仿真或者实验过程中全部可记录的数据,如果因素很多的情况下,可以考虑在进行训练前进行数据维度的降维处理例如:
- 机器学习中的线性映射和非线性映射方法两大方法。
- 线性映射:PCA 、LAD
- 非线性映射: 核方法(核+线性),二维化和张量化(二维+线性),流形学习(ISOMap,LLE,LPP)
2.2 隐藏层个数与单元数
(1)隐藏层个数的确定
在很多地方我们都可以看到这样一句话:
- 三层的BP神经网络可以以任意精度逼近一个任意给定的连续函数
当然这么多年的应试教育经历告诉我,要相信它。所以一般我都先用3层的进行仿真实验,实在不行最后再选择更改层数。
(2)隐藏层单元个数的确定
有两个方法:
- 给定大致范围,循环单元个数,以训练效果作为判断条件
- 参考现有文献中的经验公式确定单元个数,例如:
n=log2(输入单元数);
n=sqrt(输入单元数+输出神经元数)+a (a为[0,10]之间的常数)。
这里第二个经验公式可以结合方法1进行使用
这里,我想说两个地方。一个是对于隐藏层个数与单元数理论上来说都可以简单粗暴的使用循环来进行选择,当然前提是训练集的划分一致并且你的时间够,当然涉及到初始阈值和权值对网络的影响这个过程就变得相对复杂了很多。这也是我想说的第二点,能否考虑将初始阈值和权值对具体网络训练的影响进行某种简化的定量分析?这样一来,或许就可以使用优化算法对整个拓扑结构进行优化分析。当然这个只是我自己的瞎想,它实现的可行性和复杂性还真不好说。
2.3 传递函数、学习函数与性能函数
函数 | 函数名称 | 用途 |
---|---|---|
传递函数 | logsig | S型对数函数 |
传递函数 | dlogsig | S型对数函数的导数 |
传递函数 | tansig | S型正切函数 |
传递函数 | dtansig | S型正切函数的导数 |
传递函数 | purelin | 纯线性函数 |
传递函数 | dpurelin | 纯线性函数的导数 |
学习函数 | learngd | 基于梯度下降法的学习函数 |
学习函数 | learngdm | 梯度下降动量学习函数 |
性能函数 | mes | 均方误差函数 |
性能函数 | mesreg | 均方误差规范化函数 |
三.初始权值、阈值的确定
3.1 随机给定[-1 1]
matlab工具箱中,默认初始值给定为[-1 1]之间对初始权值阈值进行随机给定。
3.2 优化算法优化初始权值、阈值
现在常见论文中,在确定好神经网络对拓扑结构后,对初始权值、阈值进行优化后再进行训练。让训练的起点相对较好,这里常用到:
- GA-BP
- PSO-BP
- GSO-BP
- ACO-BP
- BFO-BP
- ABC-BP
同时也是论文做算法比较常见的地方,当然这里的优化算法可以使用各种群智能算法,甚至改进优化算法来对BP神经网络的初值进行优化选择。这个方法很不错,可以用来快速搭建论文。关键在如何根据阈值和权值来复现这个网络,从而实现优化算法正确的适应度函数。
四、训练参数设定
训练模型的参数设定影响着训练效果,要针对不同的模型进行相关的调整。
项目 | 函数 |
---|---|
最大迭代次数 | net.trainParam.epochs |
训练目标 | net.trainParam.goal |
训练时间 | net.trainParam.time |
最小梯度性能 | net.trainParam.min_grad |
最大确认失败次数 | net.trainParam.max_fail |
所用线性搜索路径 | net.trainParam.searchFcn |
学习率 | net.trainParam.lr |
动量因子 | net.trainParam.mc |
五、训练及训练效果评价
利用train函数对网络进行训练之后,可以在工具箱自带的界面中查看训练过程和训练结果。
关于这里的Regression图我看到知乎和百度上都有人问,横纵坐标其实就是归一化之后的真实值和预测值,表征回归的效果。
当然为了更加方便判断模型训练完的预测效果,可以使用R2(决定系数(coefficient ofdetermination),有的教材上翻译为判定系数,也称为拟合优度。)评价预测数据和实际数据之间的相关程度。方便用来做程序的循环终止条件。
这里我之前有记录自己使用的R2计算公式以及在csdn上看到的一篇博客,可以作为参考:
- MATLAB 计算 确定系数R2
%y1为预测值 y为实际值
R2=1 - (sum((y1- y).^2) / sum((y - mean(y)).^2))
- 基于MATLAB的R方计算
function [r2 rmse] = rsquare(y,f,varargin)
% Compute coefficient of determination of data fit model and RMSE
%
% [r2 rmse] = rsquare(y,f)
% [r2 rmse] = rsquare(y,f,c)
%
% RSQUARE computes the coefficient of determination (R-square) value from
% actual data Y and model data F. The code uses a general version of
% R-square, based on comparing the variability of the estimation errors
% with the variability of the original values. RSQUARE also outputs the
% root mean squared error (RMSE) for the user's convenience.
%
% Note: RSQUARE ignores comparisons involving NaN values.
%
% INPUTS
% Y : Actual data
% F : Model fit
%
% OPTION
% C : Constant term in model
% R-square may be a questionable measure of fit when no
% constant term is included in the model.
% [DEFAULT] TRUE : Use traditional R-square computation
% FALSE : Uses alternate R-square computation for model
% without constant term [R2 = 1 - NORM(Y-F)/NORM(Y)]
%
% OUTPUT
% R2 : Coefficient of determination
% RMSE : Root mean squared error
%
% EXAMPLE
% x = 0:0.1:10;
% y = 2.*x + 1 + randn(size(x));
% p = polyfit(x,y,1);
% f = polyval(p,x);
% [r2 rmse] = rsquare(y,f);
% figure; plot(x,y,'b-');
% hold on; plot(x,f,'r-');
% title(strcat(['R2 = ' num2str(r2) '; RMSE = ' num2str(rmse)]))
%
% Jered R Wells
% 11/17/11
% jered [dot] wells [at] duke [dot] edu
%
% v1.2 (02/14/2012)
%
% Thanks to John D'Errico for useful comments and insight which has helped
% to improve this code. His code POLYFITN was consulted in the inclusion of
% the C-option (REF. File ID: #34765).if isempty(varargin); c = true;
elseif length(varargin)>1; error 'Too many input arguments';
elseif ~islogical(varargin{1}); error 'C must be logical (TRUE||FALSE)'
else c = varargin{1};
end% Compare inputs
if ~all(size(y)==size(f)); error 'Y and F must be the same size'; end% Check for NaN
tmp = ~or(isnan(y),isnan(f));
y = y(tmp);
f = f(tmp);if c; r2 = max(0,1 - sum((y(:)-f(:)).^2)/sum((y(:)-mean(y(:))).^2));
else r2 = 1 - sum((y(:)-f(:)).^2)/sum((y(:)).^2);if r2<0% http://web.maths.unsw.edu.au/~adelle/Garvan/Assays/GoodnessOfFit.htmlwarning('Consider adding a constant term to your model') %#ok<WNTAG>r2 = 0;end
endrmse = sqrt(mean((y(:) - f(:)).^2));
六、训练结果
通过训练集模型的训练,测试集模型的检验,我们认为当前的模型以及可用了,可以完成数值预测以及分类预测任务。
当然,如果你需要有模型复现这个过程的话,记住要保存好对应的权重、阈值、归一化参数、反归一化参数,记录好网络结构中你使用的激活函数,利用激活函数和矩阵运算复现网络。经验表明,归一化时需要归一化到【-1,1】范围内,能够完美复现网络。
ps_input %归一化参数
ps_output%返归一化参数
W1=net.IW{1,1};
W2=net.LW{2,1};
B1=net.b{1} ;
B2=net.b{2} ;
具体操作可以参考下文:
- Matlab训练好BP神经网络后,怎么根据权值和阈值来计算呢?
七、传统BP训练与自适应学习率+动量学习训练对比
以拟合函数f(x)=cos(x)为例(这里只考虑训练方法的对比,未对数据集进行划分):
- 分别以传统BP训练:traingd、自适应学习率+动量学习训练:traingdx、Levenberg-Marquadt:tranlm
传统BP训练:traingd (时间长、收敛慢)
自适应学习率+动量学习训练:traingdx (时间较短、收敛较快)
Levenberg-Marquadt:tranlm (时间段、收敛快)
源码:
clc;
clear;
x=0:0.1:2*pi;
y=cos(x);%% I.数据读取
p_train=x;
t_train=y;
%% II.数据归一化
[P_train, ps_input] = mapminmax(p_train,-1,1);
[T_train, ps_output] = mapminmax(t_train,-1,1);
p = P_train;
t = T_train;
%% III.BP神经网络建立
% 1.创建网络
net = newff(p,t,4,{'tansig','purelin'},'trainlm');
% net = newff(p,t,4,{'tansig','purelin'},'traingd');
% net = newff(p,t,4,{'tansig','purelin'},'traingdx');
% 2.设置训练参数
net.trainParam.epochs = 2000; %运行次数
net.trainParam.goal = 1e-3; %目标误差
net.trainParam.lr = 0.035; %学习率
net.trainParam.mc = 0.85; %动量因子
net.divideFcn = ''; %清除样本数据分为训练集、验证集和测试集命令
%%
% 3. 训练网络
net = train(net,p,t);
%%
% 4. 仿真测试
t_sim =sim(net,p);
%%
% 5. 数据反归一化
T_sim = mapminmax('reverse',t_sim,ps_output);
%% IV.拟合评价
r2_bp = 1 - (sum((T_sim'- t_train').^2) ./ sum(( t_train' - mean(t_train')).^2))%% V.绘值训练对比图
figure;
subplot(1,2,1)
plot(x,y);
xlabel('X');
ylabel('Y');
title('y=cos(x)');
subplot(1,2,2)
plot(1:length(T_sim),T_sim,'r-o',1:length(T_sim),t_train,'k-');
legend('BP神经网络预测值','实际值');
xlabel('X');
ylabel('Y');
string = {'BP神经网络R1训练集预测结果对比';['R^2=' num2str(r2_bp)]};
title(string);
总结
本文主要目的是针对自己在学习和做项目过程中应用BP神经网络的经验做一些总结。内容主要包括基于MATLAB的BP神经网络设计步骤以及相关优化方面的介绍,还有过程中自己的杂七杂八的想法,如果大家有想法或者疑问欢迎私聊或者评论!!!
同时,如果在模型搭建、模型优化方面有相关需求 可以闲鱼搜索用户:Man小洁,欢迎交流。
MATLAB BP神经网络的设计与优化相关推荐
- Matlab BP神经网络拟合四足机器人足端轨迹线积分方程反函数用于足端轨迹规划
Matlab BP神经网络拟合四足机器人足端轨迹线积分方程用于足端轨迹规划 问题描述 一般情况下,在对四足机器人足端轨迹进行规划时分别对足端路径和轨迹加速度进行规划,然后将规划好的加速度进行两次积分得 ...
- 【电力负荷预测】基于matlab BP神经网络电力负荷预测【含Matlab源码 278期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [电力负荷预测]基于matlab BP神经网络电力负荷预测[含Matlab源码 278期] 获取代码方式2: 付费专栏Matlab智能算 ...
- 【故障诊断分析】基于matlab BP神经网络三相逆变器故障诊断研究【含Matlab源码 1736期】
一.BP神经网络三相逆变器故障诊断简介 针对三相桥式逆变电路为研究对象,建立了仿真模型,并对逆变器主电路开关器件的开路故障进行仿 真,提出了基于BP神经网络的故障诊断方法,确定了网络的结构和参数,并以 ...
- 巴特列特窗的matlab代码,基于MATLAB的FIR数字滤波器设计与优化分析.doc
您所在位置:网站首页 > 海量文档  > 计算机 > matlab 基于MATLAB的FIR数字滤波器设计与优化分析. ...
- 【停车位预测】基于matlab BP神经网络停车位预测【含Matlab源码 765期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[停车位预测]基于matlab BP神经网络停车位预测[含Matlab源码 765期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方 ...
- (三)【数学建模】Matlab BP神经网络
[数学建模] 文章目录 Matlab BP神经网络 Matlab BP神经网络 归一化算法: (0,1): y=(x−min)/(max−min)y=(x-min)/(max-min)y=(x−min ...
- 基于MATLAB BP神经网络的水果识别
一.课题实现的功能 1 原理分析 由于数字图像是唯一的特征标识符号,在经营管理中具有不可替代的作用,因此数字图像识别系统应具有很高的识别正确率,对环境光照条件.拍摄位置等因素的影响应有较大的容阈,并且 ...
- 模式识别八--三层BP神经网络的设计与实现
文章转自:http://www.kancloud.cn/digest/prandmethod/102850 本文的目的是学习和掌握BP神经网络的原理及其学习算法.在MATLAB平台上编程构造一个3-3 ...
- 模式识别:三层BP神经网络的设计与实现
本文的目的是学习和掌握BP神经网络的原理及其学习算法.在MATLAB平台上编程构造一个3-3-1型的singmoid人工神经网络,并使用随机反向传播算法和成批反向传播算法来训练这个网络,这里设置不同的 ...
- BP神经网络简单应用实例,bp神经网络的设计方法
需要把MATLAB中的BP神经网络工具箱与自己的一个软件项目结合 这个就是C++与matlab混合编程.但是神经网络工具箱比较特别,它反盗用比较严厉.采用传统的混编方式,可以调用matlab自己的函数 ...
最新文章
- linux node 文件存放目录_Linux文件与目录结构
- Vue+Openlayers实现地图缩放图标等比例缩放
- 关于如何参与到开源项目中《How To Succeed In Open Source ( In Ways You Haven't Considered Yet )》...
- 设计模式C++实现(5)——桥接模式
- Ubuntu20.04配置Java环境
- D3.js系列——布局:饼状图和力导向图
- 手写一个简化版Tomcat
- h5下划线怎么设置_【Word技巧】毕业论文封面那条永远对不齐的下划线?
- Waydev 客户的GitHub 和 GitLab OAuth 令牌被盗,源代码遭访问
- gitee添加成员_成员权限管理,到底能有多精细?
- ArcGIS 10 SDE for ORACLE ---迁移 (1)
- 虚拟机服务器坏处,服务器虚拟化技术的优缺点
- 长期主义:永远做你余生中最重要的事!
- 产品经理的自我修养—认知模式
- 微信分享代码申请key教程
- 网络流24题 餐巾计划(费用流)
- Python使用forward,left,right等画多颜色图形
- 亲历的商务谈判过程(续)——谈谈国企和我的经历
- FileProvider
- android 脚本模拟点击屏幕