目录
一、先跑一个简单的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