本站原创文章,转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com
当我们在matlab训练好网络后,可以使用神经网络工具箱的sim(net,x)函数进行预测输出。
但往往想提取出它的数学表达式,该怎么提取呢?
本文讲解如何提取训练好的神经网络模型的数学表达式。
下面以《 一个简单的BP神经网络例子》中的模型为例,讲解如何提取神经网络表达式 ( matlab版本为2014b )。
例子中模型的网络结构如下:
1:节点个数设置: 输入层、隐层、输出层的节点个数分别为[2 ,3,1]。
2:传递函数设置:隐层( tansig函数)。输出层(purelin函数)。
模型的数学表达式如下:
提取权重和阈值
要在matlab中提取wb,可输入如下代码:
w21 = net.iw{1,1} % 第1层(输入层)到第2层(隐层)的权值
b2 = net.b{1} % 第2层(隐层)的阈值
w32 = net.lw{2,1} % 第2层(输入层)到第3层(输出层)的权值
b3 = net.b{2} % 第3层(输出层)的阈值
命令窗口输出如下:
将得到 w 和 b 的值, 填入式(1)即得:
提取数据归一化范围
由于工具箱自动对数据进行归一化后,再进行训练,因此,上面的模型是针对归一化后的数据的,我们在使用时,也需要对输入进行归一化,并对输出进行反归一化。
因此,我们需要把归一化相关的输入输出范围提取出来,
输入输出范围提取方法如下:
% ------获取数据归一化时的输入输出范围,用于反归一-----
matlabMode = nnMATLAB;
matlabHints = matlabMode.hints;
matlabHints = nnMATLAB.netHints(net,matlabHints);
iMin = matlabHints.inp.procSet{1,1}.xmin;
iMax = matlabHints.inp.procSet{1,1}.xmax;
oMin = matlabHints.out.procSet{1,1}.xmin;
oMax = matlabHints.out.procSet{1,1}.xmax;
使 用 流 程
流程使用如下:
将需要预测的输入进行归一化 ---> 通过模型得到预测结果 ----> 将结果反归一化
其中,
● 输入归一化公式为:
● 输出的反归一函数如下:
下面展示一个由建模,到参数提取,到模型应用的Demo代码。
matlab2014b亲测已跑通:
%本代码展示一个提取神经网络表达式的DEMO
%转载请说明来自 《老饼讲解神经网络》 bp.bbbdata.com
% --------------生成训练数据------------------
x1 = [-3,-2.7,-2.4,-2.1,-1.8,-1.5,-1.2,-0.9,-0.6,-0.3,0,0.3,0.6,0.9,1.2,1.5,1.8];% x1:x1 = -3:0.3:2;
x2 = [-2,-1.8,-1.6,-1.4,-1.2,-1,-0.8,-0.6,-0.4,-0.2,-2.2204,0.2,0.4,0.6,0.8,1,1.2]; % x2:x2 = -2:0.2:1.2;
y = [0.6589,0.2206,-0.1635,-0.4712,-0.6858,-0.7975,-0.8040,...
-0.7113,-0.5326,-0.2875 ,0,0.3035,0.5966,0.8553,1.0600,1.1975,1.2618]; % y: y = sin(x1)+0.2*x2.*x2;
inputData = [x1;x2]; % 将x1,x2作为输入数据
outputData = y; % 将y作为输出数据
setdemorandstream(88888);%指定随机种子,这样每次训练出来的网络都一样。
%---------训练网络------------------
net = newff(inputData,outputData,3,{'tansig','purelin'},'trainlm');
%设置一些常用参数
net.trainparam.goal = 0.0001; % 训练目标:均方误差低于0.0001
net.trainparam.show = 400; % 每训练400次展示一次结果
net.trainparam.epochs = 15000; % 最大训练次数:15000.
[net,tr] = train(net,inputData,outputData); % 调用matlab神经网络工具箱自带的train函数训练网络
% ------------网络预测-------------------
simout = sim(net,inputData); % 调用matlab神经网络工具箱自带的sim函数得到网络的预测值
% ------获取权重和阈值---------------
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层(输出层)的阈值
% ------获取数据归一化时的输入输出范围,用于反归一-----
matlabMode = nnMATLAB;
matlabHints = matlabMode.hints;
matlabHints = nnMATLAB.netHints(net,matlabHints);
iMin = matlabHints.inp.procSet{1,1}.xmin;
iMax = matlabHints.inp.procSet{1,1}.xmax;
oMin = matlabHints.out.procSet{1,1}.xmin;
oMax = matlabHints.out.procSet{1,1}.xmax;
% --------用数学表达式进行预测------------
%数据归一化
normInputData=2*(inputData -repmat(iMin,1,size(inputData,2)))./repmat(iMax-iMin,1,size(inputData,2)) -1;
%用表达式预测
norm_py = w32 *tansig( w21 *normInputData + repmat(b2,1,size(normInputData,2))) + repmat(b3,1,size(normInputData,2));
%预测结果反归一化
py = (norm_py+1).*(repmat(oMax-oMin,1,size(norm_py,2)))/2 + repmat(oMin,1,size(norm_py,2));
%比较预测结果与工具箱预测的是否一致
max_e = max(max(abs(py - simout)))
End