PyTorch-TCN库使用指南与笔记汇总
提供以下功能
Conv1d
和 ConvTranspose1d
层的实现,并带有因果/非因果切换功能1 TCN类
from pytorch_tcn import TCN
model = TCN(
num_inputs: int,
num_channels: ArrayLike,
kernel_size: int = 4,
dilations: Optional[ ArrayLike ] = None,
dilation_reset: Optional[ int ] = None,
dropout: float = 0.1,
causal: bool = True,
use_norm: str = 'weight_norm',
activation: str = 'relu',
kernel_initializer: str = 'xavier_uniform',
use_skip_connections: bool = False,
input_shape: str = 'NCL',
embedding_shapes: Optional[ ArrayLike ] = None,
embedding_mode: str = 'add',
use_gate: bool = False,
lookahead: int = 0,
output_projection: Optional[ int ] = None,
output_activation: Optional[ str ] = None,
)
1.1 输入&输出形状
(N, Cin, L)
N
:批量大小Cin
:输入/出 通道数(特征维度)L
:序列长度1.2 参数详解
num_inputs | 输入数据的特征维度 |
num_channels |
一个list,指定每个残差块的通道数 (这个TCN多少层也是通过这个来确定的) |
kernel_size | 卷积核大小 |
dilations | 膨胀率
None ,则自动计算为 2^(0…n)(标准做法)。[1, 2, 4, 8] 。 |
dilation_reset | 膨胀率重置
dilation_reset=16 使膨胀率超过16后重置,如 [1, 2, 4, 8, 16, 1, 2, 4, ...] |
dropout | |
causal |
是否使用因果卷积 True :忽略未来信息,适用于实时预测。False :考虑未来信息,可用于非实时预测 |
use_norm |
归一化方式 weight_norm (默认)/batch_norm /layer_norm /None 。weight_norm 在原论文中使用,其他方式需根据具体任务测试。 |
activation | 激活函数:默认 relu |
kernel_initializer |
权重初始化 uniform / normal / kaiming_uniform / kaiming_normal / xavier_uniform / xavier_normal 。xavier_uniform ,相比 normal 初始化更稳定。 |
use_skip_connections |
跳跃连接 True :每个残差块的输出都会传递到最终输出(类似 WaveNet)。False (默认):不使用跳跃连接(原始 TCN 结构) |
input_shape | 输入形状格式)
NCL (默认):批量大小、通道数、序列长度(PyTorch 格式)。NLC :批量大小、序列长度、通道数(时序数据常见格式)。 |
output_projection | 输出投影:
None ,则通过 1×1 卷积将输出投影到指定维度。 |
output_activation | 输出激活函数:
softmax 等,用于分类任务。None (默认):不使用激活函数。 |
2因果卷积
pytorch-TCN
提供了一个 因果卷积层,它继承自 PyTorch 的 Conv1d
,可以直接替换标准的 Conv1d
层
2.1 参数说明
2.1.1 TemporalConv1d
(因果卷积层)
in_channels | 输入通道数 |
out_channels | 输出通道数 |
kernel_size | 卷积核大小 |
stride | 步长,默认 1 |
padding | 默认 0 ,自动计算,若手动设置可能会报错 |
dilation | 膨胀率,默认 1 |
groups | 组卷积数,默认 1 |
bias | 是否使用偏置,默认 True |
padding_mode | 填充模式,默认 zeros |
device | 运行设备,默认 None (自动选择) |
dtype | 数据类型,默认 None |
causal | 是否使用因果卷积,默认 True |
2.1.2 TemporalConvTranspose1d
(转置卷积层)
in_channels | 输入通道数 |
out_channels | 输出通道数 |
kernel_size | 卷积核大小 |
stride | 步长,默认 1 |
padding | 默认 0 ,自动计算,若手动设置可能会报错 |
dilation | 膨胀率,默认 1 |
groups | 组卷积数,默认 1 |
bias | 是否使用偏置,默认 True |
padding_mode | 填充模式,默认 zeros |
device | 运行设备,默认 None (自动选择) |
dtype | 数据类型,默认 None |
causal | 是否使用因果卷积,默认 True |
2.2 基本使用举例
from pytorch_tcn import TemporalConv1d, TemporalConvTranspose1d
import torch
# 因果卷积层
conv = TemporalConv1d(
in_channels=32, # 输入通道数
out_channels=32, # 输出通道数
kernel_size=3, # 卷积核大小
causal=True # 是否使用因果卷积
)
# 反卷积层(转置卷积)
conv_t = TemporalConvTranspose1d(
in_channels=32,
out_channels=32,
kernel_size=4,
stride=2
)
# 前向传播
x = torch.randn(10, 32, 100) # (batch_size=10, in_channels=32, seq_len=100)
y = conv(x, inference=False, in_buffer=None)
# 进行卷积运算
y_t = conv_t(x, inference=False, in_buffer=None)
# 进行转置卷积
y.shape,y_t.shape
#(torch.Size([10, 32, 100]), torch.Size([10, 32, 200]))
3 流式推理
3.1 流式推理的挑战
kernel_size > 1
,为了保证输出的时间步与输入相同,TCN 始终会使用零填充(zero padding)。kernel_size=3
,dilation=1
的因果网络时,第一层的填充长度为 2
[X1, X2]
和 [X3, X4]
,则会导致:[ 0, 0, X1, X2 ] + [ 0, 0, X3, X4 ]batch_size
必须为 1
3.2 如何使用流式推理
from pytorch_tcn import TCN
# 初始化 TCN 模型
tcn = TCN(
num_inputs=10, # 输入特征数
num_channels=[32, 64, 128],
causal=True, # 流式推理只适用于因果网络
)
# 处理新序列前 **必须** 重置缓冲区
tcn.reset_buffers()
#作用是,清空存储的历史输入,确保每次推理不会受到上一次序列的影响。
# 流式推理的输入数据按块分割
for block in blocks: # 每个 block 形状:(1, num_inputs, block_size)
out = tcn(block, inference=True)
# 启用流式推理,使 TCN 在推理时利用缓冲区填充,确保逐块处理时的输出与完整序列处理时一致。
作者:UQI-LIUWJ