本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com
隐节点个数是BP神经网络的一个重要参数,它影响着模型的拟合能力和泛化能力
本文讲解如何使用试凑法确定BP神经网络隐节点,并使用一个具体的例子进行讲解
通过本文,可以了解如何使用试凑法确定BP神经网络的隐节点个数,以及具体的代码实现
本节介绍什么是隐节点的试凑法,和试凑法具体的操作步骤
什么是试凑法
BP的隐节点个数是一个重要的参数,它直接影响着模型效果
而试凑法是BP神经网络中最常用一种用于优化隐节点个数的方法
试凑法在设定的隐节点个数的基础上,逐步增加或减少隐节点,来尝试更佳的隐节点个数
也可以理解为,给隐节点设定一个范围,找出范围内效果最好的隐节点个数
试凑法具体步骤
试凑法先设定隐节点个数的范围,然后试探多少个节点时拟合效果最佳
由于训练效果受初始化影响,所以每个隐节点参数一般训练多次,再取平均误差作为评估结果
试凑法的具体步骤如下:
1. 设定隐节点参数的尝试起始、结束值
2. 逐个参数尝试,繁个参数尝试n次,取平均误差作为该参数的误差
3. 以效果最好的参数作为最终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神经网络的隐节点设置
往往“节点-误差”曲线图是一条抛物线图,
即在最适合的节点时,误差是最小的,随着节点增加和减少,误差也相应增加减少
本例是由于拟合目标过于简单,不会因为节点过多而误差增加,所以不是抛物线图
本节通过一个真实案例,讲解如何解读BP神经网络隐节点试凑法的结果
试凑法-真实案例结果解读
由于上节的实例中数据的限制,无法展现一般实际数据的运行结果
这里附上网友Duff贡献的真实数据结果进行案例解说
运行结果如下:
从结果来看,选择6个节点是最佳的,节点过少,欠拟合,节点过多,就会趋向过拟合
解说示图如下:
好了,以上就是BP神经网络隐节点试凑法的例子和代码了~
End