当前位置: 首页 > article >正文

【时间序列预测】基于PyTorch实现CNN_BiLSTM算法

文章目录

  • 1. CNN与BiLSTM
  • 2. 完整代码实现
  • 3. 代码结构解读
    • 3.1 CNN Layer
    • 3.2 BiLSTM Layer
    • 3.3 Output Layer
    • 3.4 forward Layer
  • 4. 应用场景
  • 5. 总结

  本文将详细介绍如何使用Pytorch实现一个结合卷积神经网络(CNN)双向长短期记忆网络(BiLSTM)的混合模型—CNN_BiLSTM。这种网络架构结合了CNN在提取局部特征方面的优势和BiLSTM在建模序列数据时的长期依赖关系的能力,特别适用于时序数据的预测任务,如时间序列分析、风速预测、股票预测等。

1. CNN与BiLSTM

  • CNN主要通过卷积操作对输入数据进行特征提取,适合于处理局部结构化的特征(如图像数据、时间序列数据中的局部模式)。
  • BiLSTM则是基于LSTM的变种,它通过双向遍历序列,可以同时捕捉过去和未来的信息,使其在处理时间序列数据时非常有效。
  • 在本例中,CNN负责提取时间序列数据的局部特征,而BiLSTM则进一步捕捉数据中的时序依赖关系,最终通过全连接层输出预测结果。

2. 完整代码实现

"""
CNN_BiLSTM Network
"""
from torch import nn

class CNN_BiLSTM(nn.Module):
    r"""CNN_BiLSTM
    Args:
        cnn_in_channels : CNN输入通道数, if in.shape=[64,7,18] value=7
        bilstm_input_size : bilstm输入大小, 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
        bilstm_hidden_size: BiLSTM Layer hidden_dim
        bilstm_num_layers: BiLSTM Layer num_layers
        dropout:  dropout防止过拟合, 取值(0,1)
        bilstm_proj_size: BiLSTM Layer proj_size
    
    Example:
        >>> import torch
        >>> input = torch.randn([64,7,18])
        >>> model = CNN_BiLSTM(7, 18,18)
        >>> out = model(input)
    """
    def __init__(self,
            cnn_in_channels,
            bilstm_input_size,
            output_size,
            
            cnn_out_channels=32,
            cnn_kernal_size=3,
            maxpool_kernal_size=3,
            bilstm_hidden_size=128,
            bilstm_num_layers=4,
            dropout = 0.05,
            bilstm_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)
        
        # BiLSTM Layer
        self.bilstm = nn.LSTM(
            input_size = int(bilstm_input_size/maxpool_kernal_size),
            hidden_size = bilstm_hidden_size,
            num_layers = bilstm_num_layers,
            batch_first = True,
            dropout = dropout,
            bidirectional = True,
            proj_size = bilstm_proj_size
        )
        
        # output Layer
        self.fc = nn.Linear(bilstm_hidden_size*2,output_size)
    
    def forward(self, x):
        x = self.conv1d(x)
        x = self.relu(x)
        x = self.maxpool(x)
        bilstm_out,_ = self.bilstm(x)
        x = self.fc(bilstm_out[:, -1, :])
        return x      

3. 代码结构解读

3.1 CNN Layer

卷积层(Conv1d)用于提取局部特征,通常用于处理时间序列数据中的局部模式。它的输入是具有多个特征(例如风速、气压、湿度等)的时序数据。

相关代码:

# 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)
  • cnn_in_channels : 表示输入通道数
  • cnn_out_channels : 表示卷积层的输出通道数
  • cnn_kernal_size : 为卷积核大小
  • padding : "same"表示特征输入大小和输出大小一致
  • maxpool_kernal_size : 为池化操作的核大小

3.2 BiLSTM Layer

双向长短期记忆网络(BiLSTM)用于捕捉时序数据中的长程依赖关系。

相关代码:

# BiLSTM Layer
self.bilstm = nn.LSTM(
    input_size = int(bilstm_input_size/maxpool_kernal_size),
    hidden_size = bilstm_hidden_size,
    num_layers = bilstm_num_layers,
    batch_first = True,
    dropout = dropout,
    bidirectional = True,
    proj_size = bilstm_proj_size
)
  • bilstm_input_size : 表示输入的特征维度
  • bilstm_hidden_size : 表示LSTM隐藏状态的维度
  • bilstm_num_layers : 是LSTM的层数
  • dropout : 用于防止过拟合
  • bilstm_proj_size : 是LSTM的投影层大小(如果需要)

3.3 Output Layer

全连接层(fc)将BiLSTM的输出映射到最终的预测结果。输出的维度为output_size,通常是我们需要预测的目标维度(例如未来的功率值)。

相关代码:

# output Layer
self.fc = nn.Linear(bilstm_hidden_size*2, output_size)

output_size : 输出维度大小

3.4 forward Layer

相关代码:

def forward(self, x):
     x = self.conv1d(x)
     x = self.relu(x)
     x = self.maxpool(x)
     bilstm_out,_ = self.bilstm(x)
     x = self.fc(bilstm_out[:, -1, :])
     return x      
  • 输入: 是一个三维张量,形状为 [batch_size, input_channels, seq_len],其中input_channels是输入数据的特征数(例如风速、湿度等),seq_len是时间步数(即输入序列的长度)。
  • CNN部分:首先通过卷积层提取局部特征,然后应用ReLU激活函数引入非线性,最后通过最大池化(MaxPool1d)对特征进行降维,减少计算量。
  • BiLSTM部分: 接着,将经过CNN处理后的特征传递给BiLSTM,捕捉时间序列中的长期依赖关系。BiLSTM的双向性使得模型能够同时考虑过去和未来的上下文信息。
  • 输出: 最终,模型通过全连接层(fc)将BiLSTM的最后一个时间步的输出映射为期望的输出大小。

4. 应用场景

  这个模型适合用于处理时间序列数据的预测任务,特别是在风力发电预测、气象预测、股市预测等领域。CNN用于从输入数据中提取局部特征,而BiLSTM则能够捕捉输入数据的长期时序依赖关系。因此,模型既能有效地处理局部特征,又能关注到长时间范围内的依赖关系,从而提高预测的准确性。

5. 总结

  本文详细介绍了如何使用Pytorch实现一个基于CNN和BiLSTM的混合模型(CNN_BiLSTM)。该模型结合了CNN在局部特征提取上的优势和BiLSTM在序列建模上的长程依赖能力,适用于时序数据的预测任务。在实际应用中,可以根据任务的不同调整CNN和LSTM的层数、通道数和隐藏状态维度等超参数,以提高模型的预测精度。


http://www.kler.cn/a/430057.html

相关文章:

  • SQL中的公用表表达式
  • ORB-SALM3配置流程及问题记录
  • 远程和本地文件的互相同步
  • “**H5**” 和 “**响应式**” 是前端开发中常见的术语,但它们的概念和使用场景有所不同
  • 系统思考与因果智慧
  • 基于springboot的网上商城购物系统
  • 【NextJS】Arco Design与Next.js快速上手
  • PDF提取文本
  • 微知-如何根据git reflog恢复到操作之前的状态?(git reflog; git reset --hard xxx)
  • NAT traversal 原理 | TCP / UDP/ P2P
  • 大数据笔记之flink集群的安装部署
  • 微信小程序中使用miniprogram-sm-crypto实现SM4加密攻略
  • OpenSSH和OpenSSL升级
  • 博物馆导览系统方案(一)背景需求分析与核心技术实现
  • 《Vue零基础入门教程》第二十二课:具名插槽
  • 【C++】STL --- 哈希
  • kubesphere搭建 postgres15
  • 【C++算法】35.位运算_两整数之和
  • ViT学习笔记(二) Patch+Position Embedding阶段的详细推演与理解
  • 利用机器学习技术进行区块链交易趋势预测的研究【代码实战】
  • Vue Web开发(二)
  • 学习笔记064——如何手动将jar包导入到maven本地库
  • SpringBoot+Resilience4j实现接口限流
  • 5G CPE终端功能及性能评测(四)
  • CSS核心(上)
  • 力扣第96题 不同的二叉搜索树