当前位置:   article > 正文

MATLAB_第二篇神经网络学习_BP神经网络_matlab中多层bp神经网络结构

matlab中多层bp神经网络结构

非常感谢博主wishes61的分享。这篇博客只是为了记录下第一个神经网络的训练。

1. BP神经网络的简介和结构参数

  • 一种按照误差逆向传播算法训练的多层前馈神经网络用于预测BP神经网络的计算过程:由正向计算过程和反向计算过程组成。
  • 正向传播过程,输入模式从输入层经隐单元层逐层处理,并转向输出层,每一层神经元的状态只影响下一层神经元的状态。
  • 如果在输出层不能得到期望的输出,则转入反向传播,将误差信号沿原来的连接通路返回,通过修改各神经元的权值,使得误差信号最小值。

1.1 BP神经网络的结构组成

在这里插入图片描述
下图是训练神经网络时经常出现的一个界面,从这部分我们可以看到,这是一个2输入1输出,5个隐含层的BP网络,称为2-5-1网络结构

1.2 神经元结构示意图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

1.3 BP神经网络训练界面的参数解读

需要注意的是:

  • 泛化性: 表示BP神经网络在训练过程中,如果均方误差(MSE)连续6次不降反升,则网络停止训练
  • 误差精度: 关于mu参数含义的一种理解是,mu是误差精度参数,用于给神经网络的权重再加一个调制,这样可以避免在BP网络训练的过程中陷入局部最小值,mu的范围为0到1。
    在这里插入图片描述

2. BP网络训练的步骤

  • 读取数据
  • 设置训练数据和预测数据
  • 训练样本数据归一化
  • 构建BP神经网络 网络参数配置(训练次数,学习速率,训练目标最小误差.等)
  • BP神经网络训练
  • 测试样本归一化
  • BP神经网络预测
  • 预测结果反归一化与误差计算
  • 验证集的真实值与预测值误差比较

3. IRIS数据集

  • iris是鸢尾花数据集,是一类多重变量分析的数据集。
  • 数据集包含150个数据样本,分为3类,酶类50个数据,每个数据包含4个属性。
  • 可通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类。
    数据下载链接:http://archive.ics.uci.edu/ml/index.php

4. MATLAB代码编写

% 清空环境变量
clc
clear all
% 1.导入数据
iris=load('iris.csv');
% 统计描述量
feature=iris(:,1:4);
mean=mean(feature); % 描述算法平均值
median=median(feature);% 描述元素的中位数
std=std(feature);%描述元素的标准差

% 2. 设置训练数据和预测数据
 %doc dividevec[分频器]:divid problem vectors into training,validation and test通过分频器得到的结果为三个struct。其中trainSamples中有90个样本(以列的形式呈现),此外trainSamples.P表示数据的特征;trainSamples.L表示90个样本对应的标签;trainSamples.indices表示90个样本在源数据中对应的位置。
normInput=iris(:,1:4)';
normTarget=iris(:,5)';
testPercent=0.20; %测试数据
validatePercent=0.20;%验证数据
[trainSamples,validateSamples,testSamples]=dividevec(normInput,normTarget,validatePercent,testPercent);

% 3. 训练样本数据归一化
[inputn,inputps]=mapminmax(trainSamples.P); % 归一化到[-1,1]之间,inputps用来作下一次同样的归一化
[outputn,outputps]=mapminmax(trainSamples.T);

% 4. 构建神经网络
% 节点个数
inputnum=2;
hiddenum=5;
% 隐含层节点数量经验公式p=sqrt(m+n)+a,故分别取2~13进行试验
outputnum=1;
% 构建BP神经网络
net=newff(inputn,outputn,hiddenum,{'tansig','purelin'},'trainlm');% 建立模型,传递函数使用purelin,采用梯度下降法训练
w1=net.iw{1,1} ;%输入层到中间层的权值
B1=net.b{1} ;% 中间各层神经元阈值
w2=net.lw{2,1} ;%中间层到输出层的权值
B2=net.b{2}; %输出层各神经元阈值

% 5. 网络参数配置(训练次数,学习速率,训练目标最小误差等)
net.trainParam.epochs=1000; % 训练次数,这里设置为1000次
net.trainParam.lr=0.01;% 学习速率,这里设置为0.01
net.trainParam.goal=0.00001; %训练目标最小误差,这里设置为0.00001

% 6. BP神经网络训练
net=train(net,inputn,outputn);% 开始训练,其中inputn,outputn分别是输入输出样本

% 7. 验证样本归一化
inputn_validation=mapminmax('apply',validateSamples.P,inputps);%对验证样本进行归一化

% 8. BP神经网络预测
an=sim(net,inputn_validation);% 用训练好的模型进行仿真

% 9. 预测结果反归一化与误差计算
validation_simu=mapminmax('reverse',an,outputps);% 把仿真结果得到的数据还原为原始的数量集
error=validation_simu-validateSamples.T;%预测值与真实值的误差

% 10. 真实值与预测值误差的比较
figure(1)
plot(validateSamples.T,'bo-')
hold on
plot(validation_simu,'r*-')
hold on
plot(error,'square','MarkerFaceColor','b')
legend('期望值','预测值','误差')
xlabel('数据组数')
ylabel('值')
[c,l]=size(validateSamples.T);
MAE1=sum(abs(error./validateSamples.T))/l;
MSE1=error*error'/l;
RMSE1=MSE1^(1/2);
disp(['-----------------------误差计算--------------------------'])
disp(['隐含层节点数为',num2str(hiddenum),'时的误差结果如下:'])
disp(['平均绝对误差MAE为:',num2str(MAE1)])
disp(['均方误差MSE为:       ',num2str(MSE1)])
disp(['均方根误差RMSE为:  ',num2str(RMSE1)])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73

4. 运行结果

4.1预测值,真实值,误差的分析图像

在这里插入图片描述

4.2 预测值和真实值的误差计算(MAE,MSE,MRSE)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/105663
推荐阅读
相关标签
  

闽ICP备14008679号