BP神经网络学习笔记

(本文为自我总结的BP神经网络学习笔记,读者可能会有些地方不懂或者认为有错误的地方,请留言赐教或交流)

神经网络的构成为:输入层、隐含层、输出层;

每层都含有数个神经元;

X1,X2……,Xn 为输入层神经元,其中n为神经元的个数;

h1,h2……,hp为隐含层神经元,其中p为隐含层神经元的个数;

    隐层神经元的个数一般是由经验确定无固定公式,参照:p = (n + m)  + a

    其中,n为输入层神经元个数, m为输出层神经元个数, a为[1,10]之间的常数

y1,y2……,ym 为输出层神经元,其中m为输出层神经元的个数;

每层神经元有加权值w和截距b参数;(这里类似于一次函数的转换关系)

这里权值w和截距b一般选择在[0,1]之间的随机数;

激励函数:隐含层和输出层神经元中的每个神经元都有激励函数,一般激励函数都用sigmoid函数,这个函数的输出在[0,1]或者[-1,1]之间;

正向传递过程是(以单个隐含层为例):输入层,经过加权加参后,作为隐含层的输入,传入隐含层,经过隐含层的激励函数得到隐含层的输出,这个输出经过加权加参,作为输出层的输入,再经过输出层神经元的激励函数,得到输出;

反向训练:这个过程是通过训练函数,从实际输出值与目标输出值的误差出发,计算每个权值w和截距b对误差的影响,通过反复迭代,从而反复修改这两个参数,最后使训练集数据的实际输出与目标输出的误差达到最小;

训练函数有几种:  1,traingd;(标准BP算法)

                            2,traingdm;(增加动量法)

                            3,traingdx;(自适应学习率)

                            4,trainrp;(弹性BP算法)

                            5,trainlm;(Levenberg-Marquardt,也称为L-M算法,经常用这个)


接下来,介绍神经网络的步骤:

1. 首先进行初始化,即确定要输入数据所对应的目标输出,加权值w和截距b;

2. 正向传递,即输入数据通过隐含层和输出层得到实际输出;

这里在输入的数据中,需要对数据进行归一化,因为sigmoid函数的输出在[0,1]或者[-1,1]之间;

3. 误差反向传播,即计算实际输出与目标输出的误差,然后通过训练函数反向训练,计算w和b对误差的影响;

4. 修改权值,即通过计算后得到影响则对其修改,实际计算中有个学习速率作为其修改参数;

5. 重新验证误差精度;

重复上诉步骤进行迭代。


泛化过程:最后得到训练好的神经网络之后,利用新的数据作为输入,得到的输出就是我们想要的输出。

在故障诊断中的应用:

例如在正常数据的输出为(0,0,0),故障类别中规定了(1,0,0)(0,1,0)(0,0,1)这三种故障;

那么我们只需要选取的输出神经元个数为3(注意:这里的3不是对应三种,而是对应的3个输出值);

例如我们通过一个(21,9,3)结构的神经网络(21为输入层神经元个数,9为隐含层神经元个数,3为输出层神经元个数);

输入21个特征数据得到输出为(0.11, 0.95,0.12),那么我们通过误差计算就可以判定为是第二种(0,1,0)故障类别。


下面举个matlab例子,引荐于:https://www.cnblogs.com/sallybin/p/3169572.html

根据表1,预测序号15的跳高成绩。

表1               国内男子跳高运动员各项素质指标

序号

跳高成绩()

30行进跑(s)

立定三级跳远()

助跑摸高()

助跑4—6步跳高()

负重深蹲杠铃()

杠铃半蹲系数

100

(s)

抓举

()

     1

2.24

3.2

9.6

3.45

2.15

140

2.8

11.0

50

2

2.33

3.2

10.3

3.75

2.2

120

3.4

10.9

70

3

2.24

3.0

9.0

3.5

2.2

140

3.5

11.4

50

4

2.32

3.2

10.3

3.65

2.2

150

2.8

10.8

80

5

2.2

3.2

10.1

3.5

2

80

1.5

11.3

50

6

2.27

3.4

10.0

3.4

2.15

130

3.2

11.5

60

7

2.2

3.2

9.6

3.55

2.1

130

3.5

11.8

65

8

2.26

3.0

9.0

3.5

2.1

100

1.8

11.3

40

9

2.2

3.2

9.6

3.55

2.1

130

3.5

11.8

65

10

2.24

3.2

9.2

3.5

2.1

140

2.5

11.0

50

11

2.24

3.2

9.5

3.4

2.15

115

2.8

11.9

50

12

2.2

3.9

9.0

3.1

2.0

80

2.2

13.0

50

13

2.2

3.1

9.5

3.6

2.1

90

2.7

11.1

70

14

2.35

3.2

9.7

3.45

2.15

130

4.6

10.85

70

15

 

3.0

9.3

3.3

2.05

100

2.8

11.2

50


代码:

P=[3.2 3.2 3 3.2 3.2 3.4 3.2 3 3.2 3.2 3.2 3.9 3.1 3.2;
9.6 10.3 9 10.3 10.1 10 9.6 9 9.6 9.2 9.5 9 9.5 9.7;
3.45 3.75 3.5 3.65 3.5 3.4 3.55 3.5 3.55 3.5 3.4 3.1 3.6 3.45;
2.15 2.2 2.2 2.2 2 2.15 2.14 2.1 2.1 2.1 2.15 2 2.1 2.15;
140 120 140 150 80 130 130 100 130 140 115 80 90 130;
2.8 3.4 3.5 2.8 1.5 3.2 3.5 1.8 3.5 2.5 2.8 2.2 2.7 4.6;
11 10.9 11.4 10.8 11.3 11.5 11.8 11.3 11.8 11 11.9 13 11.1 10.85;
50 70 50 80 50 60 65 40 65 50 50 50 70 70];
T=[2.24 2.33 2.24 2.32 2.2 2.27 2.2 2.26 2.2 2.24 2.24 2.2 2.2 2.35];
%分别对输入和输出进行归一化处理
[p1,ps] = mapminmax(P);
[t1,pst] = mapminmax(T);
%旧版本的归一化处理方式:[p1,minp,maxp,t1,mint,maxt]=premnmx(P,T);
%创建网络
net = feedforwardnet([6,1],'trainlm');
%这里6代表隐含层神经元个数,1代表输出层神经元个数,'trainlm'是我们的训练函数
%旧版本的创建网络方式:net=newff(minmax(P),[8,6,1],{'tansig','tansig','purelin'},'trainlm');
%设置训练次数
net.trainParam.epochs = 1000;
%设置收敛误差
net.trainParam.goal=0.0000001;
%训练网络
[net,tr]=train(net,p1,t1);
 
%输入数据
a=[3.0;9.3;3.3;2.05;100;2.8;11.2;50];
%将输入数据归一化
[a,psa]=mapminmax(a);
%放入到网络输出数据,也就是上文中泛化过程
b=sim(net,a);
%将得到的数据反归一化得到预测数据
c=mapminmax('reverse',b,pst)  ;%这里pst是归一化方式,反归一化按照上面输出T的归一化方式进行反归一化
c

下面是运行结果,注:不同的训练函数运行的结果不同,迭代次数也不同,我们应用的trainlm算法迭代次数最少
c =


    2.2771

(8次)


参考文献:大数据在滚动轴承故障诊断中的应用研究_白广晨

猜你喜欢

转载自blog.csdn.net/sp353846548/article/details/80746022