[已解决] 神经网络bp函数拟合不准

[复制链接]
知昱之恩 发表于 2016-3-14 01:07:47
初学神经网络试着玩下函数拟合,
随便写个函数y=x1.*x1-x2.^3+3*x1.*x2-2*x2+1;
之后用x1x2和计算的y值反推上函数(就是明知道函数是啥,就想用神经网络再给算出来)
训练数据经过神经网络算的结果与预期值相差不大;

!!!关键是换用其他数据后结果偏差的完全没法看,

最可气的是把没问题的训练数据的前50组重新作为新输入给网络计算结果又差的不能看

求大神解释!代码如下:
x1=unifrnd(-5,5,100,1);%随机生成100*1阵
x2=unifrnd(-5,5,100,1);
y=x1.*x1-x2.^3+3*x1.*x2-2*x2+1;%目标输出
in=[x1,x2]';%目标输入
net=newff(minmax(in),[9,9,9,9,1],{'tansig','tansig','tansig','tansig','purelin'},'trainlm','learngdm','msereg');
net=init(net);

net.performFcn='sse';
net.trainParam.goal=0.01;
net.trainParam.show=20;
net.trainParam.epochs=50000;
net.trainParam.mc=0.95;
[net,tr]=train(net,in,y');
Y=sim(net,in);
plot(y'-Y)
x3=unifrnd(-5,5,100,1);%随机再生成一组数据验证函数准确性
x4=unifrnd(-5,5,100,1);
y2=x3.*x3-x4.^3+3*x3.*x4-2*x4+1;
in2=[x3,x4]';
Y2=net(in2);%把新输入用网络计算出输出
plot(y2'-Y2)%绘制误差图

最佳答案


fzc 发表于 2016-3-14 19:06:34
知昱之恩 发表于 2016-3-14 18:44
Y2=net(in2)这句没错,可以这么用;
又换了你的程序跑了没问题,但是发现你的隐含层只有1层
我试着把隐含 ...

Y2=net(in2)可以这么用?我的MATLAB运行报错了,而且help也没有找到依据(版本:R2008a)。

一般只需要设置1层就足够了,理论依据:kolmogorov理论,3层神经网络理论上可以拟合任何函数。
至于隐含层的节点数一般是经验公式+反复测试寻优,无理论证明。

节点和隐含层越多。。。这句也只是理论上的,随着增加,相应的参数数目也很大,相应的参数误差很大,你基本上无法确定最优值参数。

4 条回复


fzc 发表于 2016-3-14 17:37:06
Y2=net(in2)这句有问题。
clear,clc
x1=unifrnd(-5,5,100,1);%随机生成100*1阵
x2=unifrnd(-5,5,100,1);
y=x1.*x1-x2.^3+3*x1.*x2-2*x2+1;%目标输出
in=[x1,x2]';%目标输入
net=newff(minmax(in),y',13,{},'trainlm');
[net,tr]=train(net,in,y');
Y=sim(net,in);
plot(y'-Y)
x3=unifrnd(-5,5,100,1);%随机再生成一组数据验证函数准确性
x4=unifrnd(-5,5,100,1);
y2=x3.*x3-x4.^3+3*x3.*x4-2*x4+1;
in2=[x3,x4]';
Y2=sim(net,in2);%把新输入用网络计算出输出
plot(y2'-Y2)%绘制误差图
修改后,误差在0.2以下,你可以多运行几次找到最好

知昱之恩 发表于 2016-3-14 18:44:13
fzc 发表于 2016-3-14 17:37
Y2=net(in2)这句有问题。
clear,clc
x1=unifrnd(-5,5,100,1);%随机生成100*1阵

Y2=net(in2)这句没错,可以这么用;
又换了你的程序跑了没问题,但是发现你的隐含层只有1层
我试着把隐含层加到2层3层或将1层节点加到19最终结果的误差都biubiu的飙升
这是什么原理,按理说节点和隐含层越多,结果越精确吗?
那么节点数和隐含层数怎么选择?全靠经验?

fzc 发表于 2016-3-14 19:05:49
Y2=net(in2)可以这么用?我的MATLAB运行报错了,而且help也没有找到依据(版本:R2008a)。

一般只需要设置1层就足够了,理论依据:kolmogorov理论,3层神经网络理论上可以拟合任何函数。
至于隐含层的节点数一般是经验公式+反复测试寻优,无理论证明。

节点和隐含层越多。。。这句也只是理论上的,随着增加,相应的参数数目也很大,相应的参数误差很大,你基本上无法确定最优值参数。

fzc 发表于 2016-3-14 19:06:34
知昱之恩 发表于 2016-3-14 18:44
Y2=net(in2)这句没错,可以这么用;
又换了你的程序跑了没问题,但是发现你的隐含层只有1层
我试着把隐含 ...

Y2=net(in2)可以这么用?我的MATLAB运行报错了,而且help也没有找到依据(版本:R2008a)。

一般只需要设置1层就足够了,理论依据:kolmogorov理论,3层神经网络理论上可以拟合任何函数。
至于隐含层的节点数一般是经验公式+反复测试寻优,无理论证明。

节点和隐含层越多。。。这句也只是理论上的,随着增加,相应的参数数目也很大,相应的参数误差很大,你基本上无法确定最优值参数。
回复此楼
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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