FPGA 机器学习之BP神经网络3

               上一遍写到了,公式,或者是一下关于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函数。

有一些论文表示,

从一个论文里面,隐层节点数的估计是,                     输入节点数加上输出节点数a1—10之间。

目前我所查找到的资料,这个是用的最普遍的。(但都是统计学而已。并没有精确的理论推理和验证)

对应这个结论,我做了一下的一些测试。(大部分用的都是上面的matlab程序)

这里我就不一张一张的贴出来,我测试的内容了。

因为我做的测试很多。不好这么麻烦的贴出来。

总结:

中间层是5这个是newcf最好的情况。

中间层是 4 这个是newff最好的情况。

但是如果中间层是21,或者是31的话,中间层愈多越快。10秒钟就可以收敛。(和学习率有关,但是关系不大)

有论文说,隐层多也会使收敛的时间长(目前测试不出来)

对应学习率的测试:

0.035363次。 0.055006次。0.065559次。0.15908次(不同情况下,相同情况的迭代次数也不一样)

0.045290次(第二次5849)。

还有很多都是贴图的。就不在这里贴出来了。因为这里涉及到,随机初始点的随机性。也会影响结果。我记得我还测试了其他的数据。暂时找不到了。

关于隐层有几层的问题,其他论文的数据都是3层最合适。就是说只有1个隐层。但是少量的数据显示2个隐层也可以。输入数据归一化。

据查到是资料表示,BP神经网络是需要很多经验性的东西。可是到目前为止,测试的情况来看,我还没有分析到任何可靠的经验。

也就没有什么所谓的经验可以说了。

微笑本人能力有限,但是我努力学的更好,分享的更多。只能做到这些了。我会继续努力的

原文地址:https://www.cnblogs.com/maohuawang/p/3807217.html