【时间序列预测】基于Pytorch实现CNN_LSTM算法

文章目录

  • [1. CNN_LSTM模型概述](#1. CNN_LSTM模型概述)
  • [2. 网络结构](#2. 网络结构)
  • [3. 完整代码实现](#3. 完整代码实现)
  • 4.模型解析
    • [4.1 CNN层](#4.1 CNN层)
    • [4.2 ReLU层](#4.2 ReLU层)
    • [4.3 MaxPooling层](#4.3 MaxPooling层)
    • [4.4 LSTM层](#4.4 LSTM层)
    • [4.5 输出层](#4.5 输出层)
    • [4.6 前向传播](#4.6 前向传播)
  • [5. 总结](#5. 总结)

在时间序列预测任务中,CNN(卷积神经网络)和LSTM(长短期记忆网络)是两种非常有效的神经网络架构。CNN擅长从数据中提取局部特征,而LSTM能够捕捉长期的依赖关系。将这两种模型结合使用,能够更好地处理具有时序性和局部特征的复杂数据。本文将详细介绍如何使用Pytorch实现一个基于CNN和LSTM的混合模型(CNN_LSTM)

1. CNN_LSTM模型概述

在时间序列预测任务中,传统的机器学习方法如ARIMA、SVR等虽然有一定效果,但它们对于复杂数据的建模能力有限。近年来,深度学习方法在时序数据分析中取得了显著的进展。

  • CNN: 卷积神经网络能够有效地从数据中提取局部的空间特征,特别是在处理具有局部依赖关系的时序数据时,CNN能够通过卷积操作捕捉局部时间窗口内的重要模式。
  • LSTM: 长短期记忆网络能够捕捉数据中的长期依赖关系,适用于需要记忆历史状态的时序任务。LSTM通过特殊的门控机制解决了传统RNN(递归神经网络)中梯度消失或梯度爆炸的问题,能够有效地处理长序列数据。

2. 网络结构

我们的目标是通过结合CNN和LSTM来创建一个混合网络架构,具体步骤如下:

  • CNN层:首先,我们通过卷积层提取输入时间序列的局部特征。卷积层能够帮助模型捕捉局部时间序列模式。
  • LSTM层:然后,将CNN提取到的特征输入到LSTM网络中。LSTM能够通过其记忆能力学习时间序列中的长期依赖关系。
  • 输出层:最后,LSTM的输出会通过一个全连接层得到最终的预测结果。

3. 完整代码实现

python 复制代码
"""
CNN_LSTM Network
"""
from torch import nn

class CNN_LSTM(nn.Module):
    """CNN_LSTM
    Args:
        cnn_in_channels : CNN输入通道数, if in.shape=[64,7,18] value=7
        bilstm_input_size : lstm输入大小, if in.shape=[64,7,18] value=18
        output_size :  期望网络输出大小
        cnn_out_channels:  CNN层输出通道数
        cnn_kernal_size :  CNN层卷积核大小
        maxpool_kernal_size:  MaxPool Layer kernal_size
        lstm_hidden_size: BiLSTM Layer hidden_dim
        lstm_num_layers: BiLSTM Layer num_layers
        dropout:  dropout防止过拟合, 取值(0,1)
        lstm_proj_size: BiLSTM Layer proj_size
    
    Example:
        >>> import torch
        >>> input = torch.randn([64,7,18])
        >>> model = CNN_LSTM(7, 18,18)
        >>> out = model(input)
    """
    def __init__(self,
            cnn_in_channels,
            lstm_input_size,
            output_size,
            cnn_out_channels=32,
            cnn_kernal_size=3,
            maxpool_kernal_size=3,
            lstm_hidden_size=128,
            lstm_num_layers=4,
            dropout = 0.05,
            lstm_proj_size=0
        ):
        super().__init__()
        
        # CNN Layer
        self.conv1d = nn.Conv1d(in_channels=cnn_in_channels, out_channels=cnn_out_channels, kernel_size=cnn_kernal_size, padding="same")
        self.relu = nn.ReLU()
        self.maxpool = nn.MaxPool1d(kernel_size= maxpool_kernal_size)
        
        # LSTM Layer
        self.lstm = nn.LSTM(
            input_size = int(lstm_input_size/maxpool_kernal_size),
            hidden_size = lstm_hidden_size,
            num_layers = lstm_num_layers,
            batch_first = True,
            dropout = dropout,
            proj_size = lstm_proj_size
        )
        
        # output Layer
        self.fc = nn.Linear(lstm_hidden_size,output_size)
    
    def forward(self, x):
        x = self.conv1d(x)
        x = self.relu(x)
        x = self.maxpool(x)
        lstm_out,_ = self.lstm(x)
        x = self.fc(lstm_out[:, -1, :])
        return x

4.模型解析

4.1 CNN层

python 复制代码
self.conv1d = nn.Conv1d(in_channels=cnn_in_channels, out_channels=cnn_out_channels, kernel_size=cnn_kernal_size, padding="same")
  • in_channels: Conv1d 输入通道数
  • out_channels: Conv1d 输出通道数
  • kernel_size: 卷积核大小
  • padding: "same"表示卷积后输出大小与卷积操作前大小一致

4.2 ReLU层

python 复制代码
self.relu = nn.ReLU()
  • ReLU(Rectified Linear Unit) 是常用的激活函数,能够增加网络的非线性,帮助模型学习复杂的模式。

4.3 MaxPooling层

python 复制代码
self.maxpool = nn.MaxPool1d(kernel_size= maxpool_kernal_size)
  • MaxPooling 用于减少数据的维度,同时保持重要特征。通过在局部区域内选择最大值,它能够突出最重要的特征。

4.4 LSTM层

python 复制代码
self.lstm = nn.LSTM(
            input_size = int(lstm_input_size/maxpool_kernal_size),
            hidden_size = lstm_hidden_size,
            num_layers = lstm_num_layers,
            batch_first = True,
            dropout = dropout,
            proj_size = lstm_proj_size)
  • input_size: LSTM层输入的特征数量
  • hidden_size :LSTM隐藏层维度
  • num_layers :LSTM叠加层数
  • batch_first:True 表示输入数据格式为[batch_size, seq_len, features_dim]
  • dropout : 防止过拟合

4.5 输出层

python 复制代码
self.fc = nn.Linear(lstm_hidden_size, output_size)
  • 全连接层(Linear) 用于将LSTM的最后一层输出映射到最终的预测结果。lstm_hidden_size 是LSTM输出的特征数量,output_size 是模型的最终输出尺寸(例如,预测值的维度)

4.6 前向传播

python 复制代码
def forward(self, x):
     x = self.conv1d(x)
     x = self.relu(x)
     x = self.maxpool(x)
     lstm_out,_ = self.lstm(x)
     x = self.fc(lstm_out[:, -1, :])
     return x
  • 首先经过卷积层进行特征提取
  • 然后将数据输入LSTM层
  • 最后,从LSTM的输出中选择最后一个时间步的输出(lstm_out[:, -1, :]),并通过全连接层进行预测。

5. 总结

本文展示了如何利用Pytorch实现一个结合CNN和LSTM的网络架构,用于时间序列预测任务。CNN层负责提取局部特征,LSTM层则捕捉长时间依赖关系。通过这样的混合网络结构,模型能够在处理时间序列数据时更好地捕捉数据的复杂模式,提升预测精度。

希望这篇文章对你理解CNN-LSTM模型在时间序列预测中的应用有所帮助。如果有任何问题,欢迎留言讨论。

相关推荐
董董灿是个攻城狮42 分钟前
5分钟搞懂什么是窗口注意力?
算法
Dann Hiroaki1 小时前
笔记分享: 哈尔滨工业大学CS31002编译原理——02. 语法分析
笔记·算法
九年义务漏网鲨鱼1 小时前
【大模型学习 | MINIGPT-4原理】
人工智能·深度学习·学习·语言模型·多模态
元宇宙时间1 小时前
Playfun即将开启大型Web3线上活动,打造沉浸式GameFi体验生态
人工智能·去中心化·区块链
开发者工具分享1 小时前
文本音频违规识别工具排行榜(12选)
人工智能·音视频
产品经理独孤虾2 小时前
人工智能大模型如何助力电商产品经理打造高效的商品工业属性画像
人工智能·机器学习·ai·大模型·产品经理·商品画像·商品工业属性
老任与码2 小时前
Spring AI Alibaba(1)——基本使用
java·人工智能·后端·springaialibaba
蹦蹦跳跳真可爱5892 小时前
Python----OpenCV(图像増强——高通滤波(索贝尔算子、沙尔算子、拉普拉斯算子),图像浮雕与特效处理)
人工智能·python·opencv·计算机视觉
nananaij2 小时前
【Python进阶篇 面向对象程序设计(3) 继承】
开发语言·python·神经网络·pycharm
雷羿 LexChien2 小时前
从 Prompt 管理到人格稳定:探索 Cursor AI 编辑器如何赋能 Prompt 工程与人格风格设计(上)
人工智能·python·llm·编辑器·prompt