PyTorch使用一维卷积对时间序列数据分类

简介: PyTorch使用一维卷积对时间序列数据分类
数据展示

时间序列数据也就是自变量是时间的一维数据,平时接触到的y= x, y = sinx等都是可以认为是时间序列数据。本次实验使用的是波形数据,可以认为不同形态的反射波形代表不同的类别。以下分别是两种类别的数据集,和四种类别的数据集,同一种颜色代表同一种类别。

模型搭建

采用PyTorch搭建网络模型,两层卷积层,卷积核大小为64,32。模型结构如下

由于pytorch的网络模型画网络结构不像tensorflow那么方便,需要转化为onnx模型,在用netron画出来,参考后面的源码。

源码

网络模型

import torch
import torch.nn as nn
from torch.utils.data import Dataset
class CNNnet(nn.Module):
    def __init__(self, *, inputLength = 80, kernelSize = 3, kindsOutput = 4):
        super().__init__()
        filterNum1 = 64
        filterNum2 = 32 
        self.layer1 = nn.Sequential(
            nn.Conv1d(1, filterNum1, kernelSize), # inputLength - kernelSize + 1 = 80 - 3 + 1 = 78
            nn.BatchNorm1d(filterNum1),
            nn.ReLU(inplace=True),
            nn.MaxPool1d(kernelSize, stride = 1) # 78 - 3 + 1 = 76
        )
        self.layer2 = nn.Sequential(
            nn.Conv1d(filterNum1, filterNum2, kernelSize), # 76 - 3 + 1 = 74
            nn.BatchNorm1d(filterNum2),
            nn.ReLU(inplace=True),
            nn.MaxPool1d(kernelSize, stride = 1) # 74 - 3 + 1 = 72
        )
        self.dropout = nn.Dropout(0.2)
        self.fc = nn.Linear(filterNum2 * (inputLength - 8), kindsOutput)
    def forward(self,x):
        x = x.to(torch.float32)
        x = self.layer1(x)
        x = self.layer2(x)
        x = x.view(x.size(0), -1)
        x = self.fc(x)
        x = self.dropout(x)
        return x
 class DatasetOfDiv(Dataset):
    def __init__(self, data_features, data_target):
        self.len = len(data_features)
        self.features = torch.from_numpy(data_features)
        self.target = torch.from_numpy(data_target)
    def __getitem__(self, index):
        return self.features[index], self.target[index]
    def __len__(self):
        return self.len

请注意,这里的DatasetOfDiv是需要为自己的数据集,继承Dataset这个类来实现。

模型训练

def train(trainData, trainLabel, *, savePath='..\models\pytorch', modelName = 'model.pt', epochs = 100, batchSize = 4, classNum = 4):
    trainFeatures, trainTarget, testFeatures, testTarget = datasetSplit(trainData, trainLabel)
    print('trainFeatures shape:', trainFeatures.shape, '\ttestFeatures shape:', testFeatures.shape)
    trainSet = DatasetOfDiv(trainFeatures, trainTarget)
    trainLoader = DataLoader(dataset=trainSet, batch_size=batchSize, shuffle=True, drop_last=True)
    model = CNNnet(inputLength=trainFeatures.shape[1], kindsOutput = classNum)
    # criterion = nn.MSELoss()
    criterion = nn.CrossEntropyLoss()
    optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
    model.train()
    start_time = time.time()
    for epoch in range(epochs):
        for seq, y_train in trainLoader:
            # 每次更新参数前都梯度归零和初始化
            # sampleSize = seq.shape[0]
            optimizer.zero_grad()
            # 注意这里要对样本进行reshape,转换成conv1d的(batch size, channel, series length)
            # y_pred = model(seq.reshape(sampleSize, 1, -1))
            y_pred = model(seq.reshape(batchSize, 1, -1))
            y_train = y_train.long()
            loss = criterion(y_pred, y_train)
            loss.backward()
            optimizer.step()
        # compute test accuracy
        _y_pred = model(torch.from_numpy(testFeatures).reshape(testFeatures.shape[0], 1, -1)) 
        y_pred = torch.max(_y_pred, 1)[1]
        numCorrect = (y_pred.data.numpy() == testTarget).astype(int).sum()
        numOfTestSample = testTarget.size
        accuracy = float(numCorrect)/numOfTestSample
        print(f'Epoch: \t{epoch+1} \t Accuracy: {accuracy:.2f} \t Loss: {loss.item():.5f} \
                \t NumOfTestSample:{numOfTestSample} \t numOfPredictCorrect:{numCorrect}'.replace(" ",""))
    print(f'\nDuration: {time.time() - start_time:.0f} seconds')
    # torch.save(model.state_dict(), savePath + '\\' + modelName)
    # torch.save(model, savePath + '\\' + modelName)
    torch.onnx.export(
        model,
        torch.randn(5, 1, trainFeatures.shape[1]),
        savePath + '\\' + 'model.onnx',
        export_params=True,
        # opset_version=8,
    )
    return model

模型测试

def testModelEval(self, modelPath, trainData, trainLabel, *, classNum = 4):
    model = CNNnet(inputLength = trainData.shape[1], kindsOutput = classNum)
    model.load_state_dict(torch.load(modelPath))
    model.eval()
    testData = trainData
    _eval_result = model(torch.from_numpy(testData).reshape(testData.shape[0], 1, -1))
    eval_result = torch.max(_eval_result, 1)[1]
    result = eval_result.data.numpy()
    predErrNum =  result.size - result[trainLabel==result].size
    print('sum:', result.size, '\tpredErrNum:', predErrNum)

使用演示

def main():
    filePath = '\your\data\path'
    trainData, trainLabel = getYourData(filePath) #getYourData是你自己的数据解析函数
    train(trainData,trainLabel)
    ...
if __name__ == '__main__':
    main()

enjoy~

有疑问评论区交流

参考文档

[深度应用]·使用一维卷积神经网络处理时间序列数据

CNN实现时间序列预测(PyTorch版)

积神经网络处理时间序列数据

PyTorch搭建CNN实现时间序列预测(风速预测)

相关文章
|
7月前
|
存储 PyTorch 算法框架/工具
PyTorch 中的 Tensor:属性、数据生成和基本操作
PyTorch 中的 Tensor:属性、数据生成和基本操作
223 0
|
7月前
|
机器学习/深度学习 编解码 PyTorch
Pytorch实现手写数字识别 | MNIST数据集(CNN卷积神经网络)
Pytorch实现手写数字识别 | MNIST数据集(CNN卷积神经网络)
|
3月前
|
数据挖掘 PyTorch TensorFlow
|
7月前
|
机器学习/深度学习 数据采集 PyTorch
pytorch中的数据索引
pytorch中的数据索引
59 0
|
3月前
|
机器学习/深度学习 数据挖掘 TensorFlow
从数据小白到AI专家:Python数据分析与TensorFlow/PyTorch深度学习的蜕变之路
【9月更文挑战第10天】从数据新手成长为AI专家,需先掌握Python基础语法,并学会使用NumPy和Pandas进行数据分析。接着,通过Matplotlib和Seaborn实现数据可视化,最后利用TensorFlow或PyTorch探索深度学习。这一过程涉及从数据清洗、可视化到构建神经网络的多个步骤,每一步都需不断实践与学习。借助Python的强大功能及各类库的支持,你能逐步解锁数据的深层价值。
70 0
|
5月前
|
数据挖掘 PyTorch TensorFlow
Python数据分析新纪元:TensorFlow与PyTorch双剑合璧,深度挖掘数据价值
【7月更文挑战第30天】随着大数据时代的发展,数据分析变得至关重要,深度学习作为其前沿技术,正推动数据分析进入新阶段。本文介绍如何结合使用TensorFlow和PyTorch两大深度学习框架,最大化数据价值。
114 8
|
5月前
|
机器学习/深度学习 数据挖掘 TensorFlow
|
5月前
|
机器学习/深度学习 数据采集 PyTorch
使用 PyTorch 创建的多步时间序列预测的 Encoder-Decoder 模型
本文提供了一个用于解决 Kaggle 时间序列预测任务的 encoder-decoder 模型,并介绍了获得前 10% 结果所涉及的步骤。
77 0
|
5月前
|
机器学习/深度学习 PyTorch TensorFlow
在深度学习中,数据增强是一种常用的技术,用于通过增加训练数据的多样性来提高模型的泛化能力。`albumentations`是一个强大的Python库,用于图像增强,支持多种图像变换操作,并且可以与深度学习框架(如PyTorch、TensorFlow等)无缝集成。
在深度学习中,数据增强是一种常用的技术,用于通过增加训练数据的多样性来提高模型的泛化能力。`albumentations`是一个强大的Python库,用于图像增强,支持多种图像变换操作,并且可以与深度学习框架(如PyTorch、TensorFlow等)无缝集成。
|
6月前
|
机器学习/深度学习 算法 PyTorch
【从零开始学习深度学习】50.Pytorch_NLP项目实战:卷积神经网络textCNN在文本情感分类的运用
【从零开始学习深度学习】50.Pytorch_NLP项目实战:卷积神经网络textCNN在文本情感分类的运用