上QQ阅读APP看书,第一时间看更新
2.4 神经网络Net训练窗口的显示与关闭
神经网络应用比比皆是,例如常用的BP神经网络,该网络通过误差反向传播,达到逼近目标的目的。BP神经网络有自学习功能,能够很好地适应各种线性及非线性系统等,结构图如图2-36所示。
图2-36 BP神经网络结构图
对于一个BP神经网络模型而言,定义输入输出变量,以及各层权值和符号简要说明如下:
对于输出层,有:
对于隐层,有:
其中,。
具体的MATLAB代码如下:
% Designed by Yu Shengwei From SWJTU University % 2015年2月3日 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 tic % 运算计时 P = [1,1,7,4,0,6,3,0,8,7; % 输入 1,3,6,7,9,6,1,0,0,4]; T = [1,8,2,8,0,3,7,8,2,4]; % 输出 % 创建一个新的前向神经网络 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=[1,3,6,7,9,6,1,0,0,4; 1,8,2,4,5,7,8,9,0,1]; sim(net_1,x)' % 预测结果 toc % 计时结束
运行程序输出结果如下:
MSE = 0.1187 ans = 1.0630 8.5173 2.8468 3.2789 3.1808 5.8226 0.1082 0.0756 7.9932 6.6894 时间已过 26.751669 秒。
由均方误差值可知,该网络训练输出误差很小,可以用于模型预测。
然而运行的过程中,经常弹出如图2-37所示的网络训练对话框,有时候很影响用户执行程序的效率,因此很多用户更多地希望该对话框不出现,即隐藏该对话框,提高程序运行速度。
图2-37 网络训练对话框
当给程序添加以下代码时,则如图2-37所示的窗口将不显示,具体如下:
net_1.trainParam.showWindow = 0;
默认情况下,net_1.trainParam.showWindow等于1,即显示网络训练状态,如图2-37所示。
则完整的BP代码如下:
% Designed by Yu Shengwei From SWJTU University % 2015年2月3日 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 tic % 运算计时 % 构建网络 nntwarn off P = [1,1,7,4,0,6,3,0,8,7; 1,3,6,7,9,6,1,0,0,4]; T = [1,8,2,8,0,3,7,8,2,4]; % 创建一个新的前向神经网络 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; % 最小均方根误差 net_1.trainParam.showWindow = 0; % 不显示神经网络训练窗口 % 调用 TRAINGDM 算法训练BP网络 [net_1,tr]=train(net_1,P,T); % 训练 % 对BP网络进行仿真 A = sim(net_1,P); % 计算仿真误差 E = T - A; % 误差 MSE=mse(E) % 均方差 x=[1,3,6,7,9,6,1,0,0,4; 1,8,2,4,5,7,8,9,0,1]; sim(net_1,x)' % 预测结果 toc % 计时结束
运行程序输出结果如下:
MSE = 9.7580e-04 ans = 1.0432 6.0335 4.1839 4.0281 3.0099 1.4709 6.3602 0.0262 7.9593 4.5517 时间已过 10.713016 秒。
对比显示BP网络训练窗口程序,添加net_1.trainParam.showWindow=0这句代码后,程序执行时间为10.713016秒,大大降低了程序执行时间,而net_1.trainParam.showWindow=1时,程序执行时间为26.751669秒。因此这个小技巧也应该引起读者朋友的注意。