声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 4077|回复: 7

[编程技巧] 神经网络用于函数拟合的问题

[复制链接]
发表于 2010-12-4 11:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
   我利用神经网络进行多输入函数拟合的时候,为什么参数都不动的情况下,前后几次运行的结果差异非常大?这个问题困扰了我很久,希望高人帮忙解决!
回复
分享到:

使用道具 举报

发表于 2010-12-4 14:03 | 显示全部楼层
本帖最后由 wqsong 于 2010-12-4 14:05 编辑

和收敛有关,或者说是可能多次计算收敛步数不同。
另外,记得BP算法阈值修正好像有预估计项,所以训练出来的网络存在一定的不同。。。
其他神经网络算法不大清楚。
 楼主| 发表于 2010-12-4 14:23 | 显示全部楼层
回复 2 # wqsong 的帖子

我现在把程序和一部分数据贴出来!你看看!
P1=f1;
T1=f2;
%P1 = 1:2:200; % 训练样本,每一列为一个样本
%T1 = sin(P1*0.1); % 训练目标
P2=f3;
%P2 = 2:2:200; % 测试样本,每一列为一个样本
%T2 = sin(P2*0.1); % 测试目标

%---------------------------------------------------
% 归一化

[PN1,minp,maxp,TN1,mint,maxt] = premnmx(P1,T1);
PN2 = tramnmx(P2,minp,maxp);
%TN2 = tramnmx(T2,mint,maxt);
%PN1=P1;
%PN2=P2;
%TN1=T1;
%---------------------------------------------------
% 设置网络参数

NodeNum1 = 5; % 隐层节点数
%NodeNum2 = 6;
%NodeNum3 = 5
%NodeNum4 = 5
TypeNum = 1; % 输出维数

%TF1 = 'tansig';TF2 = 'tansig'; TF3='purelin';TF4 = 'tansig';TF5 = 'tansig';% 判别函数(缺省值)
%TF1 = 'tansig';TF2 = 'tansig',TF3='purelin';
TF1 = 'tansig';TF2 = 'purelin';
%TF1 = 'tansig';TF2 = 'tansig';
%TF1 = 'logsig';TF2 = 'logsig';
%TF1 = 'purelin';TF2 = 'purelin';

net = newff(minmax(PN1),[NodeNum1,TypeNum],{TF1,TF2});
%net = newff(minmax(PN1),[NodeNum1,NodeNum2,TypeNum],{TF1,TF2,TF3});
%net = newff(minmax(PN1),[NodeNum1,NodeNum2,NodeNum3,NodeNum4,TypeNum],{TF1,TF2,TF3,TF4,TF5});
net=init(net);

%---------------------------------------------------
% 指定训练参数

%net.trainFcn = 'traingd'; % 梯度下降算法
% net.trainFcn = 'traingdm'; % 动量梯度下降算法
%
%net.trainFcn = 'traingda'; % 变学习率梯度下降算法
%net.trainFcn = 'traingdx'; % 变学习率动量梯度下降算法
%
% (大型网络的首选算法)
% net.trainFcn = 'trainrp'; % RPROP(弹性BP)算法,内存需求最小
%
% 共轭梯度算法
% net.trainFcn = 'traincgf'; % Fletcher-Reeves修正算法
% net.trainFcn = 'traincgp'; % Polak-Ribiere修正算法,内存需求比Fletcher-Reeves修正算法略大
% net.trainFcn = 'traincgb'; % Powell-Beal复位算法,内存需求比Polak-Ribiere修正算法略大
% (大型网络的首选算法)
%net.trainFcn = 'trainscg'; % Scaled Conjugate Gradient算法,内存需求与Fletcher-Reeves修正算法相同,计算量比上面三种算法都小很多
%
% net.trainFcn = 'trainbfg'; % Quasi-Newton Algorithms - BFGS Algorithm,计算量和内存需求均比共轭梯度算法大,但收敛比较快
% net.trainFcn = 'trainoss'; % One Step Secant Algorithm,计算量和内存需求均比BFGS算法小,比共轭梯度算法略大
%
% (中型网络的首选算法)
net.trainFcn = 'trainlm'; % Levenberg-Marquardt算法,内存需求最大,收敛速度最快
%
% net.trainFcn = 'trainbr'; % 贝叶斯正则化算法
%
% 有代表性的五种算法为:'traingdx','trainrp','trainscg','trainoss', 'trainlm'

%---------------------%

net.trainParam.show = 20; % 训练显示间隔
net.trainParam.lr = 0.05; % 学习步长 - traingd,traingdm
net.trainParam.mc = 0.95; % 动量项系数 - traingd\,traingdx
net.trainParam.mem_reduc = 1; % 分块计算Hessian矩阵(仅对Levenberg-Marquardt算法有效)
net.trainParam.epochs = 5000; % 最大训练次数
net.trainParam.goal = 1e-3; % 最小均方误差
net.trainParam.min_grad = 1e-3; % 最小梯度
net.trainParam.time = inf; % 最大训练时间

%---------------------------------------------------
% 训练

net = train(net,PN1,TN1); % 训练

%---------------------------------------------------
% 测试

YN1 = sim(net,PN1); % 训练样本实际输出
YN2 = sim(net,PN2); % 测试样本实际输出

MSE1 = mean((TN1-YN1).^2) % 训练均方误差
%MSE2 = mean((TN2-YN2).^2) % 测试均方误差

%---------------------------------------------------
% 反归一化
Y1 = postmnmx(YN1,mint,maxt);
Y2 = postmnmx(YN2,mint,maxt);
 楼主| 发表于 2010-12-4 14:24 | 显示全部楼层
回复 2 # wqsong 的帖子

QQ能告诉我吗?我想请教你!
发表于 2010-12-4 18:02 | 显示全部楼层
本帖最后由 wqsong 于 2010-12-4 22:19 编辑

newff函数有一定的随机性的,所以每次训练结果不一样。
学习率改成0.01、神经元改改试一试。
根据数据调整神经元数目,以及学习率,多训练几次,最后验证一下,找个比较接近的使用。
神经网络不熟,把你的帖子转到matlab板块了。

评分

1

查看全部评分

发表于 2023-11-9 11:39 | 显示全部楼层
发表于 2023-11-9 11:40 | 显示全部楼层
发表于 2023-11-9 11:40 | 显示全部楼层
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-1 06:58 , Processed in 0.083880 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表