是BP神经网络,是一个只有一个隐含层的的BP神经网络。
nntraintool中的fitnet
open fitnet 命令打开MATLAB中fitnet中的函数:
可以看到,里面使用了feedforwardnet()函数,这是建立BP神经网络的新函数,用以替代newff()函数。在feedforwardnet()函数中,隐藏层和输出层的传递函数分别是'tansig'和‘purelin’
tansig和purelin作为传递函数
另外需要指出的是,在建立的神经网络中,权重和阈值是归一化后的参数使用的权重和阈值,归一化的过程是在fitnet()函数中进行的。
具体的问题可以使用下面的代码来加深理解。
clear
clc
[x,t] = simplefit_dataset;
net = fitnet(10);
net = train(net,x,t);
y = net(x); %x为输入,t为输出
%获取模型参数
w1= netiw{1,1};
b1=netb{1};
w2 = netlw{2,1};
b2=netb{2};
%%%查看网络的传递函数
ss=netlayers{1}transferFcn;
sw=netlayers{2}transferFcn;
x1=mapminmax(x); %x1为原始数据归一化后的输入数据
[t1,ps]=mapminmax(t); %t1为原始数据归一化后的输出数据
t11=w2(tansig(w1x1+b1))+b2; %t11为神经网络求取的归一化输出数据
t12=mapminmax('reverse',t11,ps); %t12为使用模型参数并且反归一化后的输出数据
神经网络不同的网络有这不同的训练函数,BP神经网络有两种训练函数,trainbp(),利用BP算法训练前向神经网络。trainbpx(),利用快速BP算法训练前向神经网络,即采用了动量或自适应学习,可减少训练时间,tansig函数是神经元的传递函数,与训练函数无关,在trainbp()函数中含有要训练神经元的函数。
你的X1错了,X1的行数等于输入节点数,X1应该是个2x6的矩阵。所以才会报错提示超出了矩阵维数。
newff函数的格式为:net=newff(PR,[S1 S2 SN],{TF1 TF2TFN},BTF,BLF,PF),函数newff建立一个可训练的前馈网络。输入参数说明:
PR:Rx2的矩阵以定义R个输入向量的最小值和最大值;
Si:第i层神经元个数;
TFi:第i层的传递函数,默认函数为tansig函数;
BTF:训练函数,默认函数为trainlm函数;
BLF:权值/阀值学习函数,默认函数为learngdm函数;
PF:性能函数,默认函数为mse函数。
某层的神经元个数与节点数是一个意思。按你的假设:虽是3层神经网络,但是去叫做两层BP网络,因为输入层一般不算做一层。按你的假设,n就该取2,s1就是隐含层节点数,选取的公式是Hornik
提出的公式,可以算的s1取值范围,到时自己选取合适职,s2就是你输出层节点数,也就是输出维数。
1一般你可以自己尝试下,我最近也在尝试,隐层用tansig是比较理想的,输出层要自己尝试的,如用purlin是输出任意值,logsig很多书也是推崇的,将输出值限定在0,1中,我一般都用tansig
2trainlm是一种训练方法,使用的话收敛很快很快,相比的话traingd收敛很慢很慢。优势traingd要训练1000epochs,而trainlm只要训练5epochs就够了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)