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

article/2025/11/5 7:56:44

TCN基本结构

时域卷积网络(Temporal Convolutional Network,TCN)由Shaojie Bai et al.在2018年提出的,可以用于时序数据处理,详细内容请看论文。

1.因果卷积(Causal Convolution)

causalConvolution

因果卷积如上图所示。对于上一层t时刻的值,只依赖于下一层t时刻及其之前的值。与传统的卷积神经网络的不同之处在于,因果卷积不能看到未来的数据,它是单向的结构,不是双向的。也就是说,先有前因,才能有后果,它是一种严格的时间约束模型,因此被称为因果卷积。

2.膨胀卷积(Dilated Convolution)

膨胀卷积(Dilated Convolution)也被称为空洞卷积

纯净的因果卷积仍然存在传统卷积神经网络的问题,即建模时间的长短受到卷积核大小的限制。 如果想获得更长的依赖关系,需要线性的堆叠许多层。 为了解决这个问题,研究人员提出了膨胀卷积,如下图所示。
dilatedConvolution

与传统卷积不同,膨胀卷积允许在卷积期间对输入进行间隔采样,并且采样率由图中的 d d d控制。 底层的 d = 1 d = 1 d=1表示在输入的过程中对每个点进行采样,中间层的 d = 2 d = 2 d=2表示在输入过程中对每2个点采样一次作为输入。 一般来说,层级越高,d的数值越大。 因此,膨胀卷积使有效窗口的大小随着层数呈指数型增长。 通过这种方法,卷积网络可以使用较少的层,就能获得大的感受野。

3.残差连接(Residual Connections)

残差连接被证明是训练深度网络的有效方法,它允许网络以跨层方式传输信息。

ResidualConnection

论文中构造了一个残差块来替换卷积层。 如上图所示,一个残差块包含两层卷积和非线性映射,并将WeightNorm和Dropout添加到每一层用来正则化网络。

TCN总结

优点

(1)并行性。当给定一个句子,TCN可以将并行处理句子,而不需要像RNN那样顺序的处理。

(2)灵活的感受野。TCN的感受野的大小由层数、卷积核大小、扩张系数确定。可以根据不同的任务不同的特点点进行灵活定制。

(3)梯度稳定。RNN经常存在梯度消失和梯度爆炸的问题,这主要是由于在不同时间段共享参数导致的。像传统的卷积神经网络一样,TCN也不存在梯度消失和梯度爆炸的问题。

(4)内存更低。RNN在使用时需要保存每一步的信息,这会占用大量的内存,TCN的卷积内核在一个层中共享,内存使用更低。

缺点

(1)TCN 在迁移学习方面可能没有那么强的适应性。这是因为在不同的领域,模型预测所需的历史信息量可能会有所不同。因此,在将一个模型从一个需要较少内存信息的问题迁移到一个需要较长内存的问题上时,TCN 的性能可能会很差,因为其感受野不够大。

(2)论文中描述的TCN仍然是单向结构。在诸如语音识别和语音合成等任务上,纯单向结构仍然非常有用。然而,大多数文本使用双向结构。TCN可以很容易扩展为双向结构,只需使用传统的卷积结构代替因果卷积即可。

(3)TCN毕竟是卷积神经网络的一种变体。虽然使用扩展卷积可以扩大感受野,但仍然受到限制。与Transformer相比,任意长度的相关信息都可以获取的特性仍然很差。TCN在文本中的应用还有待检验。

TCN应用

MINST手写数字分类

多个特征对应一个标签,即(xi1,xi2,xi3,…xin)-yi

本地环境:

Python 3.6
IDE:Pycharm

库版本:

keras 2.2.0
numpy  1.16.2
tensorflow  1.9.0

1.下载数据集

MINST数据集

2.创建TCN.py,输入如下代码

代码参考:Keras-based TCN

# TCN for minst data
from tensorflow.examples.tutorials.mnist import input_data
from keras.models import Model
from keras.layers import add, Input, Conv1D, Activation, Flatten, Dense# Load data 载入数据
def read_data(path):mnist = input_data.read_data_sets(path, one_hot=True)train_x, train_y = mnist.train.images.reshape(-1, 28, 28), mnist.train.labels,valid_x, valid_y = mnist.validation.images.reshape(-1, 28, 28), mnist.validation.labels,test_x, test_y = mnist.test.images.reshape(-1, 28, 28), mnist.test.labelsreturn train_x, train_y, valid_x, valid_y, test_x, test_y# Residual block 残差块
def ResBlock(x, filters, kernel_size, dilation_rate):r = Conv1D(filters, kernel_size, padding='same', dilation_rate=dilation_rate, activation='relu')(x)  # first convolutionr = Conv1D(filters, kernel_size, padding='same', dilation_rate=dilation_rate)(r)  # Second convolutionif x.shape[-1] == filters:shortcut = xelse:shortcut = Conv1D(filters, kernel_size, padding='same')(x)  	# shortcut (shortcut)o = add([r, shortcut])# Activation functiono = Activation('relu')(o)  return o# Sequence Model 时序模型
def TCN(train_x, train_y, valid_x, valid_y, test_x, test_y, classes, epoch):inputs = Input(shape=(28, 28))x = ResBlock(inputs, filters=32, kernel_size=3, dilation_rate=1)x = ResBlock(x, filters=32, kernel_size=3, dilation_rate=2)x = ResBlock(x, filters=16, kernel_size=3, dilation_rate=4)x = Flatten()(x)x = Dense(classes, activation='softmax')(x)model = Model(input=inputs, output=x)# View network structure 查看网络结构model.summary()# Compile model 编译模型model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])# Training model 训练模型model.fit(train_x, train_y, batch_size=500, nb_epoch=epoch, verbose=2, validation_data=(valid_x, valid_y))# Assessment model 评估模型pre = model.evaluate(test_x, test_y, batch_size=500, verbose=2)print('test_loss:', pre[0], '- test_acc:', pre[1])# MINST数字从0-9共10个,即10个类别
classes = 10
epoch = 30
train_x, train_y, valid_x, valid_y, test_x, test_y = read_data('MNIST_data')
#print(train_x, train_y)TCN(train_x, train_y, valid_x, valid_y, test_x, test_y, classes, epoch)

3.结果

test_loss: 0.05342669463425409 - test_acc: 0.987100002169609

多个标签

多个特征对应多个标签, 如(xi1,xi2,xi3,…xin)- (yi1,yi2

只需根据上述代码进行修改,重新构建训练、测试数据,设置对应的输入输出维度、参数等信息即可。

本地环境:

Python 3.6
IDE:Pycharm

库版本:

keras 2.2.0
numpy  1.16.2
pandas 0.24.1
sklearn 0.20.1
tensorflow  1.9.0

具体代码:

# TCN for indoor location
import math
from tensorflow.examples.tutorials.mnist import input_data
from keras.models import Model
from keras.layers import add, Input, Conv1D, Activation, Flatten, Dense
import numpy as np
import pandas
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error# 创建时序数据
def create_dataset(dataset, look_back=1):dataX, dataY = [], []for i in range(len(dataset)-look_back-1):a = dataset[i:(i+look_back), :]dataX.append(a)dataY.append(dataset[i + look_back, -2:])return np.array(dataX), np.array(dataY)# Residual block
def ResBlock(x, filters, kernel_size, dilation_rate):r = Conv1D(filters, kernel_size, padding='same', dilation_rate=dilation_rate, activation='relu')(x)  # first convolutionr = Conv1D(filters, kernel_size, padding='same', dilation_rate=dilation_rate)(r)  # Second convolutionif x.shape[-1] == filters:shortcut = xelse:shortcut = Conv1D(filters, kernel_size, padding='same')(x)  # shortcut (shortcut)o = add([r, shortcut])o = Activation('relu')(o)  # Activation functionreturn o# Sequence Model
def TCN(train_x, train_y, test_x, test_y, look_back, n_features, n_output, epoch):inputs = Input(shape=(look_back, n_features))x = ResBlock(inputs, filters=32, kernel_size=3, dilation_rate=1)x = ResBlock(x, filters=32, kernel_size=3, dilation_rate=2)x = ResBlock(x, filters=16, kernel_size=3, dilation_rate=4)x = Flatten()(x)x = Dense(n_output, activation='softmax')(x)model = Model(input=inputs, output=x)# View network structuremodel.summary()# Compile modelmodel.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])# Training modelmodel.fit(train_x, train_y, batch_size=500, nb_epoch=epoch, verbose=2)# Assessment modelpre = model.evaluate(test_x, test_y, batch_size=500, verbose=2)# print(pre)print('test_loss:', pre[0], '- test_acc:', pre[1])# 公共参数
np.random.seed(7)
features = 24
output = 2
EPOCH = 30
look_back = 5trainPath = '../data/train.csv'
testPath  = '../data/test.csv'trainData = pandas.read_csv(trainPath, engine='python')
testData = pandas.read_csv(testPath, engine='python')# features = 1
dataset = trainData.values
dataset = dataset.astype('float32')datatestset = testData.values
datatestset = datatestset.astype('float32')
# print(dataset)# normalize the dataset
scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)
datatestset = scaler.fit_transform(datatestset)trainX, trainY = create_dataset(dataset, look_back)
testX, testY = create_dataset(datatestset, look_back)
# print(trainX)
print(len(trainX), len(testX))
print(testX.shape)
# reshape input to be [samples, time steps, features]
trainX = np.reshape(trainX, (trainX.shape[0], trainX.shape[1], features))
testX = np.reshape(testX, (testX.shape[0], testX.shape[1], features))# train_x, train_y, valid_x, valid_y, test_x, test_y = read_data('MNIST_data')
print(trainX, trainY)TCN(trainX, trainY,  testX, testY, look_back, features, output, EPOCH)

未完待续…

参考资料

An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling

TCN-Time Convolutional Network

Keras-based time domain convolutional network (TCN)

Keras-TCN

[Tensorflow] Implementing Temporal Convolutional Networks


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

相关文章

时域卷积网络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;那么它会将这个城市里所有美食店铺评分最高的…

AIX系统 topas查看系统各项指标性能

AIX系统 topas查看系统各项指标性能 topas命令默认2秒更新一次 一、topas命令以区域形式表现系统各项指标性能 如下图&#xff1a; 1、 CPU&#xff1a;反应CPU性能区域&#xff0c;如果有多个 CPU&#xff0c;按 c 键两次就可显示 CPU 列表。仅按 c 键一次会关闭此区域 Us…

top 与 htop

top 与 htop 区别 一、相同点 两者均是可以查看cpu使用情况的命令 二、不同点 top 在linux系统中&#xff0c;top 命令用来显示系统中正在运行的进程的实时状态&#xff0c;它显示了一些非常有用的信息&#xff0c;比如 CPU 利用情况、内存消耗情况&#xff0c;以及每个进…

top cpu

我们有时会把%CPU和us%搞晕&#xff0c;也就是下图所示在top的时候查看cpu的信息。 这时有人会问&#xff1a;这两个CPU到底哪个是对的。 其实都是对的&#xff0c;只是表达的意思不一样。 官方解释如下 Cpu(s)&#xff1a;34.0% us: 用户空间占用CPU百分比 %CPU&#xff1…

TOP TOPAS

在IBM的OS AIX中,root用户输入topas可以查看系统的运行情况(有的OS是使用top查看),如图: (此图截于IBM eServer p5 590)Kernel:内存使用百分率 Network:网络信息区User: 用户进程使用百分率 Disk: 存储信息区Wait: …