MATLAB BP神经网络输出结果与手工计算结果不一致的解决办法

在我的一个算法中,我需要神经网络中间层的输出值。在用matlab仿真过程中发现不管是用feedforward还是newff,都自动的对我的输入数据进行了归一化,这就导致了我自己手动用“输入值原始值×权值+偏置”计算的值是错误的。

我在网上找了很久,没有一个方法能解决我的问题。于是我展开了尝试,终于找出了解决办法。本办法同样适用于

  • “ feedforwardnet函数如何对输入和输出进行归一化”
  • “MATLAB feedforwardnet与手动计算不一样”
  • “newff如何设置才能不进行归一化?”
  • “BP神经网络如何提取输入量对输出量的影响,利用LW*IW计算的结果和仿真输出的结果怎么不一致”

等问题。解决办法是,不用feedforward活着newff的新用法,而是采用如下的老版本的newff用法,即
net_model = newff(minmax(input), [9 2] , { ‘tansig’ ‘purelin’ } , ‘trainlm’ )
这样的用法。具体代码如下

% 神经网络输出与采用权值计算输出结果一致;
clc;clear
NUM=100;
x_k=10*rand(2,NUM)-1; % 第k个状态
u=5*rand(1,NUM)-1;  % 输入u
A = [0,.4;.3,1];
B = [0;1];
x_kp1=A*x_k+B*u; % 第k+1个状态

input=[x_k;u]; %神经网络输入量
output=x_kp1;  %神经网络输出量
% net_model= newff(input,output,9,{'tansig', 'purelin'}, 'trainlm'); 
net_model = newff(minmax(input), [9 2] , { 'tansig' 'purelin' } , 'trainlm' ) ; 
net_model.biasConnect = [1;1];
net_model.trainParam.showWindow = 1;
net_model.trainParam.epochs = 20;
net_model.trainParam.mu = 1e-8;
net_model.trainParam.min_grad = 1e-6;

net_model = train(net_model,input,output);
view(net_model)
out_v=[];
for i = 1:size(x_k,2)
    s = tansig(net_model.IW{1} * [x_k(:,i);u(:,i)] +net_model.b{1});  
    out = net_model.LW{2} * s +net_model.b{2};
    out_v=[out_v,out];
end
out_net=net_model(input);
out_v-out_net   % 10的-14次方数量级,几乎为0.
figure()
hold on
plot(out_v(1,:),'g*'); %  计算得到的输出分量1
hold on
plot(out_net(1,:),'b+');%  神经网络直接得到的输出分量1
figure()
plot(out_v(2,:),'g*');%  计算得到的输出分量2
hold on
plot(out_net(2,:),'b+');%  神经网络直接得到的输出分量2

结果如图1,图2所示。其中图1是计算得到的输出分量1与神经网络直接得到的输出分量1的对比,两者完全重合;图2 是计算得到的输出分量2与神经网络直接得到的输出分量2的对比,两者完全重合。

BP神经网络误差大 GA bp神经网络结果不一样_机器学习

图1.计算得到的输出分量1(红线)与神经网络直接得到的输出分量1(蓝色星)的对比

BP神经网络误差大 GA bp神经网络结果不一样_BP神经网络误差大 GA_02


图2.计算得到的输出分量2(红线)与神经网络直接得到的输出分量2(蓝色星)的对比