TCN(Temporal Convolutional Networks)时序卷积网络详解及代码

原文链接:https://arxiv.org/pdf/1803.01271.pdf

参考链接: http://www.gzywkj.com/post/15485.html

 TCN(Temporal Convolutional Network,时间卷积网络)

https://zhuanlan.zhihu.com/p/51246745 时域卷积网络TCN详解:使用卷积进行序列建模和预测-csdn

时空卷积网络TCN:时空卷积网络TCN - USTC丶ZCC - 博客园 

什么是TCN?

         TCN全称Temporal Convolutional Network,时序卷积网络,是在2018年提出的一个卷积模型,但是可以用来处理时间序列。TCN是指时间卷积网络,一种新型的可以用来解决时间序列预测的算法。

TCN背景

          到目前为止,深度学习背景下的序列建模主题主要与递归神经网络架构(如LSTM和GRU)有关。S.  Bai等人(*)认为,这种思维方式已经过时,在对序列数据进行建模时,应该将卷积网络作为主要候选者之一加以考虑。他们能够表明,在许多任务中,卷积网络可以取得比RNNs更好的性能,同时避免了递归模型的常见缺陷,如梯度爆炸/消失问题或缺乏内存保留。此外,使用卷积网络而不是递归网络可以提高性能,因为它允许并行计算输出。他们提出的架构称为时间卷积网络(TCN),将在下面的部分中进行解释。

  该算法于2016年由Lea等人首先提出,当时他们在做视频动作分割的研究,一般而言此常规过程包括两个步骤:首先,使用(通常)对时空信息进行编码的CNN来计算低级特征,其次,将这些低级特征输入到使用(通常是)捕获高级时域信息的分类器中)RNN。这种方法的主要缺点是需要两个单独的模型。

         TCN提供了一种统一的方法来分层捕获所有两个级别的信息。

         自从TCN提出后引起了巨大反响,有人认为:时间卷积网络(TCN)将取代RNN成为NLP或者时序预测领域的王者。

         DataScienceCentral 的编辑主任William Vorhies给出的原因如下:

          RNN耗时太长,由于网络一次只读取、解析输入文本中的一个单词(或字符),深度神经网络必须等前一个单词处理完,才能进行下一个单词的处理。这意味着 RNN 不能像 CNN 那样进行大规模并行处理;并且TCN的实际结果也要优于RNN算法。

         TCN可以采用一系列任意长度并将其输出为相同长度。在使用一维完全卷积网络体系结构的情况下,使用因果卷积。一个关键特征是,时间t的输出仅与t之前发生的元素卷积。

因果卷积

因果卷积是在wavenet这个网络中提出的,之后被用在了TCN中。因果卷积应为就是:Causal Convolutions。

膨胀因果卷积

        英文是Dilated Causal Convolution

          

代码:

import torch
import torch.nn as nn
from torch.nn.utils import weight_norm
# 这个函数是用来修剪卷积之后的数据的尺寸,让其与输入数据尺寸相同。
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()

# 这个就是TCN的基本模块,包含8个部分,两个(卷积+修剪+relu+dropout)
# 里面提到的downsample就是下采样,其实就是实现残差链接的部分。不理解的可以无视这个
class TemporalBlock(nn.Module):
    def __init__(self, n_inputs, n_outputs, kernel_size, stride, dilation, padding, dropout=0.2):
        super(TemporalBlock, self).__init__()
        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.relu = nn.ReLU()
        self.init_weights()

    def init_weights(self):
        self.conv1.weight.data.normal_(0, 0.01)
        self.conv2.weight.data.normal_(0, 0.01)
        if self.downsample is not None:
            self.downsample.weight.data.normal_(0, 0.01)

    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 TemporalConvNet(nn.Module):
    def __init__(self, num_inputs, num_channels, kernel_size=2, dropout=0.2):
        super(TemporalConvNet, self).__init__()
        layers = []
        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]
            layers += [TemporalBlock(in_channels, out_channels, kernel_size, stride=1, dilation=dilation_size,
                                     padding=(kernel_size-1) * dilation_size, dropout=dropout)]

        self.network = nn.Sequential(*layers)

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

### Temporal Convolutional Networks (TCN) 架构 TCN是一种强大的深度学习架构,能够处理任意长度的输入序列并生成相应长度的输出序列[^1]。这种特性使得TCN网络中可以利用非常深远的历史数据来进行预测。 #### 膨胀卷积与残差连接 为了实现这一目标,TCN采用了膨胀卷积(Dilated Convolutions)以及残差层(Residual Layers)。膨胀卷积允许网络在不增加参数数量的情况下扩大感受野,从而覆盖更长时间范围内的上下文信息。而残差连接则有助于构建更深的网络结构,缓解梯度消失问题,提高训练效率和效果。 ```python import torch.nn as nn class TCNBlock(nn.Module): def __init__(self, n_inputs, n_outputs, kernel_size, stride, dilation, padding, dropout=0.2): super(TCNBlock, self).__init__() self.conv1 = nn.Conv1d(n_inputs, n_outputs, kernel_size, stride=stride, padding=padding, dilation=dilation) self.bn1 = nn.BatchNorm1d(n_outputs) self.dropout1 = nn.Dropout(dropout) self.net = nn.Sequential(self.conv1, self.bn1, nn.ReLU(), self.dropout1) self.downsample = nn.Conv1d( n_inputs, n_outputs, 1) if n_inputs != n_outputs else None self.relu = nn.ReLU() def forward(self, x): out = self.net(x) res = x if self.downsample is None else self.downsample(x) return self.relu(out + res) ``` 此代码片段展示了如何定义一个基本的TCN模块,其中包括了膨胀卷积操作及其后的批标准化、激活函数应用及dropout机制来防止过拟合现象的发生。此外还实现了跳跃链接以支持深层网络的学习过程。 #### 时间维度上的滑动窗口 不同于传统的RNN系列模型依靠递归单元间的状态传递来捕捉时间动态特征的方式,TCN则是通过沿着时间轴方向移动的小型局部滤波器——即所谓的“滑窗”——提取模式。这种方法不仅简化了计算流程而且提高了并行化程度,在实际应用场景下往往能带来更好的性能表现[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新池坡南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值