上回书说到,处理序列的基本深度学习算法分别是循环神经网络(recurrent neural network)和一维卷积神经网络(1D convnet)。上篇构建了基础的LSTM模型,这一篇自然轮到CNN了。
目录
CNN介绍
1.卷积层
2.池化层
3.全连接层
4.优化器和损失函数
构建CNN模型
CNN介绍 卷积神经网络是多级神经网络,分为滤波级和分类级两级。滤波级用来对初始信号进行过滤,筛选出需要的信息,消除不相关的噪声;分类级对处理完的特征信息进行分类归纳,完成最后的识别分类工作。两者在训练中同时进行,优化各自的参数。滤波级包含卷积层和池化层,分类级一般由全连接网络组成。下面简单介绍一下卷积神经网络的各组成部分。
1.卷积层
卷积层使用卷积核对输入信号或特征的局部区域进行卷积计算,来提取需要的关键信息。卷积层最重要的特点就是权值共享,即使用同一个卷积核,以固定的步长遍历一次输入,以减少卷积层的参数,避免参数过多导致过拟合。
卷积(Convolution)是一种在机器学习中很重要的数学运算,在信号处理和图像处理中,通常使用一维或二维卷积。由于本文需要处理的是包含轴承故障信息的一维数据,所以使用一维卷积运算,构建一维卷积神经神经网络进行故障诊断。
具体一维卷积的计算方法就不多说了,想了解的可以参看邱锡鹏老师的神经网络与深度学习。
卷积的主要功能是在某种特征上滑动卷积核,通过卷积操作获得一组新的特征,但在计算卷积的过程中通常需要将卷积核翻转,为了避免进行卷积核翻转,一般会用互相关操作来代替卷积。互相关是一个衡量两个序列相关性的函数,通常用滑动窗口的点积计算来实现。互相关和卷积的差别仅仅在于卷积核是否进行翻转,因此互相关也被称作不翻转卷积。在神经网络中,卷积操作是为了提取特征,是否翻转卷积核对提取特征的效果无影响,所以为了方便起见,大多使用互相关代替卷积运算。
卷积层的作用是提取一个局部区域的特征,每个卷积核遍历一次卷积层,同时进行卷积计算。卷积操作时,卷积核与被卷积区域的系数相乘,得到结果。然后以固定步长移动卷积核,重复之前的遍历操作,直至遍历完整个区域。
2.池化层
池化层(Pooling Layer)别称较多,子采样层、下采样层、汇聚层都是指池化层。池化层主要作用是减少参数数量,降低原始特征的数量。
卷积层虽然很大程度上已经减少了神经网络中的连接数量,但对于特征映射组中的神经元,个数并没有明显减少,后续输入的维数仍然较高,容易造成过拟合,所以通常都会将卷积层和池化层配合使用,可以有效降低特征维数。经过卷积层节点矩阵深度会改变,而池化层不会改变节点矩阵的深度,只会缩小节点矩阵的大小。
假设池化层的输入特征映射组为
文章图片
,对于其中每一个特征映射
文章图片
,将其划分为很多区域
文章图片
,这些区域可重叠也可不重叠,池化操作就是对这样的一个区域进行下采样,得到一个值作为这个区域的概括。简单的说,池化就是将特征映射划分为多个区域,并用一个值概括每个区域的过程。
常用的池化方式有两种:最大池化(Maximun Pooling)和平均池化(Mean Pooling)。最大池化就是取该区域所有神经元的最大值,平均池化是取区域内神经元的均值。
文章图片
最大池化示例(图片来自邱锡鹏-神经网络与深度学习) 这里选择采用最大池化,可以减少参数,并获得位置无关的特征。
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 |
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 |
附:
"""
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)
点击此处返回总目录:基于深度学习的轴承故障识别
推荐阅读
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- paddle|动手从头实现LSTM
- pytorch|使用pytorch从头实现多层LSTM
- 推荐系统论文进阶|CTR预估 论文精读(十一)--Deep Interest Evolution Network(DIEN)
- pytorch|YOLOX 阅读笔记
- 前沿论文|论文精读(Neural Architecture Search without Training)
- 联邦学习|【阅读笔记】Towards Efficient and Privacy-preserving Federated Deep Learning
- OpenCV|OpenCV-Python实战(18)——深度学习简介与入门示例
- 深度学习|深度学习笔记总结
- 《繁凡的深度学习笔记》|一文绝对让你完全弄懂信息熵、相对熵、交叉熵的意义《繁凡的深度学习笔记》第 3 章 分类问题与信息论基础(中)(DL笔记整理