本文将2D-CNN与1D-CNN融合,同时对轴承数据集进行训练,然后在汇聚层将两者池化层的输出连接成一个向量,送进全连接层。模型训练结束之后,取FC层的输出作为提取到的故障特征信号。
融合CNN的结构图如图所示:
1,数据准备
采用凯斯西储轴承数据集,OHP下48k采样频率驱动端的数据,对于10类故障(1正常,9故障),分别采集200组样本,共2000组,采样点为1024。然后按7:2:1划分训练集、验证集与测试集。故障类型对应如下:
0HP/48k_Drive_End_B007_0_122.mat 为第 0 类
0HP/48k_Drive_End_B014_0_189.mat 为第 1 类
0HP/48k_Drive_End_B021_0_226.mat 为第 2 类
0HP/48k_Drive_End_IR007_0_109.mat 为第 3 类
0HP/48k_Drive_End_IR014_0_174.mat 为第 4 类
0HP/48k_Drive_End_IR021_0_213.mat 为第 5 类
0HP/48k_Drive_End_OR007@6_0_135.mat 为第 6 类
0HP/48k_Drive_End_OR014@6_0_201.mat 为第 7 类
0HP/48k_Drive_End_OR021@6_0_238.mat 为第 8 类
0HP/normal_0_97.mat 为第 9 类
2、模型训练-特征提取
在tensorflow1.x框架中搭建上图所示模型,在1D-CNN中直接将1维振动信号作为输入,整个过程中采用1d卷积进行卷积计算,池化层采用最大池化,填充均为'SAME'。在2D-CNN中,先将1维振动信号转换为32*32(这也是上面为什么要取样1024,正好转为32*32)的矩阵作为输入,整个过程中采用2d卷积进行卷积计算,池化层采用最大池化,填充均为'SAME'。学习率0.001,adam优化器,迭代次数100,batchsize为64,训练时的dropout为0.5,测试时为1.0。loss曲线如下:
训练结束之后,分别输入训练集、验证集、与测试集。采集FC层的输出作为最终的提取到的特征。
3,特征可视化
将提取的特征进行二维可视化,从图像上可以看出,经CNN学习之后,不同类数据的类间区分度明显增加
4、故障诊断
1、直接采用softmax进行分类:
训练集分类精度为: 100.0 %
验证集分类精度为: 97.49373197555542 %
测试集分类精度为: 98.50746393203735 %
2、采用SVM进行分类,本文采用SVM对2中采集到的特征进行最后的分类,核函数RBF,惩罚参数100,核参数0.01。
训练集分类精度为: 100.0 %
验证集分类精度为: 98.99749373433583 %
测试集分类精度为: 99.00497512437812 %
测试集中,第 0 类样本的精确率: 1.0 召回率为: 0.8947368421052632 F1分数为: 0.9444444444444444
测试集中,第 1 类样本的精确率: 0.8947368421052632 召回率为: 1.0 F1分数为: 0.9444444444444444
测试集中,第 2 类样本的精确率: 1.0 召回率为: 1.0 F1分数为: 1.0
测试集中,第 3 类样本的精确率: 1.0 召回率为: 1.0 F1分数为: 1.0
测试集中,第 4 类样本的精确率: 1.0 召回率为: 1.0 F1分数为: 1.0
测试集中,第 5 类样本的精确率: 1.0 召回率为: 1.0 F1分数为: 1.0
测试集中,第 6 类样本的精确率: 1.0 召回率为: 1.0 F1分数为: 1.0
测试集中,第 7 类样本的精确率: 1.0 召回率为: 1.0 F1分数为: 1.0
测试集中,第 8 类样本的精确率: 1.0 召回率为: 1.0 F1分数为: 1.0
测试集中,第 9 类样本的精确率: 1.0 召回率为: 1.0 F1分数为: 1.0
4、对比实验
特征提取对比,分别采用1d-cnn、2d-cnn与融合CNN进行特征提取。模型更改极其方便。
当然融合cnn++svm最好啦。就算其他方法效果好,也要调低【手动滑稽】
代码见评论区我的评论