关于轴承故障分类方法CNN+SVM和ELM的补充

上一篇文章里主要讲了CNN+SVM的实现方法,但是还有2个问题没有涉及,一是这种方法到底有没有改善的效果,二是ELM方法效果如何。通过这篇文章我进行具体展示。

0.CNN+SVM

首先为了区分方法的优劣,在单工况下肯定是不行的,因为很容易就达到100%了。因此,这次选择在3种工况下进行交叉验证,运行5次以后取平均值,结果如下:

>第1次 cnn: 88.68 cnn+svm: 91.75 耗时296.9 sec
>第2次 cnn: 86.29 cnn+svm: 73.42 耗时297.6 sec
>第3次 cnn: 91.80 cnn+svm: 92.44 耗时296.5 sec
>第4次 cnn: 87.27 cnn+svm: 88.18 耗时305.5 sec
>第5次 cnn: 89.95 cnn+svm: 84.51 耗时283.0 sec
A-B cnn准确率: 100.00  cnn+svm准确率: 96.60 
A-C cnn准确率: 85.90  cnn+svm准确率: 90.20 
B-A cnn准确率: 92.09  cnn+svm准确率: 96.39 
B-C cnn准确率: 91.86  cnn+svm准确率: 97.10 
C-A cnn准确率: 80.00  cnn+svm准确率: 64.17 
C-B cnn准确率: 82.94  cnn+svm准确率: 71.90 
总用时:1479.6sec 
训练平均用时:295.9sec 
Accuracy1 cnn: 88.80% (+/-1.95) 
Accuracy2 cnn+svm: 86.06% (+/-6.93)

由上可见,二者差别不大,如果不是第二次偏差过大,估计差别会很小。在训练过程中我发现一个问题,就是使用CNN训练时,我们同时用到了训练集和验证集,而在训练SVM时我只用了训练集,这个对于SVM来说确实是不公平了。于是我把训练集特征值和验证集特征值进行了拼接,对SVM进行训练,相当于多了1400个样本,原训练集是6500个样本。再重新进行5次看结果如下:

feat_train = np.concatenate((feat_train, feat_val), axis=0)
trainy_elm = np.concatenate((trainy_elm, valy_elm), axis=0)  #训练集和验证集拼接

>第1次 cnn: 90.14 cnn+svm: 86.14 耗时327.1 sec
>第2次 cnn: 88.58 cnn+svm: 88.89 耗时362.7 sec
>第3次 cnn: 86.76 cnn+svm: 90.62 耗时350.2 sec
>第4次 cnn: 91.94 cnn+svm: 91.94 耗时340.2 sec
>第5次 cnn: 87.51 cnn+svm: 87.35 耗时335.2 sec
A-B cnn准确率: 99.93  cnn+svm准确率: 98.94 
A-C cnn准确率: 85.91  cnn+svm准确率: 87.66 
B-A cnn准确率: 91.74  cnn+svm准确率: 88.80 
B-C cnn准确率: 92.29  cnn+svm准确率: 95.13 
C-A cnn准确率: 80.00  cnn+svm准确率: 79.99 
C-B cnn准确率: 84.06  cnn+svm准确率: 83.41 
总用时:1715.4sec 
训练平均用时:343.1sec 
Accuracy1 cnn: 88.99% (+/-1.86) 
Accuracy2 cnn+svm: 88.99% (+/-2.11)

二者效果持平。可见这种方法还是可取的,如果对SVM本身的参数再进行优化,相信结果还有提升空间。

关于轴承故障分类方法CNN+SVM和ELM的补充_第1张图片

1.CNN+ELM

CNN+ELM方法实现过程和前者很像,我是直接在网上找的ELM相关代码,也由于个人理解有限,暂时无法对其进行深层优化,就直接拿过来用了。同样是在CNN训练以后使用特征值对ELM模型进行训练:

a = HiddenLayer_D(feat_train, 800)
a.classifisor_train(trainy_elm)
result1 = a.classifisor_test(feat_test1)
result2 = a.classifisor_test(feat_test2)

accuracy3 = metrics.accuracy_score(testy_elm1, result1)
accuracy4 = metrics.accuracy_score(testy_elm2, result2)

 结果如下:

>第1次 cnn: 91.37 cnn+elm: 92.19 耗时62.4 sec
>第2次 cnn: 90.83 cnn+elm: 91.15 耗时59.5 sec
>第3次 cnn: 88.56 cnn+elm: 90.05 耗时61.9 sec
>第4次 cnn: 89.00 cnn+elm: 89.45 耗时60.8 sec
>第5次 cnn: 90.24 cnn+elm: 90.71 耗时62.1 sec
A-B cnn准确率: 100.00  cnn+elm准确率: 99.81 
A-C cnn准确率: 87.59  cnn+elm准确率: 89.56 
B-A cnn准确率: 94.09  cnn+elm准确率: 94.43 
B-C cnn准确率: 92.74  cnn+elm准确率: 92.71 
C-A cnn准确率: 79.97  cnn+elm准确率: 79.91 
C-B cnn准确率: 85.61  cnn+elm准确率: 87.84 
总用时:306.6sec 
 #1 训练平均用时: 61.3sec 
 Accuracy1 cnn: 90.00% (+/-1.07) Accuracy2 cnn+elm: 90.71% (+/-0.94)

从结果上看稍有改善,仔细看每一次的结果,发现均有细微提升。因此,这个方法貌似更加靠谱,而且运行速度极快,只有SVM的1/6左右。并且在ELM的参数设置方面我还没有调优,隐藏层单元参数随便设置了800,如果选最优的话还能好一些。

最后说一句题外话,我这里之所以没有写完整代码,还是有自己的私心的,毕竟也是自己的劳动成果,期间走了多少弯路只有自己知道。我希望能帮到和我当时状况差不多的人,也乐于和大家交流,但我个人时间有限,问题多的话真不能一个一个答,还请大家多多包涵。

你可能感兴趣的:(故障诊断,西储大学,分类,cnn,ELM,轴承故障)