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

DeepGLO

在这里插入图片描述
代码:https://github.com/rajatsen91/deepglo

文章主要有三点创新:

  • Leveled-Init TCN, 对 TCN 的改进,使用 LeveledInit 方法初始化 TCN 权重,使得 TCN 更好地处理不同尺度的时间序列;
  • TCN-MF,用 TCN 来对多变量时间序列预测的矩阵分解法做正则化
  • DeepGLO,把矩阵分解法 MF 得到的 包含全局信息的因子序列及其预测值 作为局部序列预测时的协变量。

LeveledInit TCN

从如下代码中可以看出对 TCN 权值初始化部分的改动

class Chomp1d(nn.Module):
    def __init__(self, chomp_size):
        super(Chomp1d, self).__init__()
        self.chomp_size = chomp_size

    def forward(self, x):
        return x[:, :, : -self.chomp_size].contiguous()


class TemporalBlock(nn.Module):
    def __init__(
        self,
        n_inputs,
        n_outputs,
        kernel_size,
        stride,
        dilation,
        padding,
        dropout=0.1,
        init=True,
    ):
        super(TemporalBlock, self).__init__()
        self.kernel_size = kernel_size
        self.conv1 = weight_norm(
            nn.Conv1d(
                n_inputs,
                n_outputs,
                kernel_size,
                stride=stride,
                padding=padding,
                dilation=dilation,
            )
        )
        self.chomp1 = Chomp1d(padding)
        self.relu1 = nn.ReLU()
        self.dropout1 = nn.Dropout(dropout)

        self.conv2 = weight_norm(
            nn.Conv1d(
                n_outputs,
                n_outputs,
                kernel_size,
                stride=stride,
                padding=padding,
                dilation=dilation,
            )
        )
        self.chomp2 = Chomp1d(padding)
        self.relu2 = nn.ReLU()
        self.dropout2 = nn.Dropout(dropout)

        self.net = nn.Sequential(
            self.conv1,
            self.chomp1,
            self.relu1,
            self.dropout1,
            self.conv2,
            self.chomp2,
            self.relu2,
            self.dropout2,
        )
        self.downsample = (
            nn.Conv1d(n_inputs, n_outputs, 1) if n_inputs != n_outputs else None
        )
        self.init = init
        self.relu = nn.ReLU()
        self.init_weights()

    def init_weights(self):
        if self.init:
            nn.init.normal_(self.conv1.weight, std=1e-3)
            nn.init.normal_(self.conv2.weight, std=1e-3)

            self.conv1.weight[:, 0, :] += (
                1.0 / self.kernel_size
            )  ###new initialization scheme
            self.conv2.weight += 1.0 / self.kernel_size  ###new initialization scheme

            nn.init.normal_(self.conv1.bias, std=1e-6)
            nn.init.normal_(self.conv2.bias, std=1e-6)
        else:
            nn.init.xavier_uniform_(self.conv1.weight)
            nn.init.xavier_uniform_(self.conv2.weight)

        if self.downsample is not None:
            self.downsample.weight.data.normal_(0, 0.1)

    def forward(self, x):
        out = self.net(x)
        res = x if self.downsample is None else self.downsample(x)
        return self.relu(out + res)


class TemporalBlock_last(nn.Module):
    def __init__(
        self,
        n_inputs,
        n_outputs,
        kernel_size,
        stride,
        dilation,
        padding,
        dropout=0.2,
        init=True,
    ):
        super(TemporalBlock_last, self).__init__()
        self.kernel_size = kernel_size
        self.conv1 = weight_norm(
            nn.Conv1d(
                n_inputs,
                n_outputs,
                kernel_size,
                stride=stride,
                padding=padding,
                dilation=dilation,
            )
        )
        self.chomp1 = Chomp1d(padding)
        self.relu1 = nn.ReLU()
        self.dropout1 = nn.Dropout(dropout)

        self.conv2 = weight_norm(
            nn.Conv1d(
                n_outputs,
                n_outputs,
                kernel_size,
                stride=stride,
                padding=padding,
                dilation=dilation,
            )
        )
        self.chomp2 = Chomp1d(padding)
        self.relu2 = nn.ReLU()
        self.dropout2 = nn.Dropout(dropout)

        self.net = nn.Sequential(
            self.conv1,
            self.chomp1,
            self.dropout1,
            self.conv2,
            self.chomp2,
            self.dropout2,
        )
        self.downsample = (
            nn.Conv1d(n_inputs, n_outputs, 1) if n_inputs != n_outputs else None
        )
        self.init = init
        self.relu = nn.ReLU()
        self.init_weights()

    def init_weights(self):
        if self.init:
            nn.init.normal_(self.conv1.weight, std=1e-3)
            nn.init.normal_(self.conv2.weight, std=1e-3)

            self.conv1.weight[:, 0, :] += (
                1.0 / self.kernel_size
            )  ###new initialization scheme
            self.conv2.weight += 1.0 / self.kernel_size  ###new initialization scheme

            nn.init.normal_(self.conv1.bias, std=1e-6)
            nn.init.normal_(self.conv2.bias, std=1e-6)
        else:
            nn.init.xavier_uniform_(self.conv1.weight)
            nn.init.xavier_uniform_(self.conv2.weight)

        if self.downsample is not None:
            self.downsample.weight.data.normal_(0, 0.1)

    def forward(self, x):
        out = self.net(x)
        res = x if self.downsample is None else self.downsample(x)
        return out + res


class TemporalConvNet(nn.Module):
    def __init__(self, num_inputs, num_channels, kernel_size=2, dropout=0.1, init=True):
        super(TemporalConvNet, self).__init__()
        layers = []
        self.num_channels = num_channels
        self.num_inputs = num_inputs
        self.kernel_size = kernel_size
        self.dropout = dropout
        num_levels = len(num_channels)
        for i in range(num_levels):
            dilation_size = 2 ** i
            in_channels = num_inputs if i == 0 else num_channels[i - 1]
            out_channels = num_channels[i]
            if i == num_levels - 1:
                layers += [
                    TemporalBlock_last(
                        in_channels,
                        out_channels,
                        kernel_size,
                        stride=1,
                        dilation=dilation_size,
                        padding=(kernel_size - 1) * dilation_size,
                        dropout=dropout,
                        init=init,
                    )
                ]
            else:
                layers += [
                    TemporalBlock(
                        in_channels,
                        out_channels,
                        kernel_size,
                        stride=1,
                        dilation=dilation_size,
                        padding=(kernel_size - 1) * dilation_size,
                        dropout=dropout,
                        init=init,
                    )
                ]

        self.network = nn.Sequential(*layers)

    def forward(self, x):
        return self.network(x)

TCN-MF

Temporal Convolution Network regularized Matrix Factorization

本质上和动态因子图是一回事:

一方面假设原始的多变量序列 Y Y Y 是某些典型动态序列 X X X 的线性组合:
Y = F X Y = FX Y=FX
另一方面, X X X 的动态行为可以用 TCN 来建模:
X t = T X ( X t − 1 ) X_t = \mathbf{\Tau}_X(X_{t-1}) Xt=TX(Xt1)

在这里插入图片描述

相关文章:

  • 《梦断代码》上市
  • Multi-Horizon Time Series Forecasting with Temporal Attention Learning
  • 网络互联设备之区别详解
  • Quantile RNN
  • 正式开始homeR的计划
  • 非线性状态空间模型与非线性自回归模型的联系
  • matplotlib 颜色名称表
  • 分布式缓存BeIT Memcached简介
  • 【pytorch】时间序列预测 —— 同时预测多个分位点
  • 关于Oracle 顽固的KILLED 状态的SESSION的处理
  • 科技论文的写作逻辑
  • C#中字符串操作函数
  • BibTex 的使用
  • C# 运算符
  • Takens 定理
  • @jsonView过滤属性
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【刷算法】从上往下打印二叉树
  • es的写入过程
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • js继承的实现方法
  • leetcode386. Lexicographical Numbers
  • tweak 支持第三方库
  • vue.js框架原理浅析
  • 阿里云前端周刊 - 第 26 期
  • 解析带emoji和链接的聊天系统消息
  • 数据仓库的几种建模方法
  • ​一些不规范的GTID使用场景
  • #宝哥教你#查看jquery绑定的事件函数
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (8)STL算法之替换
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (南京观海微电子)——COF介绍
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)Unity3DUnity3D在android下调试
  • (转)程序员疫苗:代码注入
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转载)OpenStack Hacker养成指南
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • 、写入Shellcode到注册表上线
  • .Net 8.0 新的变化
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .net mvc部分视图
  • .Net 知识杂记
  • .NET开源项目介绍及资源推荐:数据持久层
  • [4.9福建四校联考]
  • [Angular 基础] - 表单:响应式表单
  • [bzoj 3124][sdoi 2013 省选] 直径