基于深度学习的轴承故障识别-构建基础的CNN模型

上回书说到,处理序列的基本深度学习算法分别是循环神经网络(recurrent neural network)和一维卷积神经网络(1D convnet)。上篇构建了基础的LSTM模型,这一篇自然轮到CNN了。
目录
CNN介绍
1.卷积层
2.池化层
3.全连接层
4.优化器和损失函数
构建CNN模型
CNN介绍 卷积神经网络是多级神经网络,分为滤波级和分类级两级。滤波级用来对初始信号进行过滤,筛选出需要的信息,消除不相关的噪声;分类级对处理完的特征信息进行分类归纳,完成最后的识别分类工作。两者在训练中同时进行,优化各自的参数。滤波级包含卷积层和池化层,分类级一般由全连接网络组成。下面简单介绍一下卷积神经网络的各组成部分。
1.卷积层
卷积层使用卷积核对输入信号或特征的局部区域进行卷积计算,来提取需要的关键信息。卷积层最重要的特点就是权值共享,即使用同一个卷积核,以固定的步长遍历一次输入,以减少卷积层的参数,避免参数过多导致过拟合。
卷积(Convolution)是一种在机器学习中很重要的数学运算,在信号处理和图像处理中,通常使用一维或二维卷积。由于本文需要处理的是包含轴承故障信息的一维数据,所以使用一维卷积运算,构建一维卷积神经神经网络进行故障诊断。
具体一维卷积的计算方法就不多说了,想了解的可以参看邱锡鹏老师的神经网络与深度学习。
卷积的主要功能是在某种特征上滑动卷积核,通过卷积操作获得一组新的特征,但在计算卷积的过程中通常需要将卷积核翻转,为了避免进行卷积核翻转,一般会用互相关操作来代替卷积。互相关是一个衡量两个序列相关性的函数,通常用滑动窗口的点积计算来实现。互相关和卷积的差别仅仅在于卷积核是否进行翻转,因此互相关也被称作不翻转卷积。在神经网络中,卷积操作是为了提取特征,是否翻转卷积核对提取特征的效果无影响,所以为了方便起见,大多使用互相关代替卷积运算。
卷积层的作用是提取一个局部区域的特征,每个卷积核遍历一次卷积层,同时进行卷积计算。卷积操作时,卷积核与被卷积区域的系数相乘,得到结果。然后以固定步长移动卷积核,重复之前的遍历操作,直至遍历完整个区域。
2.池化层
池化层(Pooling Layer)别称较多,子采样层、下采样层、汇聚层都是指池化层。池化层主要作用是减少参数数量,降低原始特征的数量。
卷积层虽然很大程度上已经减少了神经网络中的连接数量,但对于特征映射组中的神经元,个数并没有明显减少,后续输入的维数仍然较高,容易造成过拟合,所以通常都会将卷积层和池化层配合使用,可以有效降低特征维数。经过卷积层节点矩阵深度会改变,而池化层不会改变节点矩阵的深度,只会缩小节点矩阵的大小。
假设池化层的输入特征映射组为基于深度学习的轴承故障识别-构建基础的CNN模型
文章图片
,对于其中每一个特征映射基于深度学习的轴承故障识别-构建基础的CNN模型
文章图片
,将其划分为很多区域基于深度学习的轴承故障识别-构建基础的CNN模型
文章图片
,这些区域可重叠也可不重叠,池化操作就是对这样的一个区域进行下采样,得到一个值作为这个区域的概括。简单的说,池化就是将特征映射划分为多个区域,并用一个值概括每个区域的过程。
常用的池化方式有两种:最大池化(Maximun Pooling)和平均池化(Mean Pooling)。最大池化就是取该区域所有神经元的最大值,平均池化是取区域内神经元的均值。
基于深度学习的轴承故障识别-构建基础的CNN模型
文章图片
最大池化示例(图片来自邱锡鹏-神经网络与深度学习) 这里选择采用最大池化,可以减少参数,并获得位置无关的特征。
3.全连接层
全连接层一般位于神经网络的顶端,之前网络层的输出经过Flatten层展平为一维数据,作为后续全连接层的输入,在将其与输出层之间构建全连接网络。最后的输出层通常选择Softmax函数作为激活函数,Softmax函数可以将输入的神经元映射到(0,1)的区间,可看作概率分布,便于后续操作。以此将滤波级提取出来的特征进行分类。
4.优化器和损失函数
损失函数(Loss Function)也叫目标函数(Objective Function),在训练过程中需要将其最小化,以便衡量当前任务完成的进展。神经网络最终目的是要将损失最小化,所以选择合适的损失函数是一件重要的事。对于分类、回归、预测等常用神经网络解决的问题,前人积累了很多经验,比如对于二分类问题,可以选择二元交叉熵损失函数(binary crossentropy);对于多分类问题使用分类交叉熵损失函数(categorical crossentropy);对于回归问题使用均方误差损失函数(mean-squared error)等等。由于本文是一个多分类的问题,因此选择使用分类交叉熵损失函数作为损失函数。
优化器决定了如何基于损失函数对网络进行更新。对于浅层神经网络,通常会选用随机梯度下降(SGD),但SGD对于超参数较多的网络模型效果不好,容易陷入局部最优点。本文选择使用Adam优化器,该算法是一种计算每个参数的自适应学习率的方法,可以动态调整每个参数的学习率,在实践中比其他适应性学习方法效果更好。
构建CNN模型 根据卷积神经网络的基本结构,本章先构建一个基础的卷积神经网络。该卷积网络首先是一个大卷积核卷积层,窗口大小为64×1,步长16×1,第一层卷积层窗口较大是为了提取短时特征。卷积层后接一个池化层,池化层的窗口大小为2×1,缩小比例因数为2。再往后是若干个卷积层和池化层,卷积核小大均为3×1的小卷积核,步长为1×1,小卷积核使得参数更少,网络层数更多,产生过多的非线性变换,增加了网络非线性表达能力,特征学习能力更强,同时可以抑制过拟合。池化层参数同上,窗口为2×1,缩小比例因数为2。具体卷积层和池化层的数量由后续优化过程决定。然后是若干个全连接层,全连接层的神经元数为32,具体层数也由后续优化决定。最后是一个全连接输出层,激活函数为Softmax函数,输出十类轴承故障。
基于深度学习的轴承故障识别-构建基础的CNN模型
文章图片

CNN模型训练结果如下表所示:

CNN
acc
loss
训练用时
1
0.968
0.131587
21s
2
0.965
0.133174
21s
3
0.974
0.109313
21s
4
0.983
0.061683
21s
5
0.929
0.277991
22s
6
0.991
0.05439
22s
7
0.959
0.14993
22s
8
0.973
0.067982
21s
9
0.97
0.165404
23s
10
0.964
0.132303
22s
11
0.964
【基于深度学习的轴承故障识别-构建基础的CNN模型】0.136165
22s
12
0.948
0.167591
22s
13
0.962
0.139998
22s
14
0.967
0.116345
22s
15
0.963
0.142955
22s
16
0.973
0.11415
22s
17
0.985
0.06606
22s
18
0.967
0.145523
22s
19
0.962
0.161186
22s
20
0.998
0.017619
22s
平均
0.96825
0.124567
21.8s
由实验结果可见,基于卷积神经网络构建轴承故障诊断模型是可行的,且识别率尚可,平均识别率超过96%,损失率也较低,训练用时在21-23秒左右,速度较快。
附:
""" Edited on Fri Mar 22 10:20:32 2019@author: zhang """from keras.layers import Dense, Conv1D, BatchNormalization, MaxPooling1D, Activation, Flatten from keras.models import Sequential from keras.utils import plot_model from keras.regularizers import l2 import preprocess from keras.callbacks import TensorBoard import numpy as np# 训练参数 batch_size = 128 epochs = 12 num_classes = 10 length = 2048 BatchNorm = True # 是否批量归一化 number = 1000 # 每类样本的数量 normal = True # 是否标准化 rate = [0.7,0.2,0.1] # 测试集验证集划分比例path = r'data\0HP' x_train, y_train, x_valid, y_valid, x_test, y_test = preprocess.prepro(d_path=path,length=length, number=number, normal=normal, rate=rate, enc=True, enc_step=28)x_train, x_valid, x_test = x_train[:,:,np.newaxis], x_valid[:,:,np.newaxis], x_test[:,:,np.newaxis] # 输入数据的维度 input_shape =x_train.shape[1:]print('训练样本维度:', x_train.shape) print(x_train.shape[0], '训练样本个数') print('验证样本的维度', x_valid.shape) print(x_valid.shape[0], '验证样本个数') print('测试样本的维度', x_test.shape) print(x_test.shape[0], '测试样本个数')model_name = "cnn_1D"model = Sequential()#第一层卷积 model.add(Conv1D(filters=32, kernel_size=20, strides=8, padding='same',kernel_regularizer=l2(1e-4), input_shape=input_shape)) model.add(BatchNormalization()) model.add(Activation('relu')) model.add(MaxPooling1D(pool_size=4, strides=4, padding='valid'))# 从卷积到全连接需要展平 model.add(Flatten())# 添加全连接层,共100个单元,激活函数为ReLU model.add(Dense(units=100, activation='relu', kernel_regularizer=l2(1e-4)))model.add(Dense(units=num_classes, activation='softmax', kernel_regularizer=l2(1e-4)))# 编译模型 model.compile(optimizer='Adam', loss='categorical_crossentropy', metrics=['accuracy'])# TensorBoard调用查看一下训练情况 tb_cb = TensorBoard(log_dir='logs/{}'.format(model_name))# 开始模型训练 model.fit(x=x_train, y=y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=https://www.it610.com/article/(x_valid, y_valid), shuffle=True, callbacks=[tb_cb])# 评估模型 score = model.evaluate(x=x_test, y=y_test, verbose=0) print("测试集上的损失率:", score[0]) print("测试集上的准确率:", score[1]) plot_model(model=model, to_file='cnn-1D.png', show_shapes=True)

点击此处返回总目录:基于深度学习的轴承故障识别

    推荐阅读