(本文为自我总结的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步跳高()< |