BP神经网络

【答疑】如何自行设置BP的初始值?

作者 : 老饼 发表日期 : 2022-11-23 04:18:08 更新日期 : 2024-12-06 01:37:53
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com



在matlab用newff构建一个BP神经网络时,权重、阈值是随机初始化的,往往我们希望自己设置

本文讲解,在matlab工具箱中如何自己设置BP神经网络的初始权重和阈值,并展示一个例子

通过本文,可以了解如何在matlab中设置BP神经网络的初始权重和阈值,以及具体的代码实现





    01. 如何自行设置BP的初始值    




本节讲解如何自行设置BP神经网络的权重、阈值的初始值




      自行设置BP的初始值的方法    


 在使用matlab工具箱训练BP神经网络时,
往往我们希望,能使用自己的初始值进行训练,而不是工具箱自带的初始值
 自行设置BP的初始值 
那么,我们要怎么实现呢?
其实只需要在初始化好BP神经网络,先修改网络的权重,然后再训练就可以了
 BP神经网络的权重怎么修改?
 
 BP神经网络的权重阈值存放在net.iw、net.b、net.lw里。
我们要修改的就是这三个变量。
其中,
net.iw : 存放着输入层到第一层的权重      
net.b : 存放着每层的阈值                    
net.lw : 是每层的权重                       





      自行设置BP的初始值-代码示例      


下面我们展示一个Demo,在Demo里,我们先给网络设置自己的权重,然后训练一步,
可以看到,最终的权重就是根据我们设置的初始值进行调整的。
% ================== 说明 ==============================================
% 本代码用于展示如何给BP神经网络自行设置初始值,已在matlab2018a亲测跑通
% 本代码来自www.bbbdata.com

%用于训练的数据
X = linspace(-3,3,100);   
y = 10*sin(X);   

%初始化网络(这时的网络权重是matlab自带的初始化值)
net = newff(X,y,3,{'tansig','purelin'},'trainlm');

% 设置自己想要的权重的初始值
disp('-------- 自设的网络初始权重 ---------------')
init_w21 =[100,100,100]'
init_b2  =[2,2,2]'
init_w32 =[3,3,3]
init_b3  = 4

% 将初始值赋给网络
net.iw{1,1} = init_w21 ;               % 第1层(输入层)到第2层(隐层)的权值
net.b{1}    = init_b2  ;               % 第2层(隐层)的阈值
net.lw{2,1} = init_w32 ;               % 第2层(输入层)到第3层(输出层)的权值
net.b{2}    = init_b3  ;               % 第3层(输出层)的阈值


% 训练网络,这里我们设置只训练一步
net.trainparam.goal   = 0.00001;  % 设置训练误差目标
net.trainparam.epochs = 1;        % 设置最大训练次数.
[net,tr,net_y] = train(net,X,y);  % 训练

% 训练完成后,可以看到,最终的权重值,与我们预设的初始差不多,因为我们只训练了一步。
disp('-------- 网络训练后的权重 ---------------')
w21  =  net.iw{1,1}               % 第1层(输入层)到第2层(隐层)的权值
b2   =  net.b{1}                  % 第2层(隐层)的阈值
						          
w32  =  net.lw{2,1}               % 第2层(输入层)到第3层(输出层)的权值
b3   =  net.b{2}                  % 第3层(输出层)的阈值
代码运行结果如下:
自行设置BP的初始值代码运行结果 
 自行设置BP的初始值的权重
可以看到,网络的最终输出与我们的设置的初始值很相近,
说明网络的确是使用了我们的初始值进行训练的





以上就是如何自行设置BP的初始值了~







 End 







联系老饼