目录
摘要
BP神经网络参数设置及各种函数选择
参数设置
训练函数
传递函数
学习函数
性能函数
显示函数
前向网络创建函数
BP神经网络训练窗口详解
训练窗口例样
训练窗口四部详解
基于B P神经网络的火灾识别
数据集
MATLAB编程BP神经网络代码,并附有GUI窗口
效果图
摘要
本文总结BP神经网络的参数设置,训练函数,传递函数,学习函数,画图函数,性能函数,创建函数,详解nntraintool训练窗口,以基于BP神经网络的火灾识别为例子,实现BP神经网络的编程
BP神经网络参数设置及各种函数选择
参数设置
1,最大迭代次数net.trainParam.epochs,一般先设置大,然后看训练收敛情况,如果提前收敛,最大迭代次数就改小,以到达训练目标为目的设置。
2,学习率net.trainParam.lr,一般设置0.01–0.5,数据越多,数据噪声越大,数据越难拟合,数值一般需要越小,设置太大,容易过早停止收敛。
3,学习目标net.trainParam.goal,根据训练测试的情况进行调整,过大容易过拟合,测试效果差,过小达不到想要的效果。
4,最大丢失次数net.trainParam.max_fail,既联系不收敛次数,达到这个次数后BP神经网络停止迭代,终止训练,主要目的是防止过拟合,太小容易过早停止迭代,太大容易过拟合,默认是6,需要依据训练测试情况和学习目标,妥协调整。
5,隐含层数,常见的是三个隐含层以内,再多也没有看到有明显的优势,数据好拟合,一个隐含层就足够,数据难拟合,更多层,收敛效果一般也没有明显改善。
6,隐含层神经元个数,按经验公式设置,试凑法调整。
训练函数
trainr 随机顺序递增更新训练函数
trainrp 带反弹的BP训练函数
trains 顺序递增BP训练函数
trainscg 量化连接梯度BP训练函数
trainbrBayes 规范化BP训练函数
trainc 循环顺序渐增训练函数
traincgb Powell-Beale连接梯度BP训练函数
traincgf Fletcher-Powell连接梯度BP训练函数
traincgp Polak-Ribiere连接梯度BP训练函数
traingda 自适应lrBP的梯度递减训练函数
traingdx 动量及自适应lrBP的梯度递减训练函数
trainlm Levenberg-Marquardt BP训练函数
trainoss 一步正切BP训练函数
传递函数:
logsig S型的对数函数
dlogsig logsig的导函数,有些MATALB版本不可用
tansig S型的正切函数
dtansig tansig的导函数,有些MATALB版本不可用
purelin 纯线性函数
dpurelin purelin的导函数,有些MATALB版本不可用
学习函数
learngdm 梯度下降栋梁学习函数
learngd 基于梯度下降法的学习函数
性能函数
mse 均方误差函数
msereg 均方误差规范化函数
显示函数
plotperf 绘制网络的性能
plotes 绘制一个单独神经元的误差曲面
plotep 绘制权值和阈值在误差曲面的位置
errsurf 计算单个神经元的误差曲面
前向网络创建函数
newffd 创建存在输入延迟的前向网络
newcf 创建级联前向网络
newff 创建前向BP网络
BP神经网络训练窗口详解
训练窗口例样
训练窗口详解
如根上图所示分为四个部分:
1,Neural Network
这里显示的是输入层神经元个数大小,中间层数量以及每层的神经元个数。
2,Algorithms
Data Division:Random。这表示使用随机指数将目标分成三组,分别作为train,validation,test。
Training:levenberg-Marquardt。这表示学习训练函数为trainlm。
Performance:Mean Squared Error。这表示性能用均方误差来表示。
Calculations: MEX。该网络保存为mex格式
3,Progress
Epoch:该网络允许的迭代次数最大为500,实际迭代31次
Time:运行时间。
Performance:该网络的最大误差为1.96,目标误差为0.0001,实际误差为0.00475,可在Plots中的Performance中详细查看
Gradient:该网络的最大梯度为1.83,阈值梯度为1e−7 1e^{-7}1e −7。
Validation Checks:最大验证失败次数。(解释:比如默认是6,则系统判断这个验证集误差是否在连续6次检验后不下降,如果不下降或者甚至上升,说明training set训练的误差已经不再减小,没有更好的效果了,这时再训练就没必要了,就停止训练,不然可能陷入过拟合。)
4,Plots
Performance:这里可以点进去,看train, validation和test的性能。
Training State:记录Gradient和Validation Checks。
Regression:通过绘制回归线来测量神经网络对应数据的拟合程度。
Plot Interval:训练窗口更新次数,等于10的时候,每迭代10次更新一次
基于B P神经网络的火灾识别
数据集
MATLAB编程BP神经网络代码,并附有GUI窗口
部位代码,如需要完整的,可以留言
clear all
% close allk
clc
global h_axes1;
% global h_axes2;
global edit2;
h_f=figure(‘name’,‘图像识别系统’,‘position’,[300,100,800,700]);
clf reset;
set(h_f, ‘defaultuicontrolfontsize’ ,12);
set(h_f, ‘defaultuicontrolfontname’ , ‘宋体’ );
h_axes1=axes(‘parent’,h_f,‘position’,[0.1 0.18 0.7 0.66],‘Unit’,‘normalized’,‘visible’,‘off’);
% h_axes2=axes(‘parent’,h_f,‘position’,[0.55 0.28 0.25 0.56],‘Unit’,‘normalized’,‘visible’,‘off’);
figcolor=get(h_f,‘color’);
edit2=uicontrol(h_f,‘style’,‘text’,‘position’,[1,620,200,40],‘backgroundcolor’,figcolor);
button_recg=uicontrol(h_f,‘style’,‘push’,‘string’,‘训练和测试’,‘position’,[20 50 150 50],‘callback’,‘train’);
button_open=uicontrol(h_f,‘style’,‘push’,‘string’,‘选择照片’,‘position’,[200 50 150 50],‘callback’,‘GUIopen’);
button_match
clc,clear
global edit2;
nclass=2;%图像类别数目
num_train=50;%选取每类50副图像训练
set(edit2,‘string’,‘加载训练数据…’)
drawnow
%load(‘traindata.mat’);
[train_data, test_data,realclass,num_test] = ReadColorData(nclass,num_train);
%构造训练目标集t
for y=1:nclass;
for m=1:num_train;
%构造训练集目标集
t(y,(y-1)num_train+m)=1;
end
end
mA=mean(train_data);
k=20;%降维至20维
[pcaface,V]=fastPCA(train_data,k,mA);
lowvec=min(pcaface);
upvec=max(pcaface);
scaledface = scaling( pcaface,lowvec,upvec);
pn = scaledface’;
%对测试集数据进行归一化处理
testface=test_data;
m=size(testface,1);
for i=1:m
testface(i,:)=testface(i,:)-mA;
end
pcatestface=testfaceV;
scaledtestface = scaling( pcatestface,lowvec,upvec);
pnewn = scaledtestface’;
save(‘pca.mat’,‘upvec’, ‘lowvec’,‘mA’,‘V’);
set(edit2,‘string’,‘bp神经网络样本训练…’)
drawnow
net = createBP(pn,110,‘tansig’,‘purelin’,‘trainrp’,(1e-4),9000,0.005); %createBP
[net,tr] = trainBP(net,pn,t); %trainBP
save(‘net.mat’,‘net’,‘tr’);
set(edit2,‘string’,‘bp神经网络样本分类…’)
drawnow
accuracy= result(net,pnewn,pn,num_train,num_test);
set(edit2,‘string’,‘测试完成!’)
msgbox([‘识别准确率:’,num2str(accuracy*100),‘%。’])
%构建BP神经网络
%传入参数
%pn为归一化处理后的训练集 向量空间
%返回参数
%net 建立的BP神经网络
%函数声明
function[net] = createBP(pn,num_hidden,func_hidden,func_out,trainfunc,goal,epochs,learn_rate)
fprintf(‘开始构建BP神经网络\n\n’);
% %输入隐含层单元数,num_hidden储存该值的变量
% num_hidden = input(‘请输入隐含层神经元个数:(40:20:100)’);
%
% %输入输入层与隐含层之间的传递函数,func_hidden储存该字符串的变量
% func_hidden = input(‘请输入输入层与隐含层之间的传递函数:(tansig,purelin)’,‘s’);
%
% %输入隐含层与输出层之间的传递函数,func_out储存该字符串的变量
% func_out = input(‘请输入隐含层与输出层之间的传递函数:(tansig,purelin)’,‘s’);
%
% %输入BP训练函数,trainfunc储存该字符串的变量
% trainfunc = input(‘请输入BP网络训练函数:(trainrp)’,‘s’);
%
% %输入训练目标,goal储存该值的变量
% goal = input(‘请输入训练目标(<0.01)(1e-5):’);
%
% %输入训练次数,epochs储存该值的变量
% epochs = input(‘请输入训练次数:(8000)’);
%
% %输入学习速率,learn_rate储存该值的变量
% learn_rate = input(‘请输入学习速率(<0.1):(0.005)’);
fprintf(‘开始构建BP神经网络,请等待…\n\n’);
net = newff(minmax(pn),[num_hidden,2],{func_hidden,func_out},trainfunc); %调用MATLAB神经网络工具箱,构建BP神经网络
net.trainParam.goal=goal; %设置训练目标
net.trainParam.epochs=epochs; %训练迭代数
net.trainParam.lr = learn_rate; %设置学习速率
fprintf(‘BP神经网络搭建结束!\n\n’);