上一遍写到了,公式,或者是一下关于BP神经网络的内容的语言描述。下面就要开始,进行深度点的分析。
一下是matlab程序。多验证下,结合视频和文本资料,可以对BP神经网络有一个新的认识。
clc
clear
%P=-1:0.1:1;
%T=[-0.96 -0.577 -0.0729 0.377 0.641 0.66 0.461 0.1336 -0.201 -0.434 -0.5 -0.393 -0.1647 0.0988 0.3072...
% 0.396 0.3449 0.1816 -0.0312 -0.2183 -0.3201];P=linspace(0.5,0.6,21); % 前两个是起始,最后是份数。
x1=0:pi/40:0.5*pi;
T=0.99*sin(x1);%plot (P,T,'r+');
%for w=1:10
net = newff (minmax(P),[4,1],{'logsig','purelin'},'traingdx');
%net = newff (minmax(P),[1,4,1],{'logsig','tansig','purelin'},'traingdx'); %双隐层结构
%net = newcf (minmax(P),[1,5,1],{'logsig','tansig','purelin'},'traingdx');
%newcf这个性能更好。建立的神经网络不一样。
net.trainParam.epochs=20000;%训练的最大次数
net.trainParam.goal=0.0002;%训练的最小均方误差
net.trainParam.lr=0.05;%学习率
[net,tr]=train(net,P,T);
Y=sim(net,P);
plot(P,Y,'r-')
hold
plot(P,T,'r+');
hold off;
%pause (1);
%figure;
%w=w+1;
%V1(1:4,w) = net.iw{1,1};%输入层到中间层的权值
%b1(1:4,w) = net.b{1,1};%中间层的阈值
%W1(w,1:4) = net.lw{2,1};%中间层到输出层的权值
%b2(w,1:4) = net.b{2,1};%输出层的阈值
V1 = net.iw{1,1}
b1 = net.b{1,1}
W1 = net.lw{2,1}
b2 = net.b{2,1}
%end
%iw(1, j ) 表示第 j 个输入矢量在输入层和隐含层中的权值。
%lw(2,1) :第 1 个输入矢量在隐含层和输出层中的权值。。。。
这个是我在验证过程中,使用的例子。这个例子是直接调用了,matlab的神经网络函数。通过这个例子,你可以更好的理解,神经网络。matlab自带的神经网络函数很多。可以感受一下,不同的神经网络有什么样的不同。结合文本资料,体会的就更深入。
newcf 创建级联前向网络
newff 创建前向BP网络
newffd 创建存在输入延迟的前向网络
传递函数:
logsig S型的对数函数
dlogsig logsig的导函数
tansig S型的正切函数
dtansig tansig的导函数
purelin 纯线性函数
dpurelin purelin的导函数
学习函数:
learngd 基于梯度下降法的学习函数
learngdm 梯度下降动量学习函数
训练函数:
trainbrBayes 规范化BP训练函数
trainc 循环顺序渐增训练函数
traincgb Powell-Beale连接梯度BP训练函数
traincgf Fletcher-Powell连接梯度BP训练函数
traincgp Polak-Ribiere连接梯度BP训练函数
traingda 自适应lrBP的梯度递减训练函数
traingdx 动量及自适应lrBP的梯度递减训练函数
trainlm Levenberg-Marquardt BP训练函数
trainoss 一步正切BP训练函数
trainr 随机顺序递增更新训练函数
trainrp 带反弹的BP训练函数
trains 顺序递增BP训练函数
trainscg 量化连接梯度BP训练函数
性能函数:
mse 均方误差函数
msereg 均方误差规范化函数
显示函数:
plotperf 绘制网络的性能
plotes 绘制一个单独神经元的误差曲面
plotep 绘制权值和阈值在误差曲面的位置
errsurf 计算单个神经元的误差曲面
这里是一些,对应的matlab函数。
有一些论文表示,
从一个论文里面,隐层节点数的估计是,
输入节点数加上输出节点数a是1—10之间。
目前我所查找到的资料,这个是用的最普遍的。(但都是统计学而已。并没有精确的理论推理和验证)
对应这个结论,我做了一下的一些测试。(大部分用的都是上面的matlab程序)
这里我就不一张一张的贴出来,我测试的内容了。
因为我做的测试很多。不好这么麻烦的贴出来。
总结:
中间层是5这个是newcf最好的情况。
中间层是 4 这个是newff最好的情况。
但是如果中间层是21,或者是31的话,中间层愈多越快。10秒钟就可以收敛。(和学习率有关,但是关系不大)
有论文说,隐层多也会使收敛的时间长(目前测试不出来)
对应学习率的测试:
0.03是5363次。 0.05是5006次。0.06是5559次。0.1是5908次(不同情况下,相同情况的迭代次数也不一样)
0.04是5290次(第二次5849)。
还有很多都是贴图的。就不在这里贴出来了。因为这里涉及到,随机初始点的随机性。也会影响结果。我记得我还测试了其他的数据。暂时找不到了。
关于隐层有几层的问题,其他论文的数据都是3层最合适。就是说只有1个隐层。但是少量的数据显示2个隐层也可以。输入数据归一化。
据查到是资料表示,BP神经网络是需要很多经验性的东西。可是到目前为止,测试的情况来看,我还没有分析到任何可靠的经验。
也就没有什么所谓的经验可以说了。
本人能力有限,但是我努力学的更好,分享的更多。只能做到这些了。我会继续努力的。