线性分类器与非线性分类器(四):BP神经网络的原理与实现

技术凯 2020-12-24 23:03:55 6721
一、BP神经网络简介

  在上篇文章中,我们介绍了神经网络算法的由来,以及神经网络单元——神经元的Matlab实现。前面也提到过,大脑的学习行为其实就是大脑感知到的信号与大脑记忆之间的差异使得神经元结构发生改变的过程。BP神经网络的原理便是如此。首先,BP神经网络由多个神经元组成,如图所示:

同单个神经元一样,每个神经元都有输入和输出,每个神经元的每个输入都有对应的权值w,数据传入神经元的时候还会有偏置b。单个神经元只能处理输入和输出关系为线性的分类任务,但是多个神经元组成的神经网络就可以处理非线性输入输出关系的任务了。神经网络从输入到输出的过程我们称为正向传播。在神经网络的到输出以后,会和我们已知的学习样本进行对比,输出与样本的误差会依次传回给每层神经元,这个过程我们称为反向传播。这就是BP神经网络——反向传播算法(Back Propagation algorithm)。BP神经网络在反向传播的过程中,会修正每一层的参数,最终形成能够正确分类的神经网络。BP神经网络一般分为输入层、隐藏层和输出层,我们通过修改隐藏层的数量以及每一层神经网络的数量来改变网络的复杂性。一般来说,网络的复杂性应该和学习样本数据的数量相匹配,若样本数据量较大,我们可以适当增加网络复杂性,增强网络的性能,若样本数据较少,我们则不能让网络过于复杂,否则会出翔过拟合的现象。

二、BP神经网络的具体实现

1、二分类任务
  数据集和单层神经元分类任务所用的数据集一样,通过matlab的bp神经网络工具箱生成一个无隐含层的单层神经网络(因为实验用的二分类数据经之前的测试发现能够线性可分),该神经网络只有一个神经元,该神经元有190个输入(对应数据维数),激活函数为sigmoid函数,若输出值大于0.5,则归为正类;若输出层小于0.5,则归为负类。
相关代码:
(1)导入数据并制作训练数据所用的标签(第一类数据归为负类,第二类数据归为正类)

clear
load('2-Class Problem.mat')
tic
% 制作训练数据标签
n1=size(Training_class1,2);
n2=size(Training_class2,2);
Label_Training1=-ones(1,n1);
Label_Training2=ones(1,n2);
Label_Training=[Label_Training1,Label_Training2];
% 合并训练数据
Training=[Training_class1,Training_class2];

(2)归一化数据并建立神经网络,最大迭代次数设为1000

% 归一化数据
[Training,ps]=mapminmax(Training);
Testing=mapminmax('apply',Testing,ps);
% 建立单层bp神经网络
% 190个输入,1个输出
net=newff(Training,Label_Training,[],{'logsig'},'traingda');
net.trainParam.epochs=1000;

(3)训练并预测

% 训练
net=train(net,Training,Label_Training);
% 预测
test_num=size(Testing,2);
predict=sim(net,Testing);
predict(predict>=0.5)=2;
predict(predict<0.5)=1;
acc=sum(predict==Label_Testing)/test_num;
fprintf('正确率是:%.2f%%\n',acc*100);
toc

完整代码如下:

clear
load('2-Class Problem.mat')
tic
% 制作训练数据标签
n1=size(Training_class1,2);
n2=size(Training_class2,2);
Label_Training1=-ones(1,n1);
Label_Training2=ones(1,n2);
Label_Training=[Label_Training1,Label_Training2];
% 合并训练数据
Training=[Training_class1,Training_class2];
% 归一化数据
[Training,ps]=mapminmax(Training);
Testing=mapminmax('apply',Testing,ps);
% 建立单层bp神经网络
% 190个输入,1个输出
net=newff(Training,Label_Training,[],{'logsig'},'traingda');
net.trainParam.epochs=1000;
% 训练
net=train(net,Training,Label_Training);
% 预测
test_num=size(Testing,2);
predict=sim(net,Testing);
predict(predict>=0.5)=2;
predict(predict<0.5)=1;
acc=sum(predict==Label_Testing)/test_num;
fprintf('正确率是:%.2f%%\n',acc*100);
toc

运行效果分析:


  可以看到,程序迭代到277次就达到了Validation Checks的触发条件,程序运行结束,正确率达到100%,只用了0.82s。
2、多分类任务
数据集结构如下:

可以看出,样本一共有17类,数据维度为190.
使用工具箱建立二层bp网络(一个隐含层、一个输出层)。隐含层有190个输入(对应数据维数),输出层为17个神经元(对应多分类类别数)。进行多分类时,需要将标签处理成one-hot形式,输出层激活函数采用softmax,这样17个神经元的输出值对应样本分到相应17个类别的概率,输出最大概率的神经元对应分类结果。经测试,隐含层采用30个神经元,激活函数(隐含层)使用‘tansig’时分类效果最佳。
代码如下:
(1)导入数据并制作one-hot格式的训练数据标签

clear
load('Mult-class Problem.mat')
tic
% 制作one-hot格式的训练数据标签
train_num=size(Label_training,2);
temp=eye(max(Label_training),train_num);
label_one_hot=temp(:,Label_training);

(2)归一化数据并建立神经网络

% 归一化数据
[Training_data,ps]=mapminmax(Training_data);
Testing_data=mapminmax('apply',Testing_data,ps);
% 建立bp神经网络
net=newff(Training_data,label_one_hot,[30],{'tansig','softmax'},'traingda');
net.trainParam.epochs=2000;
net.trainParam.max_fail=200;

(3)训练并预测

% 训练
net=train(net,Training_data,label_one_hot);
% 预测
test_num=size(Testing_data,2);
predict=sim(net,Testing_data);
[~,argmax]=max(predict);
predict=argmax;
acc=sum(predict==Label_testing)/test_num;
fprintf('正确率是:%.2f%%\n',acc*100);
toc

完整代码如下:

clear
load('Mult-class Problem.mat')
tic
% 制作one-hot格式的训练数据标签
train_num=size(Label_training,2);
temp=eye(max(Label_training),train_num);
label_one_hot=temp(:,Label_training);
% 保存文件
save('Mult-class Problem.mat');
% 归一化数据
[Training_data,ps]=mapminmax(Training_data);
Testing_data=mapminmax('apply',Testing_data,ps);
% 建立bp神经网络
net=newff(Training_data,label_one_hot,[30],{'tansig','softmax'},'traingda');
net.trainParam.epochs=2000;
net.trainParam.max_fail=200;
% 训练
net=train(net,Training_data,label_one_hot);
% 预测
test_num=size(Testing_data,2);
predict=sim(net,Testing_data);
[~,argmax]=max(predict);
predict=argmax;
acc=sum(predict==Label_testing)/test_num;
fprintf('正确率是:%.2f%%\n',acc*100);
toc

程序结果分析:


可以看到,程序在迭代到427次时停止训练,最终达到了61%的正确率,多分类也只用了13s的时间。

三、总结

  本篇文章介绍了BP神经网络的基本原理以及Matlab的实现,包括二分类和多分类的实现,可以看出,使用BP神经网络无论二分类还是多分类均可以达到不错的效果。

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 75 7 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
技术凯
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区