BP神经网络的设计实例MATLAB编程
基于遗传算法的BP神经网络MATLAB代码

基于遗传算法的BP神经网络MATLAB代码以下是基于遗传算法的BP神经网络的MATLAB代码,包括网络初始化、适应度计算、交叉运算、突变操作和迭代训练等。
1.网络初始化:```matlabfunction net = initialize_network(input_size, hidden_size, output_size)net.input_size = input_size;net.hidden_size = hidden_size;net.output_size = output_size;net.hidden_weights = rand(hidden_size, input_size);net.output_weights = rand(output_size, hidden_size);net.hidden_biases = rand(hidden_size, 1);net.output_biases = rand(output_size, 1);end```2.适应度计算:```matlabfunction fitness = calculate_fitness(net, data, labels)output = forward_propagation(net, data);fitness = sum(sum(abs(output - labels)));end```3.前向传播:```matlabfunction output = forward_propagation(net, data)hidden_input = net.hidden_weights * data + net.hidden_biases;hidden_output = sigmoid(hidden_input);output_input = net.output_weights * hidden_output +net.output_biases;output = sigmoid(output_input);endfunction result = sigmoid(x)result = 1 ./ (1 + exp(-x));end```4.交叉运算:```matlabfunction offspring = crossover(parent1, parent2)point = randi([1 numel(parent1)]);offspring = [parent1(1:point) parent2((point + 1):end)]; end```5.突变操作:```matlabfunction mutated = mutation(individual, mutation_rate) for i = 1:numel(individual)if rand < mutation_ratemutated(i) = rand;elsemutated(i) = individual(i);endendend```6.迭代训练:```matlabfunction [best_individual, best_fitness] =train_network(data, labels, population_size, generations, mutation_rate)input_size = size(data, 1);hidden_size = round((input_size + size(labels, 1)) / 2);output_size = size(labels, 1);population = cell(population_size, 1);for i = 1:population_sizepopulation{i} = initialize_network(input_size, hidden_size, output_size);endbest_individual = population{1};best_fitness = calculate_fitness(best_individual, data, labels);for i = 1:generationsfor j = 1:population_sizefitness = calculate_fitness(population{j}, data, labels);if fitness < best_fitnessbest_individual = population{j};best_fitness = fitness;endendselected = selection(population, data, labels);for j = 1:population_sizeparent1 = selected{randi([1 numel(selected)])};parent2 = selected{randi([1 numel(selected)])};offspring = crossover(parent1, parent2);mutated_offspring = mutation(offspring, mutation_rate);population{j} = mutated_offspring;endendendfunction selected = selection(population, data, labels) fitnesses = zeros(length(population), 1);for i = 1:length(population)fitnesses(i) = calculate_fitness(population{i}, data, labels);end[~, indices] = sort(fitnesses);selected = population(indices(1:floor(length(population) / 2)));end```这是一个基于遗传算法的简化版BP神经网络的MATLAB代码,使用该代码可以初始化神经网络并进行迭代训练,以获得最佳适应度的网络参数。
BP神经网络整定的PID算法-matlab源程序

BP神经网络整定的PID控制算法matlab源程序,系统为二阶闭环系统。
%BP based PID Controlclear all;close all;xite=0.28;alfa=0.001;IN=4;H=5;Out=3;%NN Structurewi=0.50*rands(H,IN);wi_1=wi;wi_2=wi;wi_3=wi;wo=0。
50*rands(Out,H);wo_1=wo;wo_2=wo;wo_3=wo;x=[0,0,0];u_1=0;u_2=0;u_3=0;u_4=0;u_5=0;y_1=0;y_2=0;y_3=0;Oh=zeros(H,1); %Output from NN middle layerI=Oh; %Input to NN middle layererror_2=0;error_1=0;ts=0.01;sys=tf(2。
6126,[1,3。
201,2.7225]);%建立被控对象传递函数dsys=c2d(sys,ts,’z’); %把传递函数离散化[num,den]=tfdata(dsys,'v’);%离散化后提取分子、分母for k=1:1:2000time(k)=k*ts;rin(k)=40;yout(k)=—den(2)*y_1-den(3)*y_2+num(2)*u_2+num(3)*u_3;error(k)=rin(k)-yout(k);xi=[rin(k),yout(k),error(k),1];x(1)=error(k)—error_1;x(2)=error(k);x(3)=error(k)-2*error_1+error_2;epid=[x(1);x(2);x(3)];I=xi*wi’;for j=1:1:HOh(j)=(exp(I(j))-exp(-I(j)))/(exp(I(j))+exp(-I(j)));%Middle Layer endK=wo*Oh; %Output Layerfor l=1:1:OutK(l)=exp(K(l))/(exp(K(l))+exp(-K(l)));%Getting kp,ki,kd endkp(k)=K(1);ki(k)=K(2);kd(k)=K(3);Kpid=[kp(k),ki(k),kd(k)];du(k)=Kpid*epid;u(k)=u_1+du(k);if u(k)〉=45 %Restricting the output of controlleru(k)=45;endif u(k)〈=-45u(k)=-45;enddyu(k)=sign((yout(k)—y_1)/(u(k)-u_1+0。
用matlab编BP神经网络预测程序

求用matlab编BP神经网络预测程序求一用matlab编的程序P=[。
];输入T=[。
];输出% 创建一个新的前向神经网络net_1=newff(minmax(P),[10,1],{'tansig','purelin'},'traingdm')% 当前输入层权值和阈值inputWeights=net_1.IW{1,1}inputbias=net_1.b{1}% 当前网络层权值和阈值layerWeights=net_1.LW{2,1}layerbias=net_1.b{2}% 设置训练参数net_1.trainParam.show = 50;net_1.trainParam.lr = 0.05;net_1.trainParam.mc = 0.9;net_1.trainParam.epochs = 10000;net_1.trainParam.goal = 1e-3;% 调用TRAINGDM 算法训练BP 网络[net_1,tr]=train(net_1,P,T);% 对BP 网络进行仿真A = sim(net_1,P);% 计算仿真误差E = T - A;MSE=mse(E)x=[。
]';%测试sim(net_1,x) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%不可能啊我200928对初学神经网络者的小提示第二步:掌握如下算法:2.最小均方误差,这个原理是下面提到的神经网络学习算法的理论核心,入门者要先看《高等数学》(高等教育出版社,同济大学版)第8章的第十节:“最小二乘法”。
3.在第2步的基础上看Hebb学习算法、SOM和K-近邻算法,上述算法都是在最小均方误差基础上的改进算法,参考书籍是《神经网络原理》(机械工业出版社,Simon Haykin著,中英文都有)、《人工神经网络与模拟进化计算》(清华大学出版社,阎平凡,张长水著)、《模式分类》(机械工业出版社,Richard O. Duda等著,中英文都有)、《神经网络设计》(机械工业出版社,Martin T. Hargan等著,中英文都有)。
BP神经网络预测的matlab代码

BP神经网络预测的matlab代码附录5:BP神经网络预测的matlab代码: P=[ 00.13860.21970.27730.32190.35840.38920.41590.43940.46050.47960.49700.52780.55450.59910.60890.61820.62710.63560.64380.65160.65920.66640.67350.72220.72750.73270.73780.74270.74750.75220.75680.76130.76570.7700]T=[0.4455 0.323 0.4116 0.3255 0.4486 0.2999 0.4926 0.2249 0.48930.2357 0.4866 0.22490.4819 0.2217 0.4997 0.2269 0.5027 0.217 0.5155 0.1918 0.5058 0.2395 0.4541 0.2408 0.4054 0.2701 0.3942 0.3316 0.2197 0.2963 0.5576 0.1061 0.4956 0.267 0.5126 0.2238 0.5314 0.2083 0.5191 0.208 0.5133 0.18480.5089 0.242 0.4812 0.2129 0.4927 0.287 0.4832 0.2742 0.5969 0.24030.5056 0.2173 0.5364 0.1994 0.5278 0.2015 0.5164 0.2239 0.4489 0.2404 0.4869 0.2963 0.4898 0.1987 0.5075 0.2917 0.4943 0.2902 ]threshold=[0 1]net=newff(threshold,[11,2],{'tansig','logsig'},'trainlm');net.trainParam.epochs=6000net.trainParam.goal=0.01LP.lr=0.1;net=train(net,P',T')P_test=[ 0.77420.77840.78240.78640.79020.7941 ] out=sim(net,P_test')友情提示:以上面0.7742为例0.7742=ln(47+1)/5因为网络输入有一个元素,对应的是测试时间,所以P只有一列,Pi=log(t+1)/10,这样做的目的是使得这些数据的范围处在[0 1]区间之内,但是事实上对于logsin命令而言输入参数是正负区间的任意值,而将输出值限定于0到1之间。
标准的BP神经网络算法程序MATLAB

count=1;
while (count<=maxcount) %结束条件1迭代1000次
c=1;
while (c<=samplenum)
for k=1:outputNums
d(k)=expectlist(c,k); %获得期望输出的向量,d(1:3)表示一个期望向量内 的值
end
break;
end
count=count+1;%训练次数加1
end%第一个while结束
error(maxcount+1)=error(maxcount);
p=1:count;
pp=p/50;
plot(pp,error(p),"-"); %显示误差
deltv(i,j)=alpha*yitay(j)*x(i); %同上deltw
v(i,j)=v(i,j)+deltv(i,j)+a*dv(i,j);
dv(i,j)=deltv(i,j);
end
end
c=c+1;
end%第二个while结束;表示一次BP训练结束
double tmp;
for i=1:inputNums
x(i)=samplelist(c,i); %获得输入的向量(数据),x(1:3)表一个训练向量
字串4
end
%Forward();
for j=1:hideNums
net=0.0;
for i=1:inputNums
net=net+x(i)*v(i,j);
dw=zeros(hideNums,outputNums); %10*3
PSO优化的BP神经网络(Matlab版)

PSO优化的BP神经⽹络(Matlab版)前⾔:最近接触到⼀些神经⽹络的东西,看到很多⼈使⽤PSO(粒⼦群优化算法)优化BP神经⽹络中的权值和偏置,经过⼀段时间的研究,写了⼀些代码,能够跑通,嫌弃速度慢的可以改⼀下训练次数或者适应度函数。
在我的理解⾥,PSO优化BP的初始权值w和偏置b,有点像数据迁徙,等于⽤粒⼦去尝试作为⽹络的参数,然后训练⽹络的阈值,所以总是会看到PSO优化了权值和阈值的说法,(⼀开始我是没有想通为什么能够优化阈值的),下⾯是我的代码实现过程,关于BP和PSO的原理就不⼀⼀赘述了,⽹上有很多⼤佬解释的很详细了……⾸先是利⽤BP作为适应度函数function [error] = BP_fit(gbest,input_num,hidden_num,output_num,net,inputn,outputn)%BP_fit 此函数为PSO的适应度函数% gbest:最优粒⼦% input_num:输⼊节点数⽬;% output_num:输出层节点数⽬;% hidden_num:隐含层节点数⽬;% net:⽹络;% inputn:⽹络训练输⼊数据;% outputn:⽹络训练输出数据;% error : ⽹络输出误差,即PSO适应度函数值w1 = gbest(1:input_num * hidden_num);B1 = gbest(input_num * hidden_num + 1:input_num * hidden_num + hidden_num);w2 = gbest(input_num * hidden_num + hidden_num + 1:input_num * hidden_num...+ hidden_num + hidden_num * output_num);B2 = gbest(input_num * hidden_num+ hidden_num + hidden_num * output_num + 1:...input_num * hidden_num + hidden_num + hidden_num * output_num + output_num);net.iw{1,1} = reshape(w1,hidden_num,input_num);net.lw{2,1} = reshape(w2,output_num,hidden_num);net.b{1} = reshape(B1,hidden_num,1);net.b{2} = B2';%建⽴BP⽹络net.trainParam.epochs = 200;net.trainParam.lr = 0.05;net.trainParam.goal = 0.000001;net.trainParam.show = 100;net.trainParam.showWindow = 0;net = train(net,inputn,outputn);ty = sim(net,inputn);error = sum(sum(abs((ty - outputn))));end 然后是PSO部分:%%基于多域PSO_RBF的6R机械臂逆运动学求解的研究clear;close;clc;%定义BP参数:% input_num:输⼊层节点数;% output_num:输出层节点数;% hidden_num:隐含层节点数;% inputn:⽹络输⼊;% outputn:⽹络输出;%定义PSO参数:% max_iters:算法最⼤迭代次数% w:粒⼦更新权值% c1,c2:为粒⼦群更新学习率% m:粒⼦长度,为BP中初始W、b的长度总和% n:粒⼦群规模% gbest:到达最优位置的粒⼦format longinput_num = 3;output_num = 3;hidden_num = 25;max_iters =10;m = 500; %种群规模n = input_num * hidden_num + hidden_num + hidden_num * output_num + output_num; %个体长度w = 0.1;c1 = 2;c2 = 2;%加载⽹络输⼊(空间任意点)和输出(对应关节⾓的值)load('pfile_i2.mat')load('pfile_o2.mat')% inputs_1 = angle_2';inputs_1 = inputs_2';outputs_1 = outputs_2';train_x = inputs_1(:,1:490);% train_y = outputs_1(4:5,1:490);train_y = outputs_1(1:3,1:490);test_x = inputs_1(:,491:500);test_y = outputs_1(1:3,491:500);% test_y = outputs_1(4:5,491:500);[inputn,inputps] = mapminmax(train_x);[outputn,outputps] = mapminmax(train_y);net = newff(inputn,outputn,25);%设置粒⼦的最⼩位置与最⼤位置% w1阈值设定for i = 1:input_num * hidden_numMinX(i) = -0.01*ones(1);MaxX(i) = 3.8*ones(1);end% B1阈值设定for i = input_num * hidden_num + 1:input_num * hidden_num + hidden_numMinX(i) = 1*ones(1);MaxX(i) = 8*ones(1);end% w2阈值设定for i = input_num * hidden_num + hidden_num + 1:input_num * hidden_num + hidden_num + hidden_num * output_numMinX(i) = -0.01*ones(1);MaxX(i) = 3.8*ones(1);end% B2阈值设定for i = input_num * hidden_num+ hidden_num + hidden_num * output_num + 1:input_num * hidden_num + hidden_num + hidden_num * output_num + output_num MinX(i) = 1*ones(1);MaxX(i) = 8*ones(1);end%%初始化位置参数%产⽣初始粒⼦位置pop = rands(m,n);%初始化速度和适应度函数值V = 0.15 * rands(m,n);BsJ = 0;%对初始粒⼦进⾏限制处理,将粒⼦筛选到⾃定义范围内for i = 1:mfor j = 1:input_num * hidden_numif pop(i,j) < MinX(j)pop(i,j) = MinX(j);endif pop(i,j) > MaxX(j)pop(i,j) = MaxX(j);endendfor j = input_num * hidden_num + 1:input_num * hidden_num + hidden_numif pop(i,j) < MinX(j)pop(i,j) = MinX(j);endif pop(i,j) > MaxX(j)pop(i,j) = MaxX(j);endendfor j = input_num * hidden_num + hidden_num + 1:input_num * hidden_num + hidden_num + hidden_num * output_numif pop(i,j) < MinX(j)pop(i,j) = MinX(j);endif pop(i,j) > MaxX(j)pop(i,j) = MaxX(j);endendfor j = input_num * hidden_num+ hidden_num + hidden_num * output_num + 1:input_num * hidden_num + hidden_num + hidden_num * output_num + output_num if pop(i,j) < MinX(j)pop(i,j) = MinX(j);endif pop(i,j) > MaxX(j)pop(i,j) = MaxX(j);endendend%评估初始粒⼦for s = 1:mindivi = pop(s,:);fitness = BP_fit(indivi,input_num,hidden_num,output_num,net,inputn,outputn);BsJ = fitness; %调⽤适应度函数,更新每个粒⼦当前位置Error(s,:) = BsJ; %储存每个粒⼦的位置,即BP的最终误差end[OderEr,IndexEr] = sort(Error);%将Error数组按升序排列Errorleast = OderEr(1); %记录全局最⼩值for i = 1:m %记录到达当前全局最优位置的粒⼦if Error(i) == Errorleastgbest = pop(i,:);break;endendibest = pop; %当前粒⼦群中最优的个体,因为是初始粒⼦,所以最优个体还是个体本⾝for kg = 1:max_iters %迭代次数for s = 1:m%个体有52%的可能性变异for j = 1:n %粒⼦长度for i = 1:m %种群规模,变异是针对某个粒⼦的某⼀个值的变异if rand(1)<0.04pop(i,j) = rands(1);endendend%r1,r2为粒⼦群算法参数r1 = rand(1);r2 = rand(1);%个体位置和速度更新V(s,:) = w * V(s,:) + c1 * r1 * (ibest(s,:)-pop(s,:)) + c2 * r2 * (gbest(1,:)-pop(s,:));pop(s,:) = pop(s,:) + 0.3 * V(s,:);%对更新的位置进⾏判断,超过设定的范围就处理下。
matlab神经网络

Matlab神经网络工具箱2010-7-21今天学的是BP神经网络,首先看的是一个关于非线性函数逼近的例子,最后得出一个心得:在使用newff函数生成一个新的网络时,神经元的层数和每一层的神经元数会对结果造成不小的影响,一般都采用[n,1]的建立方法,其中n为隐层的神经元数,1为输出层的神经元数。
然后是做了一个识别系统,算是一个较大的神经网络,具体的代码解释和分析如下:[alphabet,targets]=prprob;[R,Q]=size(alphabet);[S2,Q]=size(targets);S1=10;[R,Q]=size(alphabet);[S2,Q]=size(targets);P=alphabet;net=newff(minmax(P),[S1,S2],{'logsig','logsig'},'traingdx');net.LW{2,1}=net.LW{2,1}*0.01;net.b{2}=net.b{2}+0.01;其中的proprob是matlab自带的一个生成字母表布尔值的函数。
可以具体查看。
T=targets;net.performFcn='sse';net.trainParam.goal=0.1;net.trainParam.show=20;net.trainParam.epochs=5000;net.trainParam.mc=0.95;[net,tr]=train(net,P,T)接下来首先进行无噪声训练。
netn.trainParam.goal=0.6;netn.trainParam.epochs=300;T=[targets targets targets targets];for pass=1:10P=[alphabet,alphabet,(alphabet+randn(R,Q)*0.1),(alphabet+randn(R,Q)*0.2) ];[netn,tr]=train(net,P,T);end接下来是有噪声训练,采用随机数生成影响输入矩阵的方式。
神经网络作业

BP神经网络及MATLAB实现实验报告姓名:李英杰学号:123109302专业:机械电子工程2013年6月19日1. BP网络的MATLAB设计MatlabR2012 神经网络工具箱(Neural Network toolbox) 为用户提供了丰富的神经网络设计与分析函数,可是用它们来编程不容易掌握。
我们通过对神经网络工具箱的实践应用研究表明,使用神经网络工具箱中的NNTool对神经网络进行设计和仿真简便易行直观,不需要编程,且设计和仿真的结果证明完全能够满足一般工程设计人员的需要,能够取得事半功倍的效果。
下面我们以一个单隐含层的BP网络设计为例,介绍利用神经网络工具箱中的NNTool对BP网络的设计和分析。
利用NNTool设计一个BP 网络,该网络的输入层和输出层的神经元个数均为1。
训练样本定义如下:输入变量为p =[-1 1 3 1;-1 1 5 -3]目标变量为 t = [-1 2 4 3]打开Matlab 应用软件后,双击Neural Network toolbox 中的NNTool 图标,或在命令窗口键入nntool,即可进入神经络设计主界面,如下图。
图1 NNTool 设计主界面1.训练样本数据的导入点击New按钮,在弹出窗口选择Date选项卡,按如图2,3所示创建输入变量和目标变量。
图2 创建新的输入变量图3 创建新的目标变量2.神经网络的创建点击主界面中点击New按钮,在弹出窗口选择Newwork选项卡,并在对话框中可对网络的名称、类型、结构和训练函数等进行设置,如图4 所示。
图4创建神经元网络界面在上面窗口中对该网络命名为:tracylee;网络类型为:Feed-forward backprop,即前馈BP神经网络;Input ranges :点击Get From Input下拉框选择样本输入变量p加入输入向量;Training function:在下拉列表中选择TRAINGDM训练函数;采用动量梯度下降算法训练 BP 网络。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
神经网络的设计实例(MATLAB编程)例1 采用动量梯度下降算法训练BP 网络。
训练样本定义如下:输入矢量为p =[-1 -2 3 1-1 1 5 -3]目标矢量为t = [-1 -1 1 1]解:本例的MATLAB 程序如下:close allclearecho onclc% NEWFF——生成一个新的前向神经网络% TRAIN——对BP 神经网络进行训练% SIM——对BP 神经网络进行仿真pause% 敲任意键开始clc% 定义训练样本P=[-1, -2, 3, 1; -1, 1, 5, -3]; % P 为输入矢量T=[-1, -1, 1, 1]; % T 为目标矢量pause;clc% 创建一个新的前向神经网络net=newff(minmax(P),[3,1],{'tansig','purelin'},'traingdm') % 当前输入层权值和阈值inputWeights=net.IW{1,1}inputbias=net.b{1}% 当前网络层权值和阈值layerWeights=net.LW{2,1}layerbias=net.b{2}pauseclc% 设置训练参数net.trainParam.show = 50;net.trainParam.lr = 0.05;net.trainParam.mc = 0.9;net.trainParam.epochs = 1000;net.trainParam.goal = 1e-3;pauseclc% 调用TRAINGDM 算法训练BP 网络[net,tr]=train(net,P,T);pauseclc% 对BP 网络进行仿真A = sim(net,P)% 计算仿真误差E = T - AMSE=mse(E)pauseclcecho off例2 采用贝叶斯正则化算法提高BP 网络的推广能力。
在本例中,我们采用两种训练方法,即L-M 优化算法(trainlm)和贝叶斯正则化算法(trainbr),用以训练BP 网络,使其能够拟合某一附加有白噪声的正弦样本数据。
其中,样本数据可以采用如下MATLAB 语句生成:输入矢量:P = [-1:0.05:1];目标矢量:randn(seed,78341223);T = sin(2*pi*P)+0.1*randn(size(P));解:本例的MATLAB 程序如下:close allclearecho onclc% NEWFF——生成一个新的前向神经网络% TRAIN——对BP 神经网络进行训练% SIM——对BP 神经网络进行仿真pause% 敲任意键开始clc% 定义训练样本矢量% P 为输入矢量P = [-1:0.05:1];% T 为目标矢量randn('seed',78341223); T = sin(2*pi*P)+0.1*randn(size(P));% 绘制样本数据点plot(P,T,'+');echo offhold on;plot(P,sin(2*pi*P),':');% 绘制不含噪声的正弦曲线echo onclcpauseclc% 创建一个新的前向神经网络net=newff(minmax(P),[20,1],{'tansig','purelin'});pauseclcecho offclcdisp('1. L-M 优化算法TRAINLM'); disp('2. 贝叶斯正则化算法TRAINBR'); choice=input('请选择训练算法(1,2):');figure(gcf);if(choice==1)echo onclc% 采用L-M 优化算法TRAINLMnet.trainFcn='trainlm';pauseclc% 设置训练参数net.trainParam.epochs = 500;net.trainParam.goal = 1e-6;net=init(net);% 重新初始化pauseclcelseif(choice==2)echo onclc% 采用贝叶斯正则化算法TRAINBRnet.trainFcn='trainbr';pauseclc% 设置训练参数net.trainParam.epochs = 500;randn('seed',192736547);net = init(net);% 重新初始化pauseclcend% 调用相应算法训练BP 网络[net,tr]=train(net,P,T);pauseclc% 对BP 网络进行仿真A = sim(net,P);% 计算仿真误差E = T - A;MSE=mse(E)pauseclc% 绘制匹配结果曲线close all;plot(P,A,P,T,'+',P,sin(2*pi*P),':');pause;clcecho off通过采用两种不同的训练算法,我们可以得到如图1和图2所示的两种拟合结果。
图中的实线表示拟合曲线,虚线代表不含白噪声的正弦曲线,+点为含有白噪声的正弦样本数据点。
显然,经trainlm 函数训练后的神经网络对样本数据点实现了过度匹配,而经trainbr 函数训练的神经网络对噪声不敏感,具有较好的推广能力。
值得指出的是,在利用trainbr 函数训练BP 网络时,若训练结果收敛,通常会给出提示信息Maximum MU reached。
此外,用户还可以根据SSE 和SSW 的大小变化情况来判断训练是否收敛:当SSE 和SSW 的值在经过若干步迭代后处于恒值时,则通常说明网络训练收敛,此时可以停止训练。
观察trainbr 函数训练BP 网络的误差变化曲线,可见,当训练迭代至320 步时,网络训练收敛,此时SSE 和SSW 均为恒值,当前有效网络的参数(有效权值和阈值)个数为11.7973。
例3 采用提前停止方法提高BP 网络的推广能力。
对于和例2相同的问题,在本例中我们将采用训练函数traingdx 和提前停止相结合的方法来训练BP 网络,以提高BP 网络的推广能力。
解:在利用提前停止方法时,首先应分别定义训练样本、验证样本或测试样本,其中,验证样本是必不可少的。
在本例中,我们只定义并使用验证样本,即有验证样本输入矢量:val.P = [-0.975:.05:0.975]验证样本目标矢量:val.T = sin(2*pi*val.P)+0.1*randn(size(val.P))值得注意的是,尽管提前停止方法可以和任何一种BP 网络训练函数一起使用,但是不适合同训练速度过快的算法联合使用,比如trainlm 函数,所以本例中我们采用训练速度相对较慢的变学习速率算法traingdx 函数作为训练函数。
本例的MATLAB 程序如下:close allclearecho onclc% NEWFF——生成一个新的前向神经网络% TRAIN——对BP 神经网络进行训练% SIM——对BP 神经网络进行仿真% 敲任意键开始clc% 定义训练样本矢量% P 为输入矢量P = [-1:0.05:1];% T 为目标矢量randn('seed',78341223);T = sin(2*pi*P)+0.1*randn(size(P));% 绘制训练样本数据点plot(P,T,'+');echo offhold on;plot(P,sin(2*pi*P),':'); % 绘制不含噪声的正弦曲线echo onclcpauseclc% 定义验证样本val.P = [-0.975:0.05:0.975]; % 验证样本的输入矢量val.T = sin(2*pi*val.P)+0.1*randn(size(val.P)); % 验证样本的目标矢量pauseclc% 创建一个新的前向神经网络net=newff(minmax(P),[5,1],{'tansig','purelin'},'traingdx');pauseclc% 设置训练参数net.trainParam.epochs = 500;net = init(net);pauseclc% 训练BP 网络[net,tr]=train(net,P,T,[],[],val);pauseclc% 对BP 网络进行仿真A = sim(net,P);% 计算仿真误差E = T - A;MSE=mse(E)pauseclc% 绘制仿真拟合结果曲线plot(P,A,P,T,'+',P,sin(2*pi*P),':');pause;clcecho off下面给出了网络的某次训练结果,可见,当训练至第136 步时,训练提前停止,此时的网络误差为0.0102565。
给出了训练后的仿真数据拟合曲线,效果是相当满意的。
[net,tr]=train(net,P,T,[],[],val);TRAINGDX, Epoch 0/500, MSE 0.504647/0, Gradient 2.1201/1e-006TRAINGDX, Epoch 25/500, MSE 0.163593/0, Gradient 0.384793/1e-006TRAINGDX, Epoch 50/500, MSE 0.130259/0, Gradient 0.158209/1e-006TRAINGDX, Epoch 75/500, MSE 0.086869/0, Gradient 0.0883479/1e-006TRAINGDX, Epoch 100/500, MSE 0.0492511/0, Gradient 0.0387894/1e-006TRAINGDX, Epoch 125/500, MSE 0.0110016/0, Gradient 0.017242/1e-006TRAINGDX, Epoch 136/500, MSE 0.0102565/0, Gradient 0.01203/1e-006TRAINGDX, Validation stop.例3 用BP网络估计胆固醇含量这是一个将神经网络用于医疗应用的例子。
我们设计一个器械,用于从血样的光谱组成的测量中得到血清的胆固醇含量级别,我们有261个病人的血样值,包括21种波长的谱线的数据,对于这些病人,我们得到了基于光谱分类的胆固醇含量级别hdl,ldl,vldl。