这是本科毕设做的实验内容的一部分,用一维深度卷积网络实现西储大学轴承故障数据的分类,并用t-SNE可视化展示分类的效果,一维深度卷积网络和普通两级卷积网络相比,确实会有比较好的分类效果。
1、实验环境
使用python3.7-keras在pycharm2019.3.3软件中实现调试
2、实验数据
本文使用美国西储大学(CWRU) 的轴承故障数据进行实验分析,其数据收集实验台如图所示。本文实验的数据集是1 HP负载、转速为1772 r/min的工况下,由一共10 种轴承数据组成,分别为1种正常状态和9种故障振动数据。十类标签的含义分别为
1、数据预处理
因为西储大学每一类的轴承故障数据都是一段振动数据,所以本实验通过重叠采样的数据集增强技术来获取足够多的数据样本,具体采样方法如图所示,该方法既可以满足数据集数量要求,同时其重叠部分还可以避免丢失截取信号的边缘信息。
代码参考了上述某篇知乎里面的文章(https://zhuanlan.zhihu.com/p/419856462),代码如下:
#用滑窗截取,形成训练样本集
win_len = 400 #每个样本的大小(指含有的振动点数)
step = 100 #滑窗截取时的步长
#定义data_sample制作样本集的函数
def data_sample(data,win_len,step):
i = 0
data_sample=[] #建立一个名字为data_sample的空白矩阵
#用滑窗截取
while i
2、网络框架搭建及代码
网络主要参考了文献《A new deep learning model for fault diagnosis with good anti-noise and domain adaptation ability on raw vibration signals》中提出的首层宽核的深度卷积网络(WDCNN),针对信号特征缺失的问题,进行卷积池化层进行改进,提出基于一维振动数据的深度卷积神经网络(1D-DCNN)模型。
该方法将输入振动信号,其中第一卷积层中的大卷积核来提取特征和减小制高频率噪声的影响,后面的几个小卷积核的卷积层用于多层非线性特征提取,有助于获得数据的良好表达,提高网络性能。因此该模型比以前的CNN方法更深入。本文提出的网络如图所示,其中 1 × 64s1-16 表示卷积核大小是1×64,步长是1,深度是16。
def MyModel_DCNN():
data_input=Input(shape=(400,1))
conv1=convolutional.Conv1D(16,64,strides=1,padding="same")(data_input)
conv1=MaxPool1D(pool_size=2,strides=2)(conv1)
conv2=convolutional.Conv1D(32, 5, strides=2, padding="same")(conv1)
conv2=MaxPool1D(pool_size=2,strides=2)(conv2)
conv3 = convolutional.Conv1D(64, 3, strides=2, padding="same")(conv2)
conv3 = convolutional.Conv1D(128, 3, strides=2, padding="same")(conv3)
conv5 = convolutional.Conv1D(128, 3, strides=2, padding="same")(conv3)
conv5 = MaxPool1D(pool_size=2, strides=2)(conv5)
flatten=Flatten()(conv5)
dense_1=Dense(1000, activation='relu')(flatten)
dense_1=Dropout(0.5)(dense_1)
dense_1=Dense(100)(dense_1)
output = Dense(10, activation='softmax')(dense_1)
dcnn_model= Model(inputs=data_input, outputs=output)
dcnn_model.summary() #打印模型结构与参数
return dcnn_model
3、t-SNE可视化
TSNE主要作用是通过降维来显示高维数据,降维成2或者3维可见的形式,是一种非线性降维算法,可以显性的看出模型训练后数据分类的效果。本实验参考了某篇文章(https://blog.csdn.net/weixin_46649052/article/details/115370386),本实验代码如下所示。
if m == 1:
layer = keras.backend.function([model.layers[0].input], [model.layers[12].output])
elif m == 2:
layer = keras.backend.function([model.layers[0].input], [model.layers[10].output])
f1 = layer([X_train])[0]
tsne = TSNE(n_components=2, random_state=35)#使用TSNE降成2维,以便展示分类效果。TSNE的输入为(a,b),a为样本数,b为维度,卷积输出经过全连接层展开后输出的是(样本数,维度)即f1
X_tsne = tsne.fit_transform(f1)
ax=plt.figure(figsize=(7, 5))#定义图片大小
plt.title('t-SNE')
y_ = np.array([item.index(1) for item in y_train.tolist()])#把onhot之后的标签转回成标签数值,以便于对应下一条代码中的颜色c
scatter=plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y_)#画聚类图
legend1 = ax.legend(*scatter.legend_elements(), #增加颜色的图例说明
loc="center right", title="Classes")
plt.legend()#创建显示图例
plt.savefig('tsne.png', dpi=120)
本实验将两个模型(一维深度卷积网络和普通的两级卷积网络)训练效果做对比,其中一维深度卷积网络的分类准确率99%左右,普通的两级卷积网络分类准确率在95%z左右。下面分别是两个模型的训练结果,左边是深度卷积网络,右边是两级卷积网络。
其中t-SNE可视化效果更为明显,左边的样本只有一两个混到其他类别里面,而右边有些模型距离太近甚至融合在一起,说明分类效果没有左边得好。
此篇作为毕设笔记记录下来,若有朋友需要源码,可以关注OurTwenty公众号,回复【深度轴承】,即可获得。