matlab bp神经网络 精度低
来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/11/09 00:49:44
matlab bp神经网络 精度低
>> p=[14.8 25 32.1;
25 32.1 38;
32.1 38 52;
38 52 53.2;
52 53.2 54;
53.2 54 58;
54 58 68.1;
58 68.1 86;
68.1 86 90.1;
86 90.1 100;
90.1 100 105.0;
100 105.0 107.3;
105.0 107.3 108.6;
107.3 108.6 109.7;
108.6 109.7 110.2;
109.7 110.2 112.6;
110.2 112.6 133.5;
112.6 133.5 148.6;
133.5 148.6 178.0;
148.6 178.0 200.0]';
>> t=[38 52 53.2 54 58 68.1 86 90.1 100 105 107.3 108.6 109.7 110.2 112.6 133.5 148.6 178 200 222];
>> u=p;
>> tt=t;
>> [p,minp,maxp,t,mint,maxt]=premnmx(p,t)
>> net=newff([-1 1;-1 1;-1 1],[7,1],{'tansig','logsig'},'traingd');
>> net.trainParam.show=1000;
>> net.trainParam.Lr=0.01;
>> net.trainParam.epochs=500000;
>> net.trainParam.goal=10^(-4);
>> net=train(net,p,t)
为什么跑50w次精度都还是很低?
>> p=[14.8 25 32.1;
25 32.1 38;
32.1 38 52;
38 52 53.2;
52 53.2 54;
53.2 54 58;
54 58 68.1;
58 68.1 86;
68.1 86 90.1;
86 90.1 100;
90.1 100 105.0;
100 105.0 107.3;
105.0 107.3 108.6;
107.3 108.6 109.7;
108.6 109.7 110.2;
109.7 110.2 112.6;
110.2 112.6 133.5;
112.6 133.5 148.6;
133.5 148.6 178.0;
148.6 178.0 200.0]';
>> t=[38 52 53.2 54 58 68.1 86 90.1 100 105 107.3 108.6 109.7 110.2 112.6 133.5 148.6 178 200 222];
>> u=p;
>> tt=t;
>> [p,minp,maxp,t,mint,maxt]=premnmx(p,t)
>> net=newff([-1 1;-1 1;-1 1],[7,1],{'tansig','logsig'},'traingd');
>> net.trainParam.show=1000;
>> net.trainParam.Lr=0.01;
>> net.trainParam.epochs=500000;
>> net.trainParam.goal=10^(-4);
>> net=train(net,p,t)
为什么跑50w次精度都还是很低?
首先是我不知道你用的matlab是什么版本.如果用的2010以后的版本,那么你这样初始化神经网络一定会报警告.2010版以后初始化神经网络的语句是这样的net = newff(p, t, 7);输出层不需要自己去告诉系统.我想知道的第二个问题,是你的输出层函数是否需要使用logsig.如果使用purelin,那么你大可不必去归一化.后面我会告诉你原因.你手动指定了训练次数,但是学习率0.01这个数值不知道你从哪里找到的.我可能会选择高一点的学习率,最高我用过0.25.训练函数你也是手动指定的,这个是需要的么?如果不需要,对于7个神经节点,完全可以使用trainlm,这样你也不需要这么多的训练次数.
下面说一下2010以后的matlab中,神经网络训练增加的一个功能.在初始化神经网络以后,有一个默认的dividing function,将训练样本中的一部分用来校验神经网络性能,以防止过度训练.那么这个参数可能会导致训练不充分.在初始化神经网络以后,需要做的工作是设定net.divideFcn = '';用来去掉这个分配函数.如果你需要更改你的transfer function,那么可以在net.layers{2}.transferFcn = 'logsig'将输出层传输函数手动修改.
那么,我使用全默认设置,没有进行归一化处理,获得的结果是这样的.这个就是把你的t和训练后的神经网络计算的结果放在一起.结果已经很不错了.
如过我去掉了分配函数,那么神经网络就会一直训练到训练次数上限或者达到目标值.165次训练后,误差值是1.77e-19(误差使用mean squared error计算),结果在这里贴出来已经没意义了,因为几乎没有误差.如果你还有问题,那么跟我细聊一下.
再问: 谢谢您的回答!结果很理想。还想请问,如果我将p改成时间序列,t为对应时间的数据,用bp神经网络如何预测未来20年的数据?
再答: 神经网络这东西做外推本来就很危险…… 如果p 是时间序列,那么就一个输入呗。不过一个输入是不可以对应多个输出的。
下面说一下2010以后的matlab中,神经网络训练增加的一个功能.在初始化神经网络以后,有一个默认的dividing function,将训练样本中的一部分用来校验神经网络性能,以防止过度训练.那么这个参数可能会导致训练不充分.在初始化神经网络以后,需要做的工作是设定net.divideFcn = '';用来去掉这个分配函数.如果你需要更改你的transfer function,那么可以在net.layers{2}.transferFcn = 'logsig'将输出层传输函数手动修改.
那么,我使用全默认设置,没有进行归一化处理,获得的结果是这样的.这个就是把你的t和训练后的神经网络计算的结果放在一起.结果已经很不错了.
如过我去掉了分配函数,那么神经网络就会一直训练到训练次数上限或者达到目标值.165次训练后,误差值是1.77e-19(误差使用mean squared error计算),结果在这里贴出来已经没意义了,因为几乎没有误差.如果你还有问题,那么跟我细聊一下.
再问: 谢谢您的回答!结果很理想。还想请问,如果我将p改成时间序列,t为对应时间的数据,用bp神经网络如何预测未来20年的数据?
再答: 神经网络这东西做外推本来就很危险…… 如果p 是时间序列,那么就一个输入呗。不过一个输入是不可以对应多个输出的。