feedforward网络可以用作输入和输出的映射,若给予足够的隐藏神经元,两(或更多)层前馈网络可以实现任何有限的输入输出功能,只含有一个隐含层的的神经网络可以拟合任意有限的输入输出映射问题。
2、函数表达式
feedforwardnet(hiddenSizes,trainFcn),返回具有N + 1层的前馈神经网络对象。
hiddenSizes:隐藏层神经元个数(一个行向量),默认值10
trainFcn:用于训练网络性能所采用的函数,默认'trainlm'
训练函数:
trainlm--- 中型网络,,内存需求最大,收敛速度最快
trainbfg---BFGS算法(拟牛顿反向传播算法)训练函数;
traincgb---Powell-Beale共轭梯度反向传播算法训练函数;
traincgp---Polak-Ribiere变梯度反向传播算法训练函数;
traingd---梯度下降反向传播算法训练函数;
traingda---自适应调整学习率的梯度下降反向传播算法训练函数;
traingdm---附加动量因子的梯度下降反向传播算法训练函数;
traingdx---自适应调整学习率并附加动量因子的梯度下降反向传播算法训练函数;
trainrp---RPROP(弹性BP算法)反向传播算法训练函数;、
trainscg---SCG(scaled conjugate gradient)反向传播算法训练函数
trainb---以权值/阈值的学习规则采用批处理的方式进行训练的函数
trainc---以学习函数依次对输入样本进行训练的函数;
trainr---以学习函数随机对输入样本进行训练的函数.
3、matlab自带例子
[x,t] = simplefit_dataset;% MATLAB自带数据
net = feedforwardnet;% 创建前向网络
view(net)
net = train(net,x,t); % 训练,确定输入输出向量的维度
view(net) % 查看网络的可视化图
y = net(x); % 计算预测值
perf = perform(net,y,t) % 计算误差性能
结果:
perf =2.0935e-04
4、拟合sin(k*x)函数
目的:比较不同隐含层神经元个数的拟合效果
figure
i = 1;
x = -2:.1:2;
hiddenSizes = [1; 5; 10; 30; 50; 80]; %隐层个数,分别取1、5、10、30、50和80
perf = zeros(size(hiddenSizes, 1),5); %保存拟合的误差值
for hs = 1:size(hiddenSizes, 1) %size(A,1)取矩阵的行数
net = feedforwardnet( hiddenSizes(hs) ); %bp神经网络
for k = 1:5
t = cos(k * x);
net = train(net, x, t);
y = net(x);
perf(hs, k) = perform(net, y, t);
fprintf("hs = %d k = %d : \n\tperf=%e\n\n", hs, k, perf(hs, k))
subplot(size(hiddenSizes, 1),5,i);
i = i + 1;
plot(x, t, 'r.',x, y,'g-');
ax = gca; ax.YLim = [-1 1]; ax.XTick = []; ax.YTick = [];
end
end
5、拟合结果
由结果可见:
①k一定,隐含层神经元个数越大,拟合效果越好,超过一定的程度,影响效果不显著甚至出现过拟合;
②k比较大时,隐含层神经元个数如果太小会导致拟合不足;
③k比较小时,隐含层神经元个数如果太大会导致拟合过度;
④拟合效果一致时,所需的隐含层神经元个数随着k的增大而增大。