【时间序列预测】基于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模型在时间序列预测中的应用有所帮助。如果有任何问题,欢迎留言讨论。

相关推荐
程序员NEO6 分钟前
精控Spring AI日志
人工智能·后端
伪_装8 分钟前
上下文工程指南
人工智能·prompt·agent·n8n
站大爷IP10 分钟前
Python办公自动化实战:手把手教你打造智能邮件发送工具
python
chao_78925 分钟前
回溯题解——子集【LeetCode】二进制枚举法
开发语言·数据结构·python·算法·leetcode
普通程序员37 分钟前
Gemini CLI 新手安装与使用指南
前端·人工智能·后端
视觉语言导航38 分钟前
ICCV-2025 | 复杂场景的精准可控生成新突破!基于场景图的可控 3D 户外场景生成
人工智能·深度学习·具身智能
十盒半价39 分钟前
从递归到动态规划:手把手教你玩转算法三剑客
javascript·算法·trae
whaosoft-1431 小时前
51c自动驾驶~合集6
人工智能
GEEK零零七1 小时前
Leetcode 1070. 产品销售分析 III
sql·算法·leetcode
zdw1 小时前
fit parse解析佳明.fit 运动数据,模仿zwift数据展示
python