Matlab训练BP神经网络的一般步骤


  BP神经网络的算法原理可参考各种书籍(如《西瓜书》、《神经网络模型及其MATLAB仿真程序设计》等)或者博客(如 《零基础入门深度学习(3) - 神经网络和反向传播算法》等),本文不再赘述—— 本文力求使用Matlab工具箱函数快速搭建BP神经网络模型并用于实战!

1 网络创建、训练与仿真函数

1.1 网络创建:newff

  Matlab中使用 net=newff(PR,[S1,S2,...],{TF1,TF2,...},BTF,BLF,PF); 创建BP神经网络,各参数的含义如下:

  1. net:创建的BP网络(结构体)。
  2. PR:输入样本范围(R,2),R为特征数。通常以minmax获取;
  3. [S1,S2,...]:隐层、输出层神经元数;
  4. [TF1,TF2,...]:激活(传输)函数(如tansig(logsig),purelin,poslin(ReLU));
  5. BTF:网络训练函数(default=traingdx);
  6. BLF:网络学习函数(default=learngdm);
  7. PF:网络性能函数(default=mse)。

1.2 网络训练:train

  Matlab中使用 [net,tr,Y,E,Pf,Af]=train(net,P,T,Pi,Ai,VV,TV); 训练网络,各参数的含义如下:
  1. net:训练后的BP网络;
  2. tr:训练记录,如训练次数net.epoch、训练误差性能net.perf等;
  3. Y:网络输出(S*Q神经元数*样本数);
  4. E:网络误差;
  5. Pf:最终输入延迟;
  6. Af:最终层延迟。
  7. net :BP网络模型;
  8. P:输入(R*Q特征数*样本数);
  9. T:期望(或输出。S*Q,即神经元数*样本数);
  10. Pi:初始输入延迟;
  11. Ai:初始层延迟;
  12. VV:验证集(结构体);
  13. TV:测试集(结构体)。

1.3 仿真预测:sim

  Matlab中使用 [Y,Pf,Af,E,perf]=sim(net,P,Pi,Ai,T); 仿真预测,各参数含义如下:
  1. Y:拟合或预测值(S*Q);
  2. Pf:最终输入延迟;
  3. Af:最终层延迟;
  4. E:网络误差(S*Q);
  5. perf:网络性能。
  6. net:BP网络模型;
  7. P:拟合或预测输入;
  8. Pi:初始输入延迟;
  9. Ai:初始层延迟;
  10. T:拟合或预测期望。

1.4 网络保存及加载:save、load

  Matlab中使用 save 'E:\Matlab Codes\netName' net; 保存网络模型(网络训练完毕之后);使用 load 'E:\Matlab Codes\netName' net; 加载网络模型(加载训练好的模型进行仿真预测)。

2 其他函数

2.1 数据归一化:mapminmax

2.1.1 归一化

  将X每行数据归一化至YMIN,YMAX之间:[Y,PS] = mapminmax(X,YMIN,YMAX)。其中,Y为归一化结果,PS为归一化信息(结构体);YMIN,YMAX为每行的范围。也可将YMIN,YMAX构造为结构体FP(即FP.YMIN,FP.YMAX)。示例如下:

在这里插入图片描述

2.1.2 “应用”归一化

  将X按归一化信息PS(结构体)进行归一化:Y = mapminmax('apply',X,PS)。其中,Y为归一化结果;PS为归一化信息。此用法一般用来 按归一化训练数据方式归一化测试数据 。示例如下:

在这里插入图片描述

2.1.3 “反”归一化

  将Y按归一化信息PS(结构体)进行 反归一化X = mapminmax(‘reverse’,Y,PS)。其中,X为反归一化结果;PS为归一化信息。此用法一般用来 反归一化网络拟合或预测结果 。示例如下:

在这里插入图片描述

2.2 网络训练算法

  Matlab工具箱中的BP网络训练算法可按如下原则选取:
  ①中等网络(数百权值)、函数逼近、最大存储空间:LM算法(trainlm)
  ②模式识别、(最小)存储空间较小:弹性BP算法(trainrp)
  ③问题普适(拟合或分类)、大型网络、较小存储空间:变梯度SCG算法(trainscg)
  ④某些问题有效、速度较慢、最小存储空间:变学习率算法(traingdx、traingda)
  详情可参考:周开利,康耀红.神经网络模型及其MATLAB仿真程序设计[M].北京:清华大学出版社,2005.

2.3 提高网络的泛化能力

2.3.1 贝叶斯归一化法:trainbr

  使用贝叶斯归一化法可 自动修正网络误差性能函数(自适应误差性能调整率) ,使网络获得较小的权值(W)和阈值(b),从而迫使网络响应趋于平滑,减小 “过适配”
  贝叶斯归一化法使用方式为:net=newff(PR,[S1,S2,...],{TF1,TF2,...},trainbr,BLF,PF);,其收敛停机条件为:Maximum MU reached或者SSE(平方和误差)和SSW(平方和权值)基本不再变化。示例如下:

clc;clear;
% 样本数据
p_train=-pi:0.1:pi;
sinCurve=sin(p_train);
t_train=sin(p_train)+0.1*rand(size(p_train));
% 网络创建
net=newff(minmax(p_train),[15,1],{'tansig','purelin'},'traingd'); %最速下降BP算法
net.trainParam.show=50; %显示训练过程
net.trainParam.lr=0.01; %学习率
net.trainParam.epochs=1000; %最大迭代次数
net.trainParam.goal=1.0e-5; %性能目标
% 网络训练
[net,tr]=train(net,p_train,t_train);
% 网络仿真
t_sim=sim(net,p_train);
% 结果展示
plot(p_train,t_train,'b*',p_train,t_sim,'r-',p_train,sinCurve,'k:');
legend('实际值','拟合值','sin曲线');

  拟合结果如下:

在这里插入图片描述

  使用 贝叶斯归一化法 训练网络,其拟合结果为:

在这里插入图片描述

  由图可知,后者的泛化能力更强,网络未出现过拟合现象。

2.3.2 提前终止法

  提前终止法的本质是 交叉验证 。将原始样本数据分成 训练集验证集(或测试集),在训练初始阶段,验证集误差正常地减小,也即训练集的误差;而在网络开始出现“过适配”时,验证集误差开始增加,当其连续增加的次数达到指定的迭代次数时,训练便被终止。此时,网络返回具有最小验证集误差的权值和阈值(偏置)。
  提前终止法示例如下:

clc;clear;
% 样本数据
p_train=-1:0.05:1; %训练集
t_train=sin(2*pi*p_train)+0.1*rand(size(p_train));
sinCurve=sin(2*pi*p_train);
val.P=-0.975:0.05:0.975; %验证集
val.T=sin(2*pi*val.P)+0.1*rand(size(val.P));
% 网络创建
net=newff(minmax(p_train),[20,1],{'tansig','purelin'},'traingdx'); %学习率可变的动量BP算法
net.trainParam.show=25; %显示训练过程
net.trainParam.epochs=300; %最大迭代次数
% 网络训练
net=init(net);
[net,tr]=train(net,p_train,t_train,[],[],val);
% 网络仿真
t_sim=sim(net,p_train);
% 结果展示
plot(p_train,t_train,'b*',p_train,t_sim,'r-',p_train,sinCurve,'k:');
xlabel('x');ylabel('y')
legend('实际值','拟合值','sin曲线');

  结果如下:
在这里插入图片描述

  由图可知,网络可有效地避免“过适配”现象。

3 一个完整例子

clc;clear;

%%1)训练测试数据(特征数R*样本数Q)
P_train=[-1,-1,2,2,4;0,5,0,5,7]; %R*Q
[PN_train,ps_input]=mapminmax(P_train,-1,1); %训练输入归一化
T_train=[-1,-1,1,1,-1]; %S*Q
[TN_train,ps_output]=mapminmax(T_train,-1,1);
P_test=[-1,-1,2,2,4;0,5,0,5,7];
PN_test=mapminmax('apply',P_test,ps_input); %测试输入归一化
T_test=[-1,-1,1,1,-1];

%%2)构建网络并设置训练参数
%net=newff(PR,[S1,S2,...],{TF1,TF2,...},BTF,BLF,PF); %输入样本范围(R,2);隐层、输出层神经元数;激活(传输)函数;网络训练函数(traingdx);网络学习函数(learngdm);性能函数(mse)
%1)TF:tansig(logsig),purelin,poslin(ReLU)2)BTF:trainlm(中等网络函数逼近/存储空间大),traingdx、traingda(某些问题有效/速度慢),trainscg(大型网络通用),trainrp(模式识别),trainbr(贝叶斯归一化法提高泛化能力)
net=newff(minmax(PN_train),[5,1],{'tansig','purelin'},'traingdx');
net.trainParam.show=50; %显示训练过程
net.trainParam.lr=0.05; %学习率
net.trainParam.epochs=300; %最大迭代次数
net.trainParam.goal=1.0e-5; %性能目标

%%3)网络训练
%[net,tr,Y,E,Pf,Af]=train(net,P,T,Pi,Ai,VV,TV); %1)网络,训练记录(epoch,perf),网络输出,网络误差,最终输入延迟,最终层延迟;2)网络,输入,期望,初始输入延迟,初始层延迟,确认样本结构([]),测试样本结构([][net,tr]=train(net,PN_train,TN_train);
%save 'E:\Matlab Codes\netName' net; %保存网络

%%4)训练结果:T=TF2(W2*TF1(W1*P+B1)+B2)
W1=net.IW{1,1}; %输入层到隐层权值
B1=net.b{1,1}; %隐层神经元偏置(阈值)
W2=net.LW{2,1}; %隐层到输出层权值
B2=net.b{2,1}; %输出层神经元偏置

%%5)网络仿真预测
%[Y,Pf,Af,E,perf]=sim(net,P,Pi,Ai,T); %1)网络拟合/预测值,最终输入延迟,最终层延迟,网络误差,网络性能;2)网络,预测输入,初始输入延迟,初始层延迟,预测期望
%load 'E:\Matlab Codes\netName' net; %加载网络
TN_sim=sim(net,PN_test);
T_sim=mapminmax('reverse',TN_sim,ps_output); %测试结果反归一化

%%6)结果展示
plotperform(tr); %训练性能
testNumber=length(T_test);
plot(1:testNumber,T_sim,'ro',1:testNumber,T_test,'b-');

4 参考文献

  1. 周开利,康耀红.神经网络模型及其MATLAB仿真程序设计[M].北京:清华大学出版社,2005.
  2.丛爽.面向MATLAB工具箱的神经网络理论与应用[M].合肥:中国科学技术大学出版社,2009.

  • 47
    点赞
  • 360
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,我可以为您提供一个基本的神经网络控制系统设计方案,您可以根据自己的需求进行修改与完善。以下是基本的流程: 1. 系统建模:根据您所自拟的二阶系统,首先需要对其进行数学建模,得到其状态空间方程或传递函数。 2. 神经网络设计:将神经网络作为控制器,设计其结构和参数。根据系统的状态空间方程或传递函数,采用反向传播算法训练神经网络,以实现对系统的控制。 3. 控制系统仿真:将神经网络控制器与所建模的二阶系统进行仿真,观察系统的响应情况,调整控制器参数,直至达到满意的控制效果。 以下是一个简单的Python代码示例,用于实现神经网络控制器的设计和仿真: ```python import numpy as np import matplotlib.pyplot as plt import tensorflow as tf # 定义神经网络结构和参数 input_size = 1 hidden_size = 10 output_size = 1 learning_rate = 0.01 X = tf.placeholder(tf.float32, shape=[None, input_size]) Y = tf.placeholder(tf.float32, shape=[None, output_size]) weights1 = tf.Variable(tf.random_normal([input_size, hidden_size])) biases1 = tf.Variable(tf.zeros([hidden_size])) weights2 = tf.Variable(tf.random_normal([hidden_size, output_size])) biases2 = tf.Variable(tf.zeros([output_size])) # 定义神经网络的前向传播过程 hidden_layer = tf.nn.sigmoid(tf.matmul(X, weights1) + biases1) Y_pred = tf.matmul(hidden_layer, weights2) + biases2 # 定义损失函数和优化器 loss = tf.reduce_mean(tf.square(Y - Y_pred)) optimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss) # 生成仿真数据 t = np.linspace(0, 10, 1000) plant_output = np.sin(t) + np.random.randn(1000) * 0.1 plant_input = np.zeros_like(plant_output) plant_input[:-1] = plant_output[1:] # 训练神经网络控制器 sess = tf.Session() sess.run(tf.global_variables_initializer()) for i in range(1000): _, loss_val = sess.run([optimizer, loss], feed_dict={X: plant_input.reshape(-1, 1), Y: plant_output.reshape(-1, 1)}) if i % 100 == 0: print("Step:", i, "Loss:", loss_val) # 使用神经网络控制器进行仿真 control_output = np.zeros_like(plant_output) control_output[0] = plant_output[0] for i in range(1, len(control_output)): control_input = sess.run(Y_pred, feed_dict={X: control_output[i-1].reshape(1, -1)}) control_output[i] = control_input # 绘制仿真结果 plt.figure() plt.plot(t, plant_output, label="Plant Output") plt.plot(t, control_output, label="Control Output") plt.legend() plt.show() ``` 上述代码中,我们定义了一个包含一个隐藏层和一个输出层的神经网络,使用反向传播算法训练神经网络控制器,然后使用训练好的控制器进行仿真。仿真结果可以通过绘制仿真信号的图像进行观察。 希望这个简单的方案可以帮助到您。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C_xxy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值