基于简单CNN的西楚数据集智能诊断

仅作为初学者入门的示范案例,其中,模型权重保存、加载、测试、可视化等代码略。

import

import torch
import numpy as np
import torch.nn as nn
import scipy.io as sio
from torch.utils.data import Dataset, DataLoader
from sklearn.preprocessing import maxabs_scale

数据集构建

class CWRU_DATA(Dataset):
    def __init__(self, data_num=100, data_len=1024):  # not overlapped
        self.data, self.label = self.prepare_data(num=data_num, length=data_len)  # (4, 100, 1024)

    def __len__(self):
        return len(self.label)

    def data_preprocess(self, x):
        x = x.astype(np.float32)  # shape: (N,)
        x = maxabs_scale(x)
        return x

    def prepare_data(self, num, length):
        NC = r"G:\dataset\casedata_12khz\normal\normal_0_X097.mat"
        IF = r"G:\dataset\casedata_12khz\inner\inner_007\inner007_0_105.mat"
        OF = r"G:\dataset\casedata_12khz\outer\outer_007\outer007_0.mat"
        BF = r"G:\dataset\casedata_12khz\ball\ball_007\ball007_0.mat"
        paths = [NC, IF, OF, BF]
        data = np.zeros([4, num, length], dtype=np.float32)
        for i in range(len(data)):
            data[i] = self.load_mat_data(paths[i], item_name='DE_time',
                                         num_points=num * length).reshape([num, length])
        label = np.arange(len(paths)).reshape([len(paths), 1])
        label = np.tile(label, (1, num))  # (4, num)

        return data.reshape(-1, length), label.reshape(-1)

    def load_mat_data(self, path, item_name='DE_time', num_points=1024 * 100):
        # get data from .mat file
        mat_data = sio.loadmat(path)  # a dictionary
        name_new = []
        for n in list(mat_data.keys()):
            if item_name in n:
                name_new.append(n)
        data = mat_data[name_new[0]]
        # TODO: you can save these data in another format, such as .npy, .csv, .txt
        return data[:num_points]

    def __getitem__(self, item):
        data, label = self.data[item], self.label[item]  # (1024, ), (1, )
        data = self.data_preprocess(data)
        return data, label

Dataloader创建

def build_dataloader(dataset, shuffle, batch_size=32):
    return DataLoader(dataset, batch_size, shuffle=shuffle)

Model 构建

def conv_block(in_channels, out_channels):
    return nn.Sequential(
        nn.Conv1d(in_channels, out_channels, kernel_size=3, padding=1),
        nn.BatchNorm1d(out_channels),
        nn.ReLU(),
        nn.MaxPool1d(kernel_size=2),
    )


class SimpleCNN(nn.Module):
    def __init__(self, in_chn=1, hidden_chn=64, block_num=4, sample_len=1024, classes=4):
        super().__init__()
        conv1 = conv_block(in_chn, hidden_chn)
        conv1_more = [conv_block(hidden_chn, hidden_chn) for _ in range(block_num - 1)]
        self.features = nn.Sequential(conv1, *conv1_more)  # (None, 64, 1024/2^4)
        flatten_size = int(sample_len / (2 ** block_num) * hidden_chn)
        self.classifier = nn.Sequential(nn.Flatten(), nn.Linear(flatten_size, classes))

    def forward(self, x):
        feat = self.features(x)
        out = self.classifier(feat)
        return out

训练

if __name__ == "__main__":

    dataset = CWRU_DATA()
    dataloader = build_dataloader(dataset, shuffle=True, batch_size=32)

    model = SimpleCNN()
    optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
    criterion = nn.CrossEntropyLoss(reduction='mean')
    # This criterion combines torch.nn.LogSoftmax and torch.nn.NLLLoss in one single class

    for i, batch in enumerate(dataloader):
        data, label = batch
        data, label = data.float().unsqueeze(1), label.long()
        predict_label = model(data)
        loss = criterion(predict_label, label)

        loss.backward()
        optimizer.step()
        optimizer.zero_grad()

        print(loss.detach().item())
  • 24
    点赞
  • 126
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
处理凯斯西楚大学数据集需要一些准备工作,包括安装必要的Python库和准备数据集。 首先,你需要安装以下Python库: - pandas:用于数据处理和分析 - numpy:用于数据科学计算 - matplotlib:用于数据可视化 你可以使用以下命令在终端或命令提示符中安装这些库: ``` pip install pandas numpy matplotlib ``` 接下来,你需要准备数据集。你可以从凯斯西楚大学的官方网站下载数据集,也可以使用以下命令从Kaggle下载: ``` !kaggle datasets download -d uciml/student-alcohol-consumption ``` 下载完成后,你需要解压缩文件,并将csv文件放在当前工作目录中。 接下来,你可以使用以下代码来读取并处理数据: ```python import pandas as pd # 读取数据集 df = pd.read_csv("student-alcohol-consumption.csv") # 查看数据集前五行 print(df.head()) # 统计每个性别的人数 print(df["sex"].value_counts()) # 统计每个性别在所有年级中的平均成绩 print(df.groupby("sex")["G1", "G2", "G3"].mean()) # 绘制每个性别在所有年级中的平均成绩条形图 df.groupby("sex")["G1", "G2", "G3"].mean().plot(kind="bar") ``` 以上代码将读取数据集,展示前五行数据,统计每个性别的人数,计算每个性别在所有年级中的平均成绩,并绘制每个性别在所有年级中的平均成绩条形图。 你可以根据自己的需求进行数据处理和分析,使用Python的数据处理和科学计算库进行数据操作和可视化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值