TCN论文及代码解读总结

article/2025/11/5 7:53:25

前言:传统的时序处理,普遍采用RNN做为基础网络模型,如其变体LSTM、GRU、BPTT等。但是在处理使用LSTM时时序的卷积神经网络


目录

  • 论文及代码链接
  • 一、论文解读
    • 1、 摘要
    • 2、引言(摘)
    • 3、时序卷积神经网络(Temporal Convolutional Networks)
      • 3.1 因果卷积(Causal Convolution)
      • 3.2 膨胀卷积(Dilated Convolution)
      • 3.3 残差连接(Residual Connections)
  • 二、源码解读
  • 三、总结分析
    • 1、优点
    • 2、缺点
  • 参考致谢


论文及代码链接

Paper:An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling
Code:Github:https://github.com/LOCUSLAB/tcn


一、论文解读

1、 摘要

   对于大多数deeplearning工作者,序列模型与RNN几乎是密不可分(这是因为RNN天生的循环自回归的结构是对时间序列的很好的表示)。然而,最新的一项研究表明,卷积结构在音频合成和机器翻译等tasks上效果可以优于递归神经网络。给定一个新的序列建模tasks或者是数据集,使用什么样的架构呢?论文对序列建模的通用卷积和递归结构进行了系统的评估。通过大量全面的标准tasks,对模型中进行评估,其中这些tasks通常用于递归网络的基准测试。论文研究表明,一个简单的卷积结构在不同的tasks和数据集上优于典型的递归神经网络,如LSTMs,同时卷积表现出更长的有效memory。论文的结论是序列建模和递归网络之间的共同联系应该重新考虑,卷积网络应该被认为是序列建模tasks的新的,自然的网路结构(natural starting point) 。

2、引言(摘)

  为了表示卷积网络,论文描述了一个通用的时间卷积网络(TCN)体系结构,它应用于所有的tasks。这种架构是由最近的研究进行了改进,特意保留了结构的简单性,结合了现代卷积架构的一些最佳实践经验。并与典型的递归体系结构(如LSTMs和GRUs)进行了比较。
  结果表明,TCNs在大量的序列建模任务中明显优于基线递归架构。这一点尤其值得注意,因为这些任务包括各种各样的基准,这些基准通常用于评估网络设计。这表明卷积结构最新在音频处理等应用中取得了成功,但并不局限于这些领域。
  为了进一步了解这些结论,作者深入分析了递归网络的记忆(memory)保持特性。结果表明,尽管递归结构理论上具有捕捉无限长时间的能力,但总的来说TCNs仍然表现出更长的记忆能力,TCNs更适用于长时间记忆的领域。
  总结:论文的研究是关于序列建模任务的卷积和递归结构的系统比较。结果表明,序列建模和递归网络之间的共同联系应该重新考虑。TCN体系结构不仅比LSTMs和GRUs等典型的递归网络更加精确,而且更加简单明了。因此,它可能是将深度网络应用于序列的更佳方法的起点(starting point)。

3、时序卷积神经网络(Temporal Convolutional Networks)

3.1 因果卷积(Causal Convolution)

因果卷积
  图片是是参考waveNet,可以用上图直观表示。 即对于上一层t时刻的值,只依赖于下一层t时刻及其之前的值。和传统的卷积神经网络的不同之处在于,因果卷积不能看到未来的数据,它是单向的结构,不是双向的。也就是说只有有了前面的因才有后面的果,是一种严格的时间约束模型,因此被成为因果卷积。但是问题就来,如果我要考虑很久之前的变量x,那么卷积层数就必须增加。卷积层数的增加就带来:梯度消失,训练复杂,拟合效果不好的问题,为了决绝这个问题,出现了扩展卷积(dilated)。

3.2 膨胀卷积(Dilated Convolution)

膨胀卷积d=1,2,4,8
  对于因果卷积,存在的一个问题是需要很多层或者很大的filter来增加卷积的感受野。本文中,作者通过大小排列来的扩大卷积来增加感受野。扩大卷积(dilated convolution)是通过跳过部分输入来使filter可以应用于大于filter本身长度的区域。等同于通过增加零来从原始filter中生成更大的filter。d=1,2,4,8,16,…,膨胀系数为2的阶乘,膨胀卷积如上图所示。公式表达如下: F ( s ) = ( x ∗ d f ) ( s ) = ∑ i = 0 k − 1 f ( i ) ⋅ x s − d ⋅ i F(s)=(x*_df)(s)=\sum^{k-1}_{i=0}f(i)\cdot x_{s-d\cdot i} F(s)=(xdf)(s)=i=0k1f(i)xsdi
在这里插入图片描述
  论文采用的膨胀卷积为有"交叉"的一维卷积,膨胀系数d为1,2,4。

3.3 残差连接(Residual Connections)

残差连接
我初次接触残差连接,是阅读何凯明大神的ResNet论文接触的,论文通过简单的残差连接,一定程度上消除了深度网络部分梯度消失和爆炸的影响。并且残差连接被证明是训练深层网络的有效方法,它使得网络可以以跨层的方式传递信息。论文构建了一个残差块,由于防止出现输入处理过程中出现维度变化,或者是为原始数据增加权重,增加训练参数。很多论文中都用到,例如CVPR2019的2s-GCN。如上图所示,一个残差块包含两层的卷积和非线性映射,在每层中还加入了WeightNorm和Dropout来正则化网络。
在这里插入图片描述
  总体来讲,TCN模型比较简,论文主要是将TCN的结构梳理了一下,感觉和wavenet很像,作者也说了参考了waveNet,加入了残差结构,并在很多的序列问题上进行了实验。实验效果如下:
实验结论

二、源码解读

  论文给出了源代码,采用pytorch架构。由于是对TCN进行分析和总结,所以在不同的序列数据集上进行训练,证明了TCN结构的泛化能力。本小白将代码的主要结构简单的讲解,如有理解错误,希望大佬指正,不胜感激。
  以Mnist数据集为例mnist_pixel。作者将手写数字矩阵28x28矩阵,扩展成一维Sequence:1x784。batch_size=64,所以最后的序列结构为64x1x784。一张图片为1x784的序列矩阵,每一批次64张。论文代码简洁,清晰,有利于对TCN的深入了解。
TCN模型
剪枝,一维卷积后会出现多余的padding。

class Chomp1d(nn.Module):def __init__(self, chomp_size):super(Chomp1d, self).__init__()# 表示对继承自父类属性进行初始化self.chomp_size = chomp_sizedef forward(self, x):"""其实这就是一个裁剪的模块,裁剪多出来的paddingtensor.contiguous()会返回有连续内存的相同张量有些tensor并不是占用一整块内存,而是由不同的数据块组成tensor的view()操作依赖于内存是整块的,这时只需要执行contiguous()函数,就是把tensor变成在内存中连续分布的形式本函数主要是增加padding方式对卷积后的张量做切边而实现因果卷积"""return x[:, :, :-self.chomp_size].contiguous()

时序模块,两层一维卷积,两层Weight_Norm,两层Chomd1d,非线性激活函数为Relu,dropout为0.2。

class TemporalBlock(nn.Module):def __init__(self, n_inputs, n_outputs, kernel_size, stride, dilation, padding, dropout=0.2):"""相当于一个Residual block:param n_inputs: int, 输入通道数:param n_outputs: int, 输出通道数:param kernel_size: int, 卷积核尺寸:param stride: int, 步长,一般为1:param dilation: int, 膨胀系数:param padding: int, 填充系数:param dropout: float, dropout比率"""super(TemporalBlock, self).__init__()self.conv1 = weight_norm(nn.Conv1d(n_inputs, n_outputs, kernel_size,stride=stride, padding=padding, dilation=dilation))# 经过conv1,输出的size其实是(Batch, input_channel, seq_len + padding)self.chomp1 = Chomp1d(padding)  # 裁剪掉多出来的padding部分,维持输出时间步为seq_lenself.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)  # 裁剪掉多出来的padding部分,维持输出时间步为seq_lenself.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 Noneself.relu = nn.ReLU()self.init_weights()def init_weights(self):"""参数初始化:return:"""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):""":param x: size of (Batch, input_channel, seq_len):return:"""out = self.net(x)res = x if self.downsample is None else self.downsample(x)return self.relu(out + res)

时序卷积模块,使用for循环对8层隐含层,每层25个节点进行构建。模型如下。其中*layer不是c中的指针,困惑了笔者一段时间,之后查看资料知道 * 表示迭代器拆分layers为一层层网络。

class TemporalConvNet(nn.Module):def __init__(self, num_inputs, num_channels, kernel_size=2, dropout=0.2):"""TCN,目前paper给出的TCN结构很好的支持每个时刻为一个数的情况,即sequence结构,对于每个时刻为一个向量这种一维结构,勉强可以把向量拆成若干该时刻的输入通道,对于每个时刻为一个矩阵或更高维图像的情况,就不太好办。:param num_inputs: int, 输入通道数:param num_channels: list,每层的hidden_channel数,例如[25,25,25,25]表示有4个隐层,每层hidden_channel数为25:param kernel_size: int, 卷积核尺寸:param dropout: float, drop_out比率"""super(TemporalConvNet, self).__init__()layers = []num_levels = len(num_channels)for i in range(num_levels):dilation_size = 2 ** i  # 膨胀系数:1,2,4,8……in_channels = num_inputs if i == 0 else num_channels[i - 1]  # 确定每一层的输入通道数,输入层通道为1,隐含层是25。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):"""输入x的结构不同于RNN,一般RNN的size为(Batch, seq_len, channels)或者(seq_len, Batch, channels),这里把seq_len放在channels后面,把所有时间步的数据拼起来,当做Conv1d的输入尺寸,实现卷积跨时间步的操作,很巧妙的设计。:param x: size of (Batch, input_channel, seq_len):return: size of (Batch, output_channel, seq_len)"""return self.network(x)

TCN模块,创新点1D·FCN,最后采用softmax进行分类。

class TCN(nn.Module):def __init__(self, input_size, output_size, num_channels, kernel_size, dropout):super(TCN, self).__init__()self.tcn = TemporalConvNet(input_size, num_channels, kernel_size=kernel_size, dropout=dropout)self.linear = nn.Linear(num_channels[-1], output_size)def forward(self, inputs):"""Inputs have to have dimension (N, C_in, L_in)"""y1 = self.tcn(inputs)  # input should have dimension (N, C, L)o = self.linear(y1[:, :, -1])# 增加一个维度,1D·FCNreturn F.log_softmax(o, dim=1)

三、总结分析

通过网络图可知,TCN感受野可控,并且结构简单,速度更快。优缺点总结如下,感谢作者满腹的小不甘。

1、优点

(1)并行性。当给定一个句子时,TCN可以将句子并行的处理,而不需要像RNN那样顺序的处理。
(2)灵活的感受野。TCN的感受野的大小受层数、卷积核大小、扩张系数等决定。可以根据不同的任务不同的特性灵活定制。
(3)稳定的梯度。RNN经常存在梯度消失和梯度爆炸的问题,这主要是由不同时间段上共用参数导致的,和传统卷积神经网络一样,TCN不太存在梯度消失和爆炸问题。
(4)内存更低。RNN在使用时需要将每步的信息都保存下来,这会占据大量的内存,TCN在一层里面卷积核是共享的,内存使用更低。

2、缺点

(1)TCN 在迁移学习方面可能没有那么强的适应能力。这是因为在不同的领域,模型预测所需要的历史信息量可能是不同的。因此,在将一个模型从一个对记忆信息需求量少的问题迁移到一个需要更长记忆的问题上时,TCN 可能会表现得很差,因为其感受野不够大。
(2)论文中描述的TCN还是一种单向的结构,在语音识别和语音合成等任务上,纯单向的结构还是相当有用的。但是在文本中大多使用双向的结构,当然将TCN也很容易扩展成双向的结构,不使用因果卷积,使用传统的卷积结构即可。
(3)TCN毕竟是卷积神经网络的变种,虽然使用扩展卷积可以扩大感受野,但是仍然受到限制,相比于Transformer那种可以任意长度的相关信息都可以抓取到的特性还是差了点。TCN在文本中的应用还有待检验。

参考致谢

cv小白,学习借鉴,如有侵权,通知即删。如有出错,希望指正,不胜感激。
TCN时间卷积网络 - 剪水作花飞的文章 - 知乎
TCN-时间卷积网络-满腹的小不甘-CSDN
【NLP】因果卷积(causal)与扩展卷积(dilated)-阿木鸣
[1]:Bai S , Kolter J Z , Koltun V . An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling[J]. 2018.


http://chatgpt.dhexx.cn/article/DwtN6a0M.shtml

相关文章

轨道交通中TCN、TRDP、TSN的理解

轨道交通中TCN、TSN、TRDP的理解 1 TCN2 TSN3 TRDP———————————————————————— 1 TCN TCN(Train Communication Network)是列车通信网络,是列车通信网络的总称。 在IEC 61375-1 以及GB/T 28029.1中都详细的介绍了列车…

深度学习 + 论文详解: TCN_时间卷积网络_原理与优势

论文链接 TCN: https://arxiv.org/pdf/1803.01271.pdf p.s. TCN stands for Temporal Convolutional Network. 它是除了 RNN architecture 之外的第二种可以分析时间性数据的架构 更多文章将在公众号:AI 算法辞典 首发! 前言 RNN 从最一开始发展以来…

【python量化】用时间卷积神经网络(TCN)进行股价预测

写在前面 下面这篇文章首先主要简单介绍了目前较为先进的时间序列预测方法——时间卷积神经网络(TCN)的基本原理,然后基于TCN的开源代码,手把手教你如何通过时间卷积神经网络来进行股价预测,感兴趣的读者也可以基于此模…

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

TCN基本结构 时域卷积网络(Temporal Convolutional Network,TCN)由Shaojie Bai et al.在2018年提出的,可以用于时序数据处理,详细内容请看论文。 1.因果卷积(Causal Convolution) 因果卷积如上…

时域卷积网络TCN详解:使用卷积进行序列建模和预测

CNN经过一些简单的调整就可以成为序列建模和预测的强大工具 尽管卷积神经网络(CNNs)通常与图像分类任务相关,但经过适当的修改,它已被证明是进行序列建模和预测的有价值的工具。在本文中,我们将详细探讨时域卷积网络(TCN)所包含的基本构建块&…

TCN代码详解-Torch (误导纠正)

1. 绪论 TCN网络由Shaojie Bai, J. Zico Kolter, Vladlen Koltun 三人于2018提出。对于序列预测而言,通常考虑循环神经网络结构,例如RNN、LSTM、GRU等。他们三个人的研究建议我们,对于某些序列预测(音频合…

时序CNN基础——TCN

自用~~笔记~~ 知识补充: 空洞卷积(膨胀卷积)——Dilated Conv 在标准卷积的基础上注入空洞,以此来增加感受野(reception field)。因此增加一个超参:膨胀率,指kernel的间隔数量。 因…

时间卷积网络(TCN):结构+pytorch代码

文章目录 TCNTCN结构1-D FCN的结构因果卷积(Causal Convolutions)膨胀因果卷积(Dilated Causal Convolutions)膨胀非因果卷积(Dilated Non-Causal Convolutions)残差块结构 pytorch代码讲解 TCN TCN(Temporal Convolutional Network)是由Shaojie Bai et al.提出的,p…

时间序列预测——时序卷积网络(TCN)

本文展示了使用时序卷积网络(TCN)进行时间序列预测的全过程,包含详细的注释。整个过程主要包括:数据导入、数据清洗、结构转化、建立TCN模型、训练模型(包括动态调整学习率和earlystopping的设置)、预测、结…

TCN-时间卷积网络

目录 一、引言 二、时序卷积神经网络 2.1 因果卷积(Causal Convolution) 2.2 膨胀卷积(Dilated Convolution) 2.3 残差链接(Residual Connections) 三、讨论和总结 1. TCN的优点 2. TCN的缺点 参考…

时间卷积网络TCN:CNN也可以处理时序数据并且比LSTM更好

本文回顾了 Shaojie Bai、J. Zico Kolter 和 Vladlen Koltun 撰写的论文:An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling。 TCN源代码:https://github.com/locuslab/TCN 文章目录 1. 序列建模2. 因果…

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

1 前言 实验表明,RNN 在几乎所有的序列问题上都有良好表现,包括语音/文本识别、机器翻译、手写体识别、序列数据分析(预测)等。 在实际应用中,RNN 在内部设计上存在一个严重的问题:由于网络一次只能处理一个…

机器学习进阶之 时域/时间卷积网络 TCN 概念+由来+原理+代码实现

TCN 从“阿巴阿巴”到“巴拉巴拉” TCN的概念(干嘛来的!能解决什么问题)TCN的父母(由来)TCN的原理介绍上代码! 1、TCN(时域卷积网络、时间卷积网络)是干嘛的,能干嘛 主…

htop与top的区别

总览: 什么是htop top和htop的区别 htop和top的比较 在centos7上安装htop 下载htop源码交叉编译安装 如何使用htop命令 更改htop刷新时间间隔 htop命令的快捷键 什么是htop? htop是一个交互式和实时监视进程查看器的linux编写的 它取代了Unix程序的top …

AIX的topas命令详解

说明 topas命令的说明可以直接执行man topas了解,或者直接看IBM给的 原始文档,路径为:https://www.ibm.com/support/knowledgecenter/en/ssw_aix_71/com.ibm.aix.cmds5/topas.htm 命令详解 先上在AIX服务器上执行topas命令后的图片 区域1&…

Linux中 top命令详解

一、基础概念 指令: top 作用: 查看服务器的进程占用资源 进入命令: top (动态显示) 推出命令: 按 q 键 二、输出结果 表头字段含义: PID: 进程id USER: 该进程对应的用户 PR: …

TOP用法详解

1、top命令:相当于Windows下的资源管理器,能够动态实时的显示系统中进程的资源占用情况。 2、在Linux终端上输入top命令出现的结果及其表示的含义如下图: 顺便说一下uptime命令 3、以上是默认的显示内容,可以通过快捷键来更改显示…

topas命令解析

topas命令解析 Posted on 2011-12-08 11:40 疯狂 阅读(984) 评论(1) 编辑 收藏 所属分类: unix <!----> 上一张我们测试机的topas的图(aix 5.3)&#xff1a;然后后面附上解释&#xff1a; topas命令用于监控各种系统资源&#xff0c;如CPU的使用情况&#xff0c;CPU…

Top-Down性能分析

2014年Ahmand Yasin在它的IEEE论文《A top-down method for performance analysis and counter architercture》中&#xff0c;革命性地给出了一个从CPU指令执行的顺畅程度来评估和发现瓶颈的方法&#xff0c;允许我们从黑盒的角度来看问题。 TMAM&#xff1a;自顶向下的微体系…

TOP-K

目录 TOP-K介绍 TOP-K实现 源码 TOP-K介绍 什么是TOP-K&#xff1f; 贴近生活来说&#xff0c;点外卖&#xff0c;打游戏。比如某团&#xff0c;你点一个美食&#xff0c;选你选在城市后&#xff0c;你选择按评分排序&#xff0c;那么它会将这个城市里所有美食店铺评分最高的…