【CWRU轴承数据分析Python实战+源代码】


前言

本文使用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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值