matlab BP神经网络出错 newff参数 隐含层 怎么确定

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab BP神经网络出错 newff参数 隐含层 怎么确定相关的知识,希望对你有一定的参考价值。

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的那几个参数怎么确定。比如说隐含层节点个数,双隐含层又是什么含义。
解决问题可以追加财富。
上面这个程序有问题,我也不知道哪错了,帮忙改一改吧~感觉是维数不对应以及隐含层的节点个数。

设[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.layeri.initFcn这一技巧来初始化一个给定的网络。
net.initFcn用来决定整个网络的初始化函数。前馈网络的缺省值为initlay,它允许每一层用单独的初始化函数。
设定了net.initFcn ,那么参数net.layeri.initFcn 也要设定用来决定每一层的初始化函数。
  对前馈网络来说,有两种不同的初始化方式经常被用到:initwb和initnw。initwb函数根据每一层自己的初始化参数(net.inputWeightsi,j.initFcn)初始化权重矩阵和偏置。前馈网络的初始化权重通常设为rands,它使权重在-1到1之间随机取值。这种方式经常用在转换函数是线性函数时。initnw通常用于转换函数是曲线函数。它根据Nguyen和Widrow[NgWi90]为层产生初始权重和偏置值,使得每层神经元的活动区域能大致平坦的分布在输入空间。
参考技术A 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,输出后的误差标准选取也是影响很大。本回答被提问者和网友采纳
参考技术B 隐含层节点个数不能取的太小,否则会导致网络根本无法训练,隐含层神经元最小个数大体估算为:根号(输入神经元个数+输出神元个数) ,双隐含层就是有两个隐含层,比如你的网络参数写为:[26,26,1],这样网络就是双隐含层,

matlab中 BP神经网络怎么构建多个隐层

我设计的程序newff是:
net=newff(minmax(p),[4,1],‘tansig’, ‘purelin’,‘trainlm’);
只有一个隐层,现在想构建多隐层,上网查了下,都说只要在[4,1]中间加一个数代表第二隐层的节点数就可以,我试过了,改成
net=newff(minmax(p),[4,6,1],‘tansig’, ‘purelin’,‘trainlm’);
语句报错,请教,怎么实现bp神经网络的多隐层编程啊??
程序如下:
clear all
close all
p1=[1 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30];
t=[];
t_m=t.';
pr=[1 30];
for i=1:12
net=newff(pr,[200,200,1],'tansig' 'tansig' 'purelin','trainlm');
net.trainparam.goal=0.00001;
net.trainparam.epochs=10000;
[net,tr]=train(net,p1,t_m(i,:));
A(i,:)=sim(net,p1);
figure
plot(p1,t(:,i),'r')
hold on
plot(p1,A(i,:),'b:o')
hold on

end
t太长 没有写 正如1楼说的 少加了一个传输函数 不过加上之后还是报错 报错如下:
??? Maximum variable size allowed by the program is exceeded.

Error in ==> calcjejj at 121
JJ = Jx * Jx';

Error in ==> trainlm at 265
[je,jj,normgX]=calcjejj(net,Pd,Zb,Zi,Zl,N,Ac,El,Q,TS,mem_reduc);

Error in ==> network.train at 278
[net,tr,Ac,El] = feval(trainFcn,net,Pd,Tl,Ai,Q,TS,VV,TV);

Error in ==> Untitled11 at 17
[net,tr]=train(net,p1,t_m(i,:));

参考技术A 把报错内容写以下吧,我猜可能是你传输函数没有加吧
‘tansig’, ‘purelin’改成‘tansig’,‘tansig’, ‘purelin’试试?本回答被提问者采纳

以上是关于matlab BP神经网络出错 newff参数 隐含层 怎么确定的主要内容,如果未能解决你的问题,请参考以下文章

matlab中建立bp神经网络的函数newff的第二个参数的问题

有人知道bp神经网络Matlab R2012a 的newff用法么

运用matlab解决bp神经网络多个输入一个输出的问题

bp神经网络 激活单元相关问题sigmoid?matlab

bp神经网络matlab实现时,newff函数中的网络各层神经元的激活函数怎么选啊?

matlab建立bp神经网络如何设置两个隐含层呢?