前言
本文使用CUDA+Pytorch,对CWRU的轴承数据进行CNN分类以及模型训练。
附源代码。
提示:以下是本篇文章正文内容,下面案例可供参考
一、数据来源
使用经典的凯斯西储大学(CWRU)的开源轴承数据集,官方下载链接:(https://engineering.case.edu/bearingdatacenter/download-data-file)
对此数据集的介绍在网上很多,这里不赘述。
二、数据集
1.MAT数据下载&读取
在CWRU官网上可以看到有非常多的数据,在这个案例学习中我们不需要下载所有数据。只取十分类数据下载即可,顾名思义,下载10个代表性数据即可。以 12k Drive End Bearing Fault Data数据组为例:
可以看到有0.007、0.014、0.021、0.028四组数据,0.028数据不用考虑,因为没有外径数据。内圈、滚珠、外圈三个故障点,0.007、0.014、0.028三组,所以就有3*3=9,9组数据,加上一组正常的数据,那就是有10组数据,就是所谓的十分类。
这些数据是MAT格式,是MATLAB的格式,为了在python中读取,需要届时在代码中调用scipy库
import scipy.io as sio
具体读取函数如下:
def read_mat(self):
"""
读取MAT文件,并将数据整合到一个DataFrame中。
"""
data_df = pd.DataFrame()
for index in range(len(self.file_names)):
# 读取MAT文件
data = sio.loadmat(f'{
self.file_path}/{
self.file_names[index]}')
dataList = data[self.data_columns[index]].reshape(-1)
data_df[self.columns_name[index]] = dataList[:119808] # 限制样本长度以保持一致
return data_df
2.数据集制作
以7:2:1的比例制作训练集测试集和验证集(当然其他比例也可以),核心就是要知道这三类数据集出自同一处,同时训练集比重一定要占最大头。
def split_data_with_overlap(self, data, window_step, overlap_ratio=0.5):
"""
按照指定的步长和重叠率切分数据。
"""
overlap = int(window_step * overlap_ratio)
samples = []
labels = []
for i in range(len(data)):
label = i
for j in range(0, len(data[i]) - window_step + 1, overlap):
samples.append(data[i][j:j + window_step])
labels.append(label)
return samples, labels
def normalize(self, data):
"""
对数据进行归一化处理。
"""
normalized_data = [(sample - sample.mean()) / sample.std() for sample in data]
return normalized_data
def make_datasets(self, data_file_csv, split_rate=[0.7, 0.2, 0.1]):
"""
制作训练集、验证集和测试集,并保存数据。
"""
data = pd.read_csv(data_file_csv).values.T # 转置以按列处理
samples, labels = self.split_data_with_overlap(data, window_step=512, overlap_ratio=0.5)
normalized_samples = self.normalize(samples)
# 将标签转换为numpy数组
labels = np.array(labels)
train_set, val_test_set, train_labels, val_test_labels = train_test_split(
normalized_samples, labels, test_size=1 - split_rate[0], random_state=42, stratify=labels)
val_set, test_set, val_labels, test_labels = train_test_split(
val_test_set, val_test_labels, test_size=split_rate[2] / (split_rate[1] + split_rate[2]),
random_state=42, stratify=val_test_labels)
return train_set, val_set, test_set, train_labels, val_labels, test_labels
三、模型搭建
案例中使用的是pytorch+CUDA。二者的具体配置方法请读者自行查阅。
CNN卷积神经网络定义搭建
# 定义CNN-1D分类模型
class CNN1DModel(nn.Module):
def __init__(self, conv_archs, num_classes, input_channels=1):
super(CNN1DModel, self).__init__()
self.conv_arch = conv_archs # 网络结构
self.input_channels = input_channels # 输入通道数
self.features = self.make_layers()
self.classifier = nn.Sequential(
nn.Linear(128 * 64, 500), # 根据实际输出调整线性层输入大小
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(500, num_classes)
)
def make_layers(self):
layers = []
for num_convs, out_channels in self.conv_arch:
for _ in range(num_convs):
layers.append(nn.Conv1d(self.input_channels, out_channels, kernel_size=3, padding=1))
layers.append(nn.ReLU(inplace=True))
self.input_channels = out_channels
layers.append(nn.MaxPool1d(kernel_size=2, stride=2))
return nn.Sequential(*layers)
def forward(self, input_seq):
features = self.features(input_seq)
flat_tensor = features