怎么上手BP神经网络

目录

一、先跑一个简单的BP神经网络DEMO

01. BP神经网络DEMO代码

02. BP神经网络代码解说

二、了解BP神经网络相关的理论知识

01.BP神经网络的结构

02.BP神经网络的归一化

03.BP神经网络的训练

04.BP神经网络的过拟合


一、先跑一个简单的BP神经网络DEMO

千里之行始于足下,空谈误国,实干兴邦,

直接先跑一个BP神经网络的例子

01. BP神经网络DEMO代码

在matlab中的实现代码如下

x1 = [-3,-2.7,-2.4,-2.1,-1.8,-1.5,-1.2,-0.9,-0.6,-0.3,0,0.3,0.6,0.9,1.2,1.5,1.8];   % x1:x1 = -3:0.3:2;
x2 = [-2,-1.8,-1.6,-1.4,-1.2,-1,-0.8,-0.6,-0.4,-0.2,-2.2204,0.2,0.4,0.6,0.8,1,1.2]; % x2:x2 = -2:0.2:1.2;
y  = [0.6589,0.2206,-0.1635,-0.4712,-0.6858,-0.7975,-0.8040,...
          -0.7113,-0.5326,-0.2875 ,0,0.3035,0.5966,0.8553,1.0600,1.1975,1.2618];    % y: y = sin(x1)+0.2*x2.*x2;

inputData  = [x1;x2];      % 将x1,x2作为输入数据
outputData = y;            % 将y作为输出数据
setdemorandstream(88888);%指定随机种子,这样每次训练出来的网络都一样。

%使用用输入输出数据(inputData、outputData)建立网络,
%隐节点个数设为3.其中隐层、输出层的传递函数分别为tansig和purelin,使用trainlm方法训练。

net = newff(inputData,outputData,3,{'tansig','purelin'},'trainlm');

%设置一些常用参数
net.trainparam.goal = 0.0001;               % 训练目标:均方误差低于0.0001
net.trainparam.show = 400;                  % 每训练400次展示一次结果
net.trainparam.epochs = 15000;              % 最大训练次数:15000.
[net,tr] = train(net,inputData,outputData); % 调用matlab神经网络工具箱自带的train函数训练网络

simout = sim(net,inputData);                % 调用matlab神经网络工具箱自带的sim函数得到网络的预测值
figure;                                     % 新建画图窗口窗口
t=1:length(simout);
plot(t,y,t,simout,'r')                      % 画图,对比原来的y和网络预测的y

运行后代码后展示了两个窗口,如下

这一个是matlab训练BP神经网络过程的窗口

这个是运行结果,蓝色代表原始的数据,红色代表用BP神经网络拟合的结果

02. BP神经网络代码解说

1.数据部分

下面的代码是生成数据的部分,在实际使用BP神经网络时需要替换成自己的数据

它共有两个输入一个输出。

x1 = [-3,-2.7,-2.4,-2.1,-1.8,-1.5,-1.2,-0.9,-0.6,-0.3,0,0.3,0.6,0.9,1.2,1.5,1.8];   % x1:x1 = -3:0.3:2;
x2 = [-2,-1.8,-1.6,-1.4,-1.2,-1,-0.8,-0.6,-0.4,-0.2,-2.2204,0.2,0.4,0.6,0.8,1,1.2]; % x2:x2 = -2:0.2:1.2;
y  = [0.6589,0.2206,-0.1635,-0.4712,-0.6858,-0.7975,-0.8040,...
          -0.7113,-0.5326,-0.2875 ,0,0.3035,0.5966,0.8553,1.0600,1.1975,1.2618];    % y: y = sin(x1)+0.2*x2.*x2;

inputData  = [x1;x2];      % 将x1,x2作为输入数据
outputData = y;            % 将y作为输出数据
setdemorandstream(88888);%指定随机种子,这样每次训练出来的网络都一样。

2.BP神经网络构建部分

下面的代码是为了构建一个神经网络,它代表只有一个隐层,隐层节点数为3,其中隐层和输出层的激活函数分别为tansig,和purelin,然后使用trainlm算法训练BP神经网络

net = newff(inputData,outputData,3,{'tansig','purelin'},'trainlm');

%设置一些常用参数
net.trainparam.goal = 0.0001;               % 训练目标:均方误差低于0.0001
net.trainparam.show = 400;                  % 每训练400次展示一次结果
net.trainparam.epochs = 15000;              % 最大训练次数:15000.

这里不得不说,虽然 很多书籍都说BP神经网络用梯度下降法进行训练,但这只是为了方便学习,在实际使用时,应该是使用trainlm,也就是L-M列文伯格-马跨特法进行训练,它的训练速度比梯度下降要快上很多

3.BP神经网络的训练

下面的语句是对上面构建好的网络进行训练

[net,tr] = train(net,inputData,outputData); % 调用matlab神经网络工具箱自带的train函数训练网络

运行这句时就会开始训练,并展示图1中的训练窗口,

4.BP神经网络的预测

下面的代码用于BP神经网络的预测与评估

simout = sim(net,inputData);                % 调用matlab神经网络工具箱自带的sim函数得到网络的预测值
figure;                                     % 新建画图窗口窗口
t=1:length(simout);
plot(t,y,t,simout,'r')                      % 画图,对比原来的y和网络预测的y

sim就是调用net来预测inputData,  这里的inputData是实际中需要用网络进行预测的数据

simout就是BP神经网络的预测结果

由于这个例子只有一个输出,所以我们可以画出拟合的结果来查看网络的预测效果,见上面运行结果中的图片。

好了,这就是一个BP神经网络的例子,仔细用自己的数据多跑几次,并调一下不同的参数,就能开始上手了。

二、了解BP神经网络相关的理论知识

BP神经网络比较关键的知识点有下面这些:

BP神经网络的结构。

BP神经网络的归一化。

BP神经网络的训练。

BP神经网络的过拟合。

01.BP神经网络的结构

BP神经网络的结构如下:

 

但实际中最常用的是三层的BP神经网络,它的结构如下:

它包括了输入层,隐层和输出层,其中层与层之间由权重连接,每个神经元都有各自的阈值,每一层都把上一层的输出作为输入,加权后再加上阈值,然后经后激活函数,就是它传给下一层的值。

02.BP神经网络的归一化

BP神经网络的归一化是指对输入输出数据进行归一化,为什么要归一化呢,因为归一化后的数据训练出来的效果更加好,为什么好呢?可以参考《老饼讲解-BP神经网络》中的分析,反正就是归一化后效果会更加好。

数据的归一化一般归一化到-1,1之间,这与tansig传递函数输出范围是保持一致的

归一化的公式如下:

03.BP神经网络的训练

BP神经网络的训练就是训练权重和阈值,实际就是对网络误差函数进行求解,求得一组权重阈值和BP神经网络的误差最小化,但是,一般数学方法是求不到的,基本是使用算法进行迭代求解,方法有很多,如下:

梯度下降法(traingd)                 
有动量的梯度下降法(traingdm)        
自适应lr梯度下降法(traingda)         
自适应lr动量梯度下降法(traingdx)    
弹性梯度下降法(trainrp)             
Fletcher-Reeves共轭梯度法(traincgf)  
Ploak-Ribiere共轭梯度法(traincgp)   
Powell-Beale共轭梯度法(traincgb)    
量化共轭梯度法(trainscg)            
拟牛顿算法(trainbfg)                
一步正割算法(trainoss)              
Levenberg-Marquardt法(trainlm) 

比较推荐的是梯度下降法和Levenberg-Marquardt法,梯度下降法在学习时使用,用于了解BP神经网络训练的原理,Levenberg-Marquardt法建议在实际中使用,它的效果比梯度下降法好很多,梯度下降法在它面前就是个玩具。

但学习不推荐去研究Levenberg-Marquardt法,实在太难了。泪~

在看老饼的文章的时候,满满一页的推导,直接放弃了,但大概思想是了解的,就是利用了高斯牛顿法和梯度下降法进行双结合,所以利用了二阶信息又利用了一阶信息,就比梯度下降法单纯用一阶信息要有效得多。

04.BP神经网络的过拟合

过拟合就是指为了精准拟合数据点,而导致数据扭扭曲曲。如下图所示,过拟合时,曲线虽然更加贴合训练数据点,但整体曲线却非常不正常,在预测时就会不准确。

matlab工具箱为了预防过拟合,在训练时预留了部分数据作为验证数据,以防止BP神经网络过拟合。下面就是Validation Checks的步数,它代表已经有多少步验证失败。连续6步验证失败就会退出训练。

结束语

学完这些基本就已经上手了,简单方便

说明:上面部分代码和图片来自《老饼讲解-BP神经网络》:www.bbbdata.com

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值