MATLAB GUI设计入门与实战
上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秒。因此这个小技巧也应该引起读者朋友的注意。