时间卷积网络(TCN):序列建模的强大工具(附Pytorch网络模型代码)

这里写目录标题

  • 1. 引言
  • 2. TCN的核心特性
    • 2.1 序列建模任务描述
    • 2.2 因果卷积
    • 2.3 扩张卷积
    • 2.4 残差连接
  • 3. TCN的网络结构
  • 4. TCN vs RNN
  • 5. TCN的应用
  • TCN的实现

1. 引言

引用自:Bai S, Kolter J Z, Koltun V. An empirical evaluation of generic convolutional and recurrent networks for sequence modeling. arXiv[J]. arXiv preprint arXiv:1803.01271, 2018, 10.

在这里插入图片描述

时间卷积网络(Temporal Convolutional Network,简称TCN)是一种专门用于处理序列数据的深度学习模型。它结合了卷积神经网络(CNN)的并行处理能力和循环神经网络(RNN)的长期依赖建模能力,成为序列建模任务中的强大工具。实验证明,对于某些任务下的长序LSTM和GRU等RNN架构,因此如果大家有多输入单输出(MISO)或多输入多输出(MIMO)序列建模任务,可以尝试使用TCN来作为创新点。
在这里插入图片描述

2. TCN的核心特性

在这里插入图片描述
图1所示。TCN中的架构元素。(a)一个扩张的因果卷积,其扩张因子d = 1,2,4,滤波器大小k = 3。接收野能够覆盖输入序列中的所有值。(b) TCN残余块。当剩余输入和输出具有不同的维数时,添加1x1卷积。© TCN中剩余连接的示例。蓝线是残差函数中的过滤器,绿线是恒等映射。

2.1 序列建模任务描述

在定义网络结构之前,我们先强调序列建模任务的核心特性。假设我们有输入序列 x 0 , … , x T x_0, \ldots, x_T x0,,xT,并希望在每个时间点预测对应的输出 y 0 , … , y T y_0, \ldots, y_T y0,,yT。关键约束在于,预测某个时间点 t t t 的输出 y t y_t yt 时,我们只能利用此前观察到的输入 x 0 , … , x t x_0, \ldots, x_t x0,,xt。形式上讲,序列建模网络是任何函数 f : X T + 1 → Y T + 1 f : X^{T+1} \rightarrow Y^{T+1} f:XT+1YT+1,它生成如下映射:

y ^ 0 , … , y ^ T = f ( x 0 , … , x T ) \hat{y}_0, \ldots, \hat{y}_T = f(x_0, \ldots, x_T) y^0,,y^T=f(x0,,xT)

若要满足因果性约束,即 y t y_t yt 只依赖于 x 0 , … , x t x_0, \ldots, x_t x0,,xt,而不依赖于任何“未来”的输入 x t + 1 , … , x T x_{t+1}, \ldots, x_T xt+1,,xT。在序列建模的学习目标中,是找到网络 f f f,使其最小化实际输出与预测值间的预期损失, L ( y 0 , … , y T , f ( x 0 , … , x T ) ) L(y_0, \ldots, y_T, f(x_0, \ldots, x_T)) L(y0,,yT,f(x0,,xT)),其中序列和输出根据某一概率分布抽取。

2.2 因果卷积

TCN使用因果卷积(Causal Convolution)来确保模型不会违反时间顺序。因果卷积即输出只依赖于当前时刻及其之前的输入,而不依赖于未来的输入(因为当前的你看不到未来的数据)。在标准的卷积操作中,每个输出值都基于其周围的输入值,包括未来的时间点。但在因果卷积中,权重仅应用于当前和过去的输入值,确保了信息流的方向性,避免了未来信息泄露到当前输出中。为了实现这一点,通常会在卷积核的右侧填充零(称为因果填充),这样只有当前和过去的信息被用于计算输出。

数学表示:

y ( t ) = ∑ i = 0 k − 1 f ( i ) ⋅ x ( t − i ) y(t) = \sum_{i=0}^{k-1} f(i) \cdot x(t-i) y(t)=i=0k1f(i)x(ti)

其中, f f f是卷积核, k k k是卷积核大小, x x x是输入序列。

2.3 扩张卷积

为了增加感受野而不增加参数数量,TCN采用扩张卷积(Dilated Convolution)。扩张卷积,也被称为空洞卷积,是一种在卷积核之间插入空隙(即跳过某些输入单元)的卷积形式。这种技术允许模型在不增加参数数量的情况下捕获更大的感受野,从而更好地理解输入数据中的上下文信息。扩张因子(dilation factor)决定了卷积核中元素之间的间距,例如,如果扩张因子为2,则卷积核中的元素会间隔一个输入单元。

扩张卷积的数学表示:

y ( t ) = ∑ i = 0 k − 1 f ( i ) ⋅ x ( t − d ⋅ i ) y(t) = \sum_{i=0}^{k-1} f(i) \cdot x(t-d \cdot i) y(t)=i=0k1f(i)x(tdi)

其中, d d d是扩张率。

一个扩张的因果卷积如下图所示:
在这里插入图片描述

2.4 残差连接

TCN使用残差连接来缓解梯度消失问题并促进更深层网络的训练。残差连接是残差网络(ResNets)的关键组成部分,由何凯明等人提出。它的主要目的是解决深层神经网络训练中的梯度消失/爆炸问题,以及提高网络的训练效率和性能。在残差连接中,网络的某一层的输出直接加到几层之后的另一层上,形成所谓的“跳跃连接”。具体来说,假设有一个输入 x x x,经过几层后得到 F ( x ) F(x) F(x),那么最终的输出不是 F ( x ) F(x) F(x)而是 x + F ( x ) x+F(x) x+F(x),也就是输入+输出。这种结构允许梯度在反向传播时可以直接流回更早的层,减少了梯度消失的问题,并且使得网络能够有效地训练更深的架构。残差块的输出可以表示为:

o u t p u t = a c t i v a t i o n ( i n p u t + F ( i n p u t ) ) output = activation(input + F(input)) output=activation(input+F(input))

其中, F F F是卷积层和激活函数的组合,残差连接如下图所示:
在这里插入图片描述

3. TCN的网络结构

TCN的基本结构包括多个残差块,每个残差块包含:

  1. 一维因果卷积层
  2. 层归一化
  3. ReLU激活函数
  4. Dropout层

TCN的整体结构可以表示为:
在这里插入图片描述

4. TCN vs RNN

相比于RNN,TCN有以下优势:

  1. 并行计算:卷积操作可以并行执行,提高计算效率。
  2. 固定感受野:可以精确控制输出对过去输入的依赖范围。
  3. 灵活的感受野大小:通过调整网络深度和扩张率,可以轻松处理不同长度的序列。
  4. 稳定梯度:避免了RNN中的梯度消失/爆炸问题。

5. TCN的应用

TCN在多个领域表现出色,包括:

  • 时间序列预测
  • 语音合成
  • 机器翻译
  • 动作识别
  • 音频生成

本篇文章不靠卖代码赚取收益,麻烦给个点赞和关注,后续还会有开源的免费优化算法及其代码,栓Q!同时如果大家有想要的算法可以在评论区打出,如果有空的话我可以帮忙复现

TCN的实现

以下是使用PyTorch实现TCN核心组件的示例代码(可以直接调用):

import torch
import torch.nn as nn
from torch.nn.utils import weight_normclass Chomp1d(nn.Module):def __init__(self, chomp_size):super(Chomp1d, self).__init__()self.chomp_size = chomp_sizedef 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.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 Noneself.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 ** iin_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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/48468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统之部署扫雷小游戏(三)

Linux系统之部署扫雷小游戏(三) 一、小游戏介绍1.1 小游戏简介1.2 项目预览二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍三、检查本地环境3.1 检查系统版本3.2 检查系统内核版本3.3 检查软件源四、安装Apache24.1 安装Apache2软件4.2 启动apache2服务4.3 查看apache2服…

大厂生产解决方案:泳道隔离机制

更多大厂面试内容可见 -> http://11come.cn 大厂生产解决方案:泳道隔离机制 背景 在公司中,由于项目多、开发人员多,一般会有多套测试环境(可以理解为多个服务器),同一套服务会在多套测试环境中都部署…

如何解决微服务下引起的 分布式事务问题

一、什么是分布式事务? 虽然叫分布式事务,但不是一定是分布式部署的服务之间才会产生分布式事务。不是在同一个服务或同一个数据库架构下,产生的事务,也就是分布式事务。 跨数据源的分布式事务 跨服务的分布式事务 二、解决方…

配置服务器

参考博客 1. https://blog.csdn.net/qq_31278903/article/details/83146031 2. https://blog.csdn.net/u014374826/article/details/134093409 3. https://blog.csdn.net/weixin_42728126/article/details/88887350 4. https://blog.csdn.net/Dreamhai/article/details/109…

javac详解 idea maven内部编译原理 自制编译器

起因 不知道大家在开发中,有没有过下面这些疑问。有的话,今天就一次解答清楚。 如何使用javac命令编译一个项目?java或者javac的一些参数到底有什么用?idea或者maven是如何编译java项目的?(你可能猜测底层…

【一刷《剑指Offer》】面试题 47:不用加减乘除做加法

力扣对应题目链接:LCR 190. 加密运算 - 力扣(LeetCode) 牛客对应题目链接:不用加减乘除做加法_牛客题霸_牛客网 (nowcoder.com) 一、《剑指Offer》对应内容 二、分析题目 sumdataA⊕dataB 非进位和:异或运…

Unity UGUI 之 Graphic Raycaster

本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 首先手册连接如下: Unity - Manual: Graphic Raycaster 笔记来源于&#xff…

无人车技术浪潮真的挡不住了~

正文 无人驾驶汽车其实也不算是新鲜玩意了,早在十年前大家都开始纷纷投入研发,在那时就已经蠢蠢欲动,像目前大部分智驾系统和辅助驾驶系统都是无人驾驶系统的一个中间过度版本,就像手机进入智能机时代的中间版本。 然而前段时间突…

SpringBoot 介绍和使用(详细)

使用SpringBoot之前,我们需要了解Maven,并配置国内源(为什么要配置这些,下面会详细介绍),下面我们将创建一个SpringBoot项目"输出Hello World"介绍. 1.环境准备 ⾃检Idea版本: 社区版: 2021.1 -2022.1.4 专业版: ⽆要求 如果个⼈电脑安装的idea不在这个范围, 需要…

LeetCode 热题 HOT 100 (001/100)【宇宙最简单版】

【链表】 No. 0160 相交链表 【简单】👉力扣对应题目指路 希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#x…

搜维尔科技:【产品推荐】Euleria Health Riablo 运动功能训练与评估系统

Euleria Health Riablo 运动功能训练与评估系统 Riablo提供一种创新的康复解决方案,将康复和训练变得可激励、可衡量和可控制。Riablo通过激活本体感觉,并通过视听反馈促进神经肌肉的训练。 得益于其技术先进和易用性,Riablo是骨科、运动医…

jmeter部署

一、windows环境下部署 1、安装jdk并配置jdk的环境变量 (1) 安装jdk jdk下载完成后双击安装包:无限点击"下一步"直到完成,默认路径即可。 (2) jdk安装完成后配置jdk的环境变量 找到环境变量中的系统变量:此电脑 --> 右键属性 …

C语言:温度转换

1.题目:实现摄氏度(Celsius)和华氏度(Fahrenheit)之间的转换。 输入一个华氏温度,输出摄氏温度,结果保留两位小数。 2.思路:(这是固定公式,其中 F 是华氏度&a…

【C语言】详解结构体(下)(位段)

文章目录 前言1. 位段的含义2. 位段的声明3. 位段的内存分配(重点)3.1 存储方向的问题3.2 剩余空间利用的问题 4. 位段的跨平台问题5. 位段的应用6. 总结 前言 相信大部分的读者在学校或者在自学时结构体的知识时,可能很少会听到甚至就根本没…

STM32实战篇:按键(外部输入信号)触发中断

功能要求 将两个按键分别与引脚PA0、PA1相连接,通过按键按下,能够触发中断响应程序(不需明确功能)。 代码流程如下: 实现代码 #include "stm32f10x.h" // Device headerint main() {//开…

JUC并发编程01-基础概念

概念 进程 进程可以视为程序的一个实例,进程就是用来加载指令、管理内存、管理I0 线程 一个进程内可以有多个线程,一个线程就是一个指令流。 在Java中,线程作为最小调度单位,进程作为资源分配的最小单位,可以说进程…

Mysql数据库第二次作业

(1)显示所有职工的基本信息。 mysql> select * from t_worker; (2)查询所有职工所属部门的部门号,不显示重复的部门号。 mysql> select distinct department_id from t_worker; (3)求出所有职工的人数。 mysql> select count(1) from t_worker; (4)列…

Figma 中文版指南:获取和安装汉化插件

Figma是一种主流的在线团队合作设计工具,也是一种基于 Web 端的设计工具。在当今的设计时代,Figma 的使用满足了每个人的设计需求,不仅可以实现在线编辑,还可以方便日常管理,有效提高工作效率。然而,相信很…

分页查询与分页条件查询

--------------- 无PageHelper插件分页查询 1.创建PageBean实体类 Data NoArgsConstructor AllArgsConstructor public class PageBean<T> {private Long total;//总条数private List<T> items;//当前页数据集合 }类型安全性 泛型&#xff1a;提供了编译时的类型…

【Apache Doris】周FAQ集锦:第 15 期

【Apache Doris】周FAQ集锦&#xff1a;第 15 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户…