[未答复] 前馈三层BP算法获得权值和偏置位后如何正确预测?[已结贴]

[复制链接]
Alimy 发表于 2018-7-24 17:20:21
本帖最后由 Alimy 于 2018-7-26 16:22 编辑

RT。
我使用17组2输入的数组做训练并使用一输出的导师信号做监督。
训练完成后,nntool显示Performance goal met.
我的输入数据和监督数据如下:
  1. 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;

  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;

  3.    y  =[0.6589,0.2206,-0.1635,-0.4712,-0.6858,-0.7975,-0.8040,...

  4.           -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.*x
复制代码

训练及显示代码:
  1. %使用用输入输出数据(inputData、outputData)建立网络,

  2. inputData = [x1;x2]; %将x1,x2作为输入数据

  3.    outputData =y;      %将y作为输出数据
  4.   %隐节点个数设为3.其中隐层、输出层的传递函数分别为tansig和purelin,使用trainlm方法训练。

  5.    net =newff(inputData,outputData,3,{'tansig','purelin'},'trainlm');



  6.   %设置一些常用参数

  7.    net.trainparam.goal =0.0001; %训练目标:均方误差低于0.0001

  8.    net.trainparam.show =400;   %每训练400次展示一次结果

  9.    net.trainparam.epochs =15000; %最大训练次数:15000.



  10.    [net,tr] =train(net,inputData,outputData);%调用matlab神经网络工具箱自带的train函数训练网络

  11.    simout =sim(net,inputData); %调用matlab神经网络工具箱自带的sim函数得到网络的预测值

  12.    figure; %新建画图窗口窗口

  13.    t=1:length(simout);

  14.   plot(t,y,t,simout,'r')%画图,对比原来的y和网络预测的y
复制代码




参考代码用的是sim函数,我试图从net对象中抽取iw、lw和b系数并结合激活函数'tansig'、'purelin'预测输出值,但结果和sim差异很大。
我的代码如下:

  1. iw1 = net.iw{1,1}; %输入层、隐层之间的权值
  2. iw2 = net.lw{2,1}; %隐层、输出层之间的权值
  3. b1 = net.b{1};%输入层、隐层之间的偏置
  4. b2 = net.b{2};%隐层、输出层之间的偏置
  5. net_j = iw1*InputDta+repmat(b1,1,length(y));%我的理解中b1应该与iw1*InputData的size一致,但是事实上抽取出来b1只有一列,在运算前,对b1做了复制,复制后一共17列
  6. y = tansig(net_j);
  7. o = purelin(iw2*y+repmat(b2,1,length(y)));
复制代码


上述o即是利用Inputdata通过bp网络得到的预测结果。

这样算出来的值不仅与监督数组的值相差较大,也与sim函数得到的结果有很大不同。
请问我的写的预测代码有什么问题吗?谢谢



matlab版本:R2015b


1 条回复


Alimy 发表于 2018-7-26 15:59:17
本帖最后由 Alimy 于 2018-8-24 16:00 编辑

找到原因了,没做归一化【范围是(-1~1)】和反归一化。
1.输入输出数据先分别做归一化
2.用归一化后得到的输入输出去train得到权值和偏置,然后用sim算一下结果并反归一化
3.
iw1 = net.iw{1,1}; %输入层、隐层之间的权值
iw2 = net.lw{2,1}; %隐层、输出层之间的权值
b1 = net.b{1};%输入层、隐层之间的偏置
b2 = net.b{2};%隐层、输出层之间的偏置
net_j = iw1*(归一化后的InputDta)+repmat(b1,1,length(y));
y = tansig(net_j);
o = purelin(iw2*y+repmat(b2,1,length(y)));
o再做反归一化就和sim得到结果一致了。

请版主帮忙给本帖结贴处理。



您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表