时间序列(Time-Series)exp_long_term_forecasting.py代码解析

本文介绍了一个名为Exp_Long_Term_Forecast的类,用于构建和训练深度学习模型进行长期预测任务。它包含数据预处理、模型构建、选择优化器和损失函数、训练与验证过程,以及测试和结果评估部分。文章详细展示了如何使用Adam优化器、MSELoss以及早停策略进行模型训练和性能评估。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

from data_provider.data_factory import data_provider
from exp.exp_basic import Exp_Basic
from utils.tools import EarlyStopping, adjust_learning_rate, visual
from utils.metrics import metric
import torch
import torch.nn as nn
from torch import optim
import os
import time
import warnings
import numpy as np

warnings.filterwarnings('ignore')

#长期预测类
class Exp_Long_Term_Forecast(Exp_Basic):
    #构造函数
    def __init__(self, args):
        super(Exp_Long_Term_Forecast, self).__init__(args)
    #创建模型
    def _build_model(self):
        model = self.model_dict[self.args.model].Model(self.args).float()
        #多gpu且gpu可用
        if self.args.use_multi_gpu and self.args.use_gpu:
            model = nn.DataParallel(model, device_ids=self.args.device_ids)
        return model
    #从data_provider函数获取数据集合和数据加载器,并提供标志(train,val,test)
    def _get_data(self, flag):
        data_set, data_loader = data_provider(self.args, flag)
        return data_set, data_loader
    #选择优化器,该函数使用adam优化器,从传入的参数self 添加self.args.learning_rate学习率
    def _select_optimizer(self):
        model_optim = optim.Adam(self.model.parameters(), lr=self.args.learning_rate)
        return model_optim
    #选择损失函数,MSELoss(均方误差损失)
    def _select_criterion(self):
        criterion = nn.MSELoss()
        return criterion
    #验证方法,通过计算模型验证的误差来评估模型性能,即向前传播时不根据学习率计算梯度
    def vali(self, vali_data, vali_loader, criterion):
        total_loss = []
        #设置评估模式
        self.model.eval()
        with torch.no_grad():
            for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(vali_loader):
                #将转化为浮点型的数据加载到cpu或gpu
                batch_x = batch_x.float().to(self.device)
                batch_y = batch_y.float()
                #将转化为浮点型的数据加载到cpu或gpu
                batch_x_mark = batch_x_mark.float().to(self.device)
                batch_y_mark = batch_y_mark.float().to(self.device)

                # decoder input
                #输出一个形状与输入一致的全零张量,并转化为浮点型格式
                dec_inp = torch.zeros_like(batch_y[:, -self.args.pred_len:, :]).float()
                #在给定维度对输入的张量序列进行连续操作,并加载到cpu或者gpu
                dec_inp = torch.cat([batch_y[:, :self.args.label_len, :], dec_inp], dim=1).float().to(self.device)
                # encoder - decoder
                if self.args.use_amp:
                    with torch.cuda.amp.autocast():
                        if self.args.output_attention:
                            outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0]
                        else:
                            outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)
                else:
                    if self.args.output_attention:
                        outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0]
                    else:
   

### MICN 模型概述 MICN(Multi-scale Local and Global Context Modeling for Long-term Series Forecasting)是一种专门设计用于长时间序列预测的深度学习框架[^1]。该模型通过结合多尺度特征提取以及局部和全局上下文建模的能力,显著提升了对于复杂时间序列数据的预测性能。 #### 多尺度特征提取 为了捕捉不同时间粒度下的模式变化,MICN 利用了卷积神经网络 (CNN) 的层次结构来实现多尺度特征提取。具体而言,它采用多个并行的一维卷积层,每层对应不同的感受野大小,从而能够捕获短时波动与长期趋势之间的关系。 ```python import torch.nn as nn class MultiScaleConv(nn.Module): def __init__(self, input_channels=1, output_channels=[8, 16], kernel_sizes=[3, 7]): super(MultiScaleConv, self).__init__() self.convs = nn.ModuleList([ nn.Conv1d(input_channels, out_ch, k_size, padding=k_size//2) for out_ch, k_size in zip(output_channels, kernel_sizes) ]) def forward(self, x): outputs = [conv(x) for conv in self.convs] return torch.cat(outputs, dim=1) ``` 上述代码展示了如何构建一个多尺度一维卷积模块,其中 `kernel_sizes` 参数控制着各个分支的感受野范围。 #### 局部与全局上下文建模 除了关注单一时序片段内的特性外,MICN 还引入了一种机制用来融合更广泛的背景信息——即所谓的 **global context**。这种策略允许当前时刻的状态不仅依赖于最近的历史记录,还可以受到远距离节点的影响。为此,作者采用了自注意力机制(Self-Attention Mechanism),其核心思想在于计算任意两个位置间的重要性权重,并据此调整输入表示形式。 另一方面,在处理局部区域方面,则继续沿用传统的循环单元(如GRU或LSTM),它们擅长描述连续帧间的动态演变过程。 ```python import torch from torch import Tensor from typing import Optional def scaled_dot_product_attention(query: Tensor, key: Tensor, value: Tensor, mask: Optional[Tensor]=None) -> Tuple[Tensor]: d_k = query.size(-1) scores = torch.matmul(query, key.transpose(-2,-1)) / math.sqrt(d_k) if mask is not None: scores += mask * -1e9 attention_weights = F.softmax(scores,dim=-1) weighted_sum = torch.matmul(attention_weights,value) return weighted_sum, attention_weights ``` 此函数实现了标准缩放点乘法注意机制的核心部分,它是构成整个架构中不可或缺的一个组件。 ### 总结 综上所述,MICN 提供了一个强大的解决方案,适用于那些具有高度非线性和跨时段关联性的场景分析需求。通过对多种时空维度上的交互作用进行全面刻画,最终达到了提高预报精度的目的。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值