BP神经网络

【代码】BP神经网络-隐节点试凑法例子与代码

作者 : 老饼 发表日期 : 2022-11-23 03:49:07 更新日期 : 2024-12-07 14:41:50
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com



隐节点个数是BP神经网络的一个重要参数,它影响着模型的拟合能力和泛化能力

本文讲解如何使用试凑法确定BP神经网络隐节点,并使用一个具体的例子进行讲解

通过本文,可以了解如何使用试凑法确定BP神经网络的隐节点个数,以及具体的代码实现





    01. BP神经网络-隐节点试凑法简介   





本节介绍什么是隐节点的试凑法,和试凑法具体的操作步骤





      什么是试凑法     


BP的隐节点个数是一个重要的参数,它直接影响着模型效果
而试凑法是BP神经网络中最常用一种用于优化隐节点个数的方法
试凑法在设定的隐节点个数的基础上,逐步增加或减少隐节点,来尝试更佳的隐节点个数
 也可以理解为,给隐节点设定一个范围,找出范围内效果最好的隐节点个数 
   试凑法具体步骤  
试凑法先设定隐节点个数的范围,然后试探多少个节点时拟合效果最佳
由于训练效果受初始化影响,所以每个隐节点参数一般训练多次,再取平均误差作为评估结果
试凑法的具体步骤如下:
1. 设定隐节点参数的尝试起始、结束值                                                       
2. 逐个参数尝试,繁个参数尝试n次,取平均误差作为该参数的误差            
3. 以效果最好的参数作为最终BP神经网络的隐节点个数                              






    02.BP神经网络-试凑法例子与代码   




下面我们通过例子说明BP神经网络隐节点的试凑法如何使用和实现代码





    BP神经网络隐节点个数试凑法-代码例子    


BP神经网络隐节点的试凑法具体实现代码如下:
% 代码语言:matlab2018a
% 本代码展示如何使用试凑法确定BP神经网络隐节点个数
% 转载请说明来自 《老饼讲解神经网络》 www.bbbdata.com
%================原始数据====================
x1 = linspace(-3,3,100);                                                                      % 在[-3,3]之间线性生成100个数据
x2 = linspace(-2,1.5,100);                                                                    % 在[-2,1.5]之间线性生成100个数据
X  = [x1;x2];                                                                                 % 将x1,x2作为输入数据
y = 10*sin(x1)+0.2*x2.*x2;                                                                    % 生成y
setdemorandstream(88);                                                                        % 老饼为了每次运行结果一致设定随机种子,实际中可以去掉
%==============网络训练 ============================                                         
%使用用输入输出数据(X,y)建立网络                                                           
hn_start  = 1;                                                                                % 隐节点的尝试起始值
hn_end    = 8;                                                                                % 隐节点的尝试结束值
train_num = 10;                                                                               % 每次隐节点的训练次数
train_error_record =zeros(hn_end-hn_start+1,train_num);                                       % 初始化训练误差历史记录
test_error_record =zeros(hn_end-hn_start+1,train_num);                                        % 初始化测试误差历史记录
for i = hn_start:hn_end                                                                       % 逐个尝试"隐节点个数设置"
    for j = 1:10                                                                              % 每个隐节点设置尝试10次
        net = newff(X,y,i,{'tansig','purelin'},'trainlm');                                    % 初始化网络
        %设置一些常用关键参数                                                                
        net.trainParam.goal = 0.00001;                                                        % 训练目标:均方误差低于0.00001
        net.trainparam.show = 100000;                                                         % 每训练100000次展示一次结果
        net.trainParam.epochs = 15000;                                                        % 最大训练次数:15000.
        [net,tr,net_y] = train(net,X,y);                                                      % 训练网络
        train_error_record(i-hn_start+1,j) = mean(abs(y(tr.trainInd) - net_y(tr.trainInd)));  % 记录本次训练误差
        test_error_record(i-hn_start+1,j)  = mean(abs(y(tr.testInd) - net_y(tr.testInd)));    % 记录本次测试误差
    end
end
train_error = mean(train_error_record,2);                                                     % 每个隐节点个数对应的训练误差
test_error  = mean(test_error_record,2);                                                      % 每个隐节点个数对应的测试误差
%========================画图==============================================
plot(hn_start:hn_end,train_error,hn_start:hn_end,test_error,'g')
legend('训练误差','测试误差')
title('不同隐节点的误差')
ylabel('误差')
xlabel('隐节点个数')
代码运行结果如下:
 
试凑法代码运行结果
从中可以看到,使用3个隐节点时,误差已经较小,在使用5个及以上节点时,误差几乎为0,
本着误差尽量小,节点数量尽量少的原则,综合考虑,最后选用5个节点作为BP神经网络的隐节点设置
 往往“节点-误差”曲线图是一条抛物线图,
即在最适合的节点时,误差是最小的,随着节点增加和减少,误差也相应增加减少
本例是由于拟合目标过于简单,不会因为节点过多而误差增加,所以不是抛物线图






   03. BP的试凑法-结果解读    




本节通过一个真实案例,讲解如何解读BP神经网络隐节点试凑法的结果




    试凑法-真实案例结果解读   


由于上节的实例中数据的限制,无法展现一般实际数据的运行结果
 这里附上网友Duff贡献的真实数据结果进行案例解说
 运行结果如下:
 试凑法结果讲解
从结果来看,选择6个节点是最佳的,节点过少,欠拟合,节点过多,就会趋向过拟合
 解说示图如下:
 如何通过试凑法确定隐节点个数





好了,以上就是BP神经网络隐节点试凑法的例子和代码了~







 End 




联系老饼