比较pytorch与keras训练模型的不同并且在Pytorch中使用一维卷积神经网络对一维连续数据分类

本文探讨了PyTorch与Keras训练模型的区别,特别是在一维卷积神经网络(CNN)对一维连续数据分类任务中的应用。作者在PyTorch中实现了一维CNN,处理电机故障检测的九分类问题,分享了在数据处理、模型构建和训练过程中的经验,包括通道维度的调整、数据打乱的重要性以及训练曲线的绘制。文章强调了PyTorch在灵活性和自定义方面的优势。

        卷积神经网络对于周期性的一维信号分类效果是比较好的,本人做电机故障检测,需要对不同故障的轴承振动信号进行分类。

之前都是用keras搭建神经网络,确实很方便,使用fit()函数训练模型确实很省事。但是fit()函数不太灵活,如果想对网络中间层输出特征操作的话好像是不行的(博主也是初学者,如果有大佬知道keras或者tensorflow如何对中间输出特征操作的话还望不吝赐教)。所有,最近看了一下pytorch,并用pytorch搭建了一维卷积神经网络对凯斯西储大学数据集进行分类。在过程中也踩了一些雷,在这边也分享出来。

我选择的数据为空载工况下,外圈故障、内圈故障、滚动体故障三种故障类型,每种故障类型有三个故障深度,所以模型要处理一个9分类任务。下图是我用的数据集。

首先说我踩得第一个坑

在keras中通道数排在最后,比如通过数据预处理程序之后我得到的训练数据和标签形状为(5400,1024),(5400,9),训练数据中5400是样本数,1024是单个样本长度,训练标签中的9是九分类的独热编码。

        在keras中需要插入一个通道维度,并且通道维度在最后,也就是我上图这个样子。但是在pytorch中,通道数所在的位置在批维度之后。比如(32,1,1024)为(一批样本数,通道数,数据长度)。所以要正确插入通道维度。

        此外,在pytorch中输入数据要转化成张量形式,在keras中就不需要这个操作,fit会自动处理。方法如下:       

class MyDataset(Dataset):
    def __init__(self, X, Y):
        self.data_x = torch.FloatTensor(X, ).unsqueeze(dim=1)
        self.data_y = torch.FloatTensor(Y, )
        self.len = X.shape[0]
        pass

    def __getitem__(self, index):
        return self.data_x[index],self.data_y[
使用PyTorch实现一维卷积神经网络进行分类可参考以下相关内容: - 有博主使用PyTorch搭建了一维卷积神经网络对凯斯西储大学数据集进行分类,该博主此前使用Keras搭建神经网络,认为Keras的`fit()`函数虽方便但不够灵活,难以对网络中间层输出特征操作,因此转向使用PyTorch [^1]。 - 一篇文章详细记录了使用PyTorch框架结合一维卷积神经网络(1D CNN)对一维信号进行分类的全流程,内容涵盖数据形式、数据加载、数据集构建、模型训练和测试、混淆矩阵可视化、模型导出、模型参数可视化、onnx推理等步骤 [^2]。 此外,还可参考复现了所有一维卷积神经网络经典模型的链接:https://github.com/StChenHaoGitHub/1D - deeplearning - model - pytorch.git [^4]。 以下是一个简单的使用PyTorch实现一维卷积神经网络进行分类的示例代码: ```python import torch import torch.nn as nn import torch.optim as optim # 定义一维卷积神经网络模型 class OneDCNN(nn.Module): def __init__(self, input_channels, num_classes): super(OneDCNN, self).__init__() self.conv1 = nn.Conv1d(input_channels, 16, kernel_size=3, stride=1, padding=1) self.relu = nn.ReLU() self.pool = nn.MaxPool1d(kernel_size=2, stride=2) self.fc1 = nn.Linear(16 * (input_channels // 2), num_classes) def forward(self, x): x = self.conv1(x) x = self.relu(x) x = self.pool(x) x = x.view(-1, 16 * (x.size(2))) x = self.fc1(x) return x # 示例数据 input_channels = 1 num_classes = 2 batch_size = 10 sequence_length = 100 x = torch.randn(batch_size, input_channels, sequence_length) y = torch.randint(0, num_classes, (batch_size,)) # 初始化模型、损失函数和优化器 model = OneDCNN(input_channels, num_classes) criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 训练模型 num_epochs = 10 for epoch in range(num_epochs): optimizer.zero_grad() outputs = model(x) loss = criterion(outputs, y) loss.backward() optimizer.step() print(f'Epoch {epoch + 1}/{num_epochs}, Loss: {loss.item()}') ```
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值