matlab BP神经网络出错 newff参数 隐含层 怎么确定
clc;loadwine.mat;m=wine_data(1:178,1:13);n=wine_data(1:178,14);bpnet=newff(M,N,[26,1]...
clc;
load wine.mat;
m=wine_data(1:178,1:13);
n=wine_data(1:178,14);
bpnet=newff(M,N,[26,1],{'logsig','logsig','traingd'});
bpnet.trainParam.show=50;
bpnet.trainParam.lr=0.2;
bpnet.trainParam.epochs=20000;
bpnet.trainParam.goal=0.5e-1;
p_test=wine_data(1,1:13);
y=sim(net,p_test)
wine是一个矩阵,里面是一个178*14的矩阵,每一行代表一个样本,共178个样本,前13列代表每个样本的特征,第14列代表该行样本所属种类,取值为1、2、3,代表三类。
想问的是newff的那几个参数怎么确定。比如说隐含层节点个数,双隐含层又是什么含义。
解决问题可以追加财富。
上面这个程序有问题,我也不知道哪错了,帮忙改一改吧~感觉是维数不对应以及隐含层的节点个数。 展开
load wine.mat;
m=wine_data(1:178,1:13);
n=wine_data(1:178,14);
bpnet=newff(M,N,[26,1],{'logsig','logsig','traingd'});
bpnet.trainParam.show=50;
bpnet.trainParam.lr=0.2;
bpnet.trainParam.epochs=20000;
bpnet.trainParam.goal=0.5e-1;
p_test=wine_data(1,1:13);
y=sim(net,p_test)
wine是一个矩阵,里面是一个178*14的矩阵,每一行代表一个样本,共178个样本,前13列代表每个样本的特征,第14列代表该行样本所属种类,取值为1、2、3,代表三类。
想问的是newff的那几个参数怎么确定。比如说隐含层节点个数,双隐含层又是什么含义。
解决问题可以追加财富。
上面这个程序有问题,我也不知道哪错了,帮忙改一改吧~感觉是维数不对应以及隐含层的节点个数。 展开
展开全部
设[P,T]是训练样本,[X,Y]是测试样本;
net=newrb(P,T,err_goal,spread); %建立网络
q=sim(net,p);
e=q-T;
plot(p,q); %画训练误差曲线
q=sim(net,X);
e=q-Y;
plot(X,q); %画测试误差曲线
训练前馈网络的第一步是建立网络对象。函数newff建立一个可训练的前馈网络。这需要4个输入参数。
第一个参数是一个Rx2的矩阵以定义R个输入向量的最小值和最大值。
第二个参数是一个设定每层神经元个数的数组。
第三个参数是包含每层用到的传递函数名称的细胞数组。
最后一个参数是用到的训练函数的名称。
举个例子,下面命令将创建一个二层网络。它的输入是两个元素的向量,第一层有三个神经元(3),第二层有一个神经元(1)。
第一层的传递函数是tan-sigmoid,输出层的传递函数是linear。
输入向量的第一个元素的范围是-1到2[-1 2],输入向量的第二个元素的范围是0到5[0 5],训练函数是traingd。
net=newff([-1 2; 0 5],[3,1],{'tansig','purelin'},'traingd');
这个命令建立了网络对象并且初始化了网络权重和偏置,因此网络就可以进行训练了。
我们可能要多次重新初始化权重或者进行自定义的初始化。
下面就是初始化的详细步骤。
在训练前馈网络之前,权重和偏置必须被初始化。初始化权重和偏置的工作用命令init来实现。这个函数接收网络对象并初始化权重和偏置后返回网络对象。
下面就是网络如何初始化的:
net = init(net);
我们可以通过设定网络参数net.initFcn和net.layer{i}.initFcn这一技巧来初始化一个给定的网络。
net.initFcn用来决定整个网络的初始化函数。前馈网络的缺省值为initlay,它允许每一层用单独的初始化函数。
设定了net.initFcn ,那么参数net.layer{i}.initFcn 也要设定用来决定每一层的初始化函数。
对前馈网络来说,有两种不同的初始化方式经常被用到:initwb和initnw。initwb函数根据每一层自己的初始化参数(net.inputWeights{i,j}.initFcn)初始化权重矩阵和偏置。前馈网络的初始化权重通常设为rands,它使权重在-1到1之间随机取值。这种方式经常用在转换函数是线性函数时。initnw通常用于转换函数是曲线函数。它根据Nguyen和Widrow[NgWi90]为层产生初始权重和偏置值,使得每层神经元的活动区域能大致平坦的分布在输入空间。
net=newrb(P,T,err_goal,spread); %建立网络
q=sim(net,p);
e=q-T;
plot(p,q); %画训练误差曲线
q=sim(net,X);
e=q-Y;
plot(X,q); %画测试误差曲线
训练前馈网络的第一步是建立网络对象。函数newff建立一个可训练的前馈网络。这需要4个输入参数。
第一个参数是一个Rx2的矩阵以定义R个输入向量的最小值和最大值。
第二个参数是一个设定每层神经元个数的数组。
第三个参数是包含每层用到的传递函数名称的细胞数组。
最后一个参数是用到的训练函数的名称。
举个例子,下面命令将创建一个二层网络。它的输入是两个元素的向量,第一层有三个神经元(3),第二层有一个神经元(1)。
第一层的传递函数是tan-sigmoid,输出层的传递函数是linear。
输入向量的第一个元素的范围是-1到2[-1 2],输入向量的第二个元素的范围是0到5[0 5],训练函数是traingd。
net=newff([-1 2; 0 5],[3,1],{'tansig','purelin'},'traingd');
这个命令建立了网络对象并且初始化了网络权重和偏置,因此网络就可以进行训练了。
我们可能要多次重新初始化权重或者进行自定义的初始化。
下面就是初始化的详细步骤。
在训练前馈网络之前,权重和偏置必须被初始化。初始化权重和偏置的工作用命令init来实现。这个函数接收网络对象并初始化权重和偏置后返回网络对象。
下面就是网络如何初始化的:
net = init(net);
我们可以通过设定网络参数net.initFcn和net.layer{i}.initFcn这一技巧来初始化一个给定的网络。
net.initFcn用来决定整个网络的初始化函数。前馈网络的缺省值为initlay,它允许每一层用单独的初始化函数。
设定了net.initFcn ,那么参数net.layer{i}.initFcn 也要设定用来决定每一层的初始化函数。
对前馈网络来说,有两种不同的初始化方式经常被用到:initwb和initnw。initwb函数根据每一层自己的初始化参数(net.inputWeights{i,j}.initFcn)初始化权重矩阵和偏置。前馈网络的初始化权重通常设为rands,它使权重在-1到1之间随机取值。这种方式经常用在转换函数是线性函数时。initnw通常用于转换函数是曲线函数。它根据Nguyen和Widrow[NgWi90]为层产生初始权重和偏置值,使得每层神经元的活动区域能大致平坦的分布在输入空间。
展开全部
1,你好,BP神经网络的隐层数,各隐层的节点数都是要不断的调节的,不过有一个一般性的范围。
隐层节点数 L<n-1或L=log2(n)取整或L<sqrt(m-n)+a (这里的n是上一层节点数,m是下一层节点数,a是1-10任意常数)。
2,每一层之间的传递函数也是要不断变换着用来调出符合目标的最佳组合。你这里的这个组合是比较好的。
3,学习率,lr也是要调整的参数,不过一般0.1-0.3也可。
4,输出后的误差标准选取也是影响很大。
隐层节点数 L<n-1或L=log2(n)取整或L<sqrt(m-n)+a (这里的n是上一层节点数,m是下一层节点数,a是1-10任意常数)。
2,每一层之间的传递函数也是要不断变换着用来调出符合目标的最佳组合。你这里的这个组合是比较好的。
3,学习率,lr也是要调整的参数,不过一般0.1-0.3也可。
4,输出后的误差标准选取也是影响很大。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
隐含层节点个数不能取的太小,否则会导致网络根本无法训练,隐含层神经元最小个数大体估算为:根号(输入神经元个数+输出神元个数) ,双隐含层就是有两个隐含层,比如你的网络参数写为:[26,26,1],这样网络就是双隐含层,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询