当前位置:   article > 正文

读研之掉进故障检测(二)—CNN故障检测(CWRU轴承数据集)_cnn故障诊断代码

cnn故障诊断代码

系列文章目录


读研之掉进故障检测(二)
(一)是对CWRU轴承数据集分析论文的一些总结
读研之掉进故障检测—CWRU轴承数据集的三种已建立的诊断技术


前言

基于卷积神经网络的轴承故障诊断算法研究—张伟
DIO: CNKI:CDMD:2.1017.864225
对该论文中第2章 基于一维卷积神经网络的滚动轴承故障诊断方法的一种实现代码
原论文的作者给出了第三章的实现代码,这里给出github
https://github.com/yfshich/wdcnn_bearning_fault_diagnosis-master


一、滚动轴承故障诊断方法

1.一点基础知识

轴承故障诊断其算法的核心在于信号特征提取与模式分类两个部分。

------在轴承故障诊断领域,常见的特征提取算法有快速傅里叶变化,小波变换,经验模式分解以及信号的统计学特征等,常见的模式分类算法有支持向量机,BP 神经网络(也称为多层感知器),贝叶斯分类器以及最近邻分类器等。当下轴承故障诊断的研究热点是可以归结为 3 类:寻找更好的特征表达;寻找最适合的特征表达以及分类器的组合;以及发明新的传感器
在这里插入图片描述

2、基于卷积神经网络的轴承故障诊断算法

------一种端到端的诊断算法,省去了人为特征提取过程,即基于卷积神经网络的轴承故障诊断算法

二、论文中的CNN

1.CNN结构

在这里插入图片描述
1、网络层,卷积1,卷积核大小/步长:20 × 1/8× 1,卷积核数目32,输出大小(宽度深度 )25632,零补:是
2、网络层,池化 1,卷积核大小/步长:4 × 1/4 × 1,卷积核数目32,输出大小(宽度深度 )64 × 32,零补:否
3、网络层,卷积 2,卷积核大小/步长:5 × 1/2 × 1,卷积核数目64,输出大小(宽度
深度 )32 × 64,零补:是
4、网络层,池化 2,卷积核大小/步长:2 × 1/2 × 1,卷积核数目64,输出大小(宽度深度 )16 × 64,零补:否
5、网络层,全连接,卷积核大小/步长:500,卷积核数目1,输出大小(宽度
深度 )256*32,
6、网络层,softmax

三、实现的代码–(可能的)

1.CNN实现

代码

from keras.layers import Conv1D, Dense, Dropout, BatchNormalization, MaxPooling1D, Activation, Flatten
from keras.models import Sequential

import preprocess
from keras.callbacks import TensorBoard
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rcParams

config = {
    "font.family": 'serif',
    "font.size": 10,
    "font.serif": ['SimSun'],
    "mathtext.fontset": 'stix',
    'axes.unicode_minus': False
}
rcParams.update(config)

# 训练参数
batch_size = 128
epochs = 20
num_classes = 10
length = 2048
BatchNorm = True
number = 1000
normal = True
rate = [0.7, 0.2, 0.1]
val_acc = []
val_loss = []


path = r'data\0HP'
#在preprocess.prepro中已经有数据增强enc=True
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], '测试样本个数')

# Instantiate a sequential model
model = Sequential()

# Layer 1: Convolutional layer
model.add(Conv1D(filters=32, kernel_size=20, strides=8, input_shape=input_shape, padding='same'))
model.add(Activation('relu'))

# Layer 2: Pooling layer
model.add(MaxPooling1D(pool_size=4, strides=4))

# Layer 3: Convolutional layer
model.add(Conv1D(filters=64, kernel_size=5, strides=2, padding='same'))
model.add(Activation('relu'))

# Layer 4: Pooling layer
model.add(MaxPooling1D(pool_size=2, strides=2))

# Layer 5: Fully connected layer
model.add(Flatten())
model.add(Dense(units=500, activation='relu'))

# Output layer
model.add(Dense(units=10, activation='softmax'))

# Print model summary
model.summary()

# 编译模型
model.compile(optimizer='Adam', loss='categorical_crossentropy', metrics=['accuracy'])

# TensorBoard调用查看一下训练情况
tb_cb = TensorBoard(log_dir='logs')

# 开始模型训练,获取历史数据
history = model.fit(x=x_train, y=y_train, batch_size=batch_size, epochs=epochs,
                    verbose=1, validation_data=(x_valid, y_valid), shuffle=True,
                    callbacks=[tb_cb])

val_acc.extend(history.history['val_accuracy'])
val_loss.extend(history.history['val_loss'])

# 评估模型
score = model.evaluate(x=x_test, y=y_test, verbose=0)
print("测试集上的损失:", score[0])
print("测试集上的准确率:", score[1])

plt.figure(figsize=(12, 6))
epochs_range = range(1, epochs + 1)

plt.subplot(1, 2, 1)
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.title('Validation Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()

plt.subplot(1, 2, 2)
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.title('Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()

plt.tight_layout()
plt.show()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115

总结

具体结果是与论文中呈现的效果不同的,写这篇文章的主要目的就是为了学习如何使用CWRU轴承的数据集,属于抛砖引玉吧。
数据增强的函数为代码中的:def overlap_sampling(x_train, y_train, length, offset)
无数据增强的结果为
在这里插入图片描述
有数据增强的效果为
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/630858
推荐阅读
相关标签
  

闽ICP备14008679号