原创文章,转载请说明来自《老饼讲解-BP神经网络》:bp.bbbdata.com
关于《老饼讲解-BP神经网络》:
本网结构化讲解神经网络的知识,原理和代码。
重现matlab神经网络工具箱的算法,是学习神经网络的好助手。
目录
01.问题
02. 思路
03. Demo展示
Demo代码
输出结果
本文讲解,在matlab工具箱中设置BP神经网络的初始权重。
在使用matlab工具箱训练BP神经网络时,
往往我们希望,
能使用自己的初始值进行训练,而不是工具箱自带的初始值。
那么,我们要怎么实现呢?
其实只需要在初始化好BP神经网络,
先修改网络的权重,
然后再训练就可以了。
✍️网络的权重怎么修改?
网络的权重存放在net.iw、net.b、net.lw里。
我们要修改的就是这三个变量。
其中,net.iw存放着输入层到第一层的权重 ,
net.b则存放着每层的阈值,
net.lw是每层的权重。
下面我们展示一个Demo,
在Demo里,我们先给网络设置自己的权重,然后训练一步,
可以看到,最终的权重就是根据我们设置的初始值进行调整的。
已在matlab2018a亲测跑通
%用于训练的数据
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} = w21 ; % 第1层(输入层)到第2层(隐层)的权值
net.b{1} = b2 ; % 第2层(隐层)的阈值
net.lw{2,1} = w32 ; % 第2层(输入层)到第3层(输出层)的权值
net.b{2} = 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层(输出层)的阈值
-------- 自设的网络初始权重 ---------------
init_w21 =
100
100
100
init_b2 =
2
2
2
init_w32 =
3 3 3
init_b3 =
4
-------- 网络训练后的权重 ---------------
w21 =
99.1931
99.1931
99.1931
b2 =
1.8573
1.8573
1.8573
w32 =
0.2169 0.2169 0.2169
b3 =
0.0040
可以看到,网络的最终输出与我们的设置的初始值很相近,
说明网络的确是使用了我们的初始值进行训练的。
相关文章
《BP神经网络梯度推导》
《BP神经网络提取的数学表达式》
《一个BP的完整建模流程》