一-newff函数参数说明,初始化网络
net = newff(P,T,S) % 这两种定义都可以
net = newff(P,T,S,TF,BTF,BLF,PF,IPF,OPF,DDF)
P:输入参数矩阵。(RxQ1),其中Q1代表R元的输入向量。其数据意义是矩阵P有Q1列,每一列都是一个样本,而每个样本有R个属性(特征)。一般矩阵P需要归一化,即P的每一行都归一化到[0 1]或者[-1 1]。
T:目标参数矩阵。(SNxQ2),Q2代表SN元的目标向量。
S:N-1个隐含层的数目(S(i)到S(N-1)),默认为空矩阵[]。输出层的单元数目SN取决于T。返回N层的前馈BP神经网络
TF:相关层的传递函数,默认隐含层为tansig函数,输出层为purelin函数。
BTF:BP神经网络学习训练函数,默认值为trainlm函数。
BLF:权重学习函数,默认值为learngdm。
PF:性能函数,默认值为mse,可选择的还有sse,sae,mae,crossentropy。
IPF,OPF,DDF均为默认值即可。
例子:
一般来说
input,output是训练样本
net = newff(input,output,[1层个数,2层个数..],{TF,1层传递函数,2层传毒函数},BTF:‘训练函数’)
net = newff( input,output, [50] , { 'logsig' 'purelin' } , 'traingdx' ) ;
传递函数TF
purelin: 线性传递函数。
tansig :正切S型传递函数。
logsig :对数S型传递函数。
隐含层和输出层函数的选择对BP神经网络预测精度有较大影响,一般隐含层节点转移函数选用 tansig函数或logsig函数,输出层节点转移函数选用tansig函数或purelin函数。
3,学习训练函数BTF
traingd:最速下降BP算法。
traingdm:动量BP算法。
trainda:学习率可变的最速下降BP算法。
traindx:学习率可变的动量BP算法。
trainrp:弹性算法。
变梯度算法:
traincgf(Fletcher-Reeves修正算法)
traincgp(Polak_Ribiere修正算法)
traincgb(Powell-Beale复位算法)
trainbfg(BFGS 拟牛顿算法)
trainoss(OSS算法)
二-再次初始化,赋予训练要求
1.参数说明
通过net.trainParam可以查看参数
Show Training Window Feedback showWindow: true
Show Command Line Feedback showCommandLine: false
Command Line Frequency show: 两次显示之间的训练次数
Maximum Epochs epochs: 训练次数
Maximum Training Time time: 最长训练时间(秒)
Performance Goal goal: 网络性能目标
Minimum Gradient min_grad: 性能函数最小梯度
Maximum Validation Checks max_fail: 最大验证失败次数
Learning Rate lr: 学习速率
Learning Rate Increase lr_inc: 学习速率增长值
Learning Rate lr_dec: 学习速率下降值
Maximum Performance Increase max_perf_inc:
Momentum Constant mc: 动量因子
net2 = newff(P,T,5,{'tansig', 'purelin'}, 'traingd'); % 隐含层有5个神经元
net2.trainParam.goal = 1e-5;%训练性能目标最小误差
net2.trainParam.epochs = 300;%训练次数
net2.trainParam.lr = 0.05;%学习速率
net2.trainParam.showWindow = 1;
net2.divideFcn = ''; % 为和书本一致,对于样本极少的情况,不要再三分了
2.权重和偏置的初始化
https://blog.csdn.net/SHENNONGZHAIZHU/article/details/52966402
通过设定网络参数net.initFcn和net.layer{i}.initFcn这一技巧来初始化一个给定的网络。
对前馈网络来说,有两种不同的初始化方式经常被用到:initwb和initnw。initwb函数根据每一层自己的初始化参数(net.inputWeights{i,j}.initFcn)初始化权重矩阵和偏置。前馈网络的初始化权重通常设为rands,它使权重在-1到1之间随机取值。这种方式经常用在转换函数是线性函数时。initnw通常用于转换函数是曲线函数。它根据Nguyen和Widrow[NgWi90]为层产生初始权重和偏置值,使得每层神经元的活动区域能大致平坦的分布在输入空间。
net.layers{1}.initFcn = 'initwb';
net.inputWeights{1,1}.initFcn = 'rands';
%初始化权重和偏置
net.biases{1,1}.initFcn = 'rands';
net.biases{2,1}.initFcn = 'rands';
net = init(net);
三-训练
net2 = train(net2,P,T);//P,T为训练样本
之后可以得到训练完成后的权值和阈值
iw1=net.IW{1};
b1=net.b{1};
lw2=net.LW{2};
b2=net.b{2};
四、仿真
q=sim(net,p);//p为测试样本,q输出就是通过网络得到的结果
e=q-T;//结果与预期的误差
plot(p,q); %画训练误差曲线
q=sim(net,X);
e=q-Y;
plot(X,q); %画测试误差曲线