wavenet及TCN

article/2025/11/5 7:57:57

一切皆卷积——包括时序相关任务

  • 1.wavenet
    • 1.1 wavenet的pytorch实现
      • 1.1.1 wavenet类
      • 1.1.2 ResidualConv1dGLU
    • 1.2 wavenet在纳米孔测序中的应用
  • 2.Temporal Convolutional Network(TCN)
    • 2.1 TCN模型介绍
    • 2.3 TCN代码实现及可视化
  • 3.wavenet/TCN的优点
  • 参考文献

RNN/LSTM在时序相关任务中可以说是优选模型。

那么CNN是否可以达到甚至超越这些模型在时序类任务中的效果呢?

今天就简单介绍两个模型,它们主要通过模块—dilated causal conv的多层叠加,来增加感受野,达到捕获时序特征的能力。

1.wavenet

wavenet由 deepmind 出品,原论文首先将其应用在了 Text-to-Speech 任务。

wavenet是一种全卷积的模型,包含了多个多层如下dilated的结构,随着dilated conv深度增加,来指数性地增大感受野,捕获序列之间较长的时间关系。

在这里插入图片描述

Deep Voice: Real-time Neural TTS 中有一张图,对wavenet的细节介绍的比较好,如下所示:
在这里插入图片描述

1.1 wavenet的pytorch实现

以下代码来自https://github.com/r9y9/wavenet_vocoder

1.1.1 wavenet类

r9y9实现wavenet类支持local 以及global conditioning作为输入。

class WaveNet(nn.Module):def __init__(self, out_channels=256, layers=20, stacks=2,residual_channels=512,gate_channels=512,skip_out_channels=512,kernel_size=3, dropout=1 - 0.95,cin_channels=-1, gin_channels=-1, n_speakers=None,upsample_conditional_features=False,upsample_net="ConvInUpsampleNetwork",upsample_params={"upsample_scales": [4, 4, 4, 4]},scalar_input=False,use_speaker_embedding=False,output_distribution="Logistic",cin_pad=0,):super(WaveNet, self).__init__()self.scalar_input = scalar_inputself.out_channels = out_channelsself.cin_channels = cin_channelsself.output_distribution = output_distributionassert layers % stacks == 0layers_per_stack = layers // stacksif scalar_input:self.first_conv = Conv1d1x1(1, residual_channels)else:self.first_conv = Conv1d1x1(out_channels, residual_channels)self.conv_layers = nn.ModuleList()for layer in range(layers):dilation = 2**(layer % layers_per_stack)conv = ResidualConv1dGLU(residual_channels, gate_channels,kernel_size=kernel_size,skip_out_channels=skip_out_channels,bias=True,  # magenda uses bias, but musyoku doesn'tdilation=dilation, dropout=dropout,cin_channels=cin_channels,gin_channels=gin_channels)self.conv_layers.append(conv)self.last_conv_layers = nn.ModuleList([nn.ReLU(inplace=True),Conv1d1x1(skip_out_channels, skip_out_channels),nn.ReLU(inplace=True),Conv1d1x1(skip_out_channels, out_channels),])if gin_channels > 0 and use_speaker_embedding:assert n_speakers is not Noneself.embed_speakers = Embedding(n_speakers, gin_channels, padding_idx=None, std=0.1)else:self.embed_speakers = None# Upsample conv netif upsample_conditional_features:self.upsample_net = getattr(upsample, upsample_net)(**upsample_params)else:self.upsample_net = Noneself.receptive_field = receptive_field_size(layers, stacks, kernel_size)def forward(self, x, c=None, g=None, softmax=False):B, _, T = x.size()if g is not None:if self.embed_speakers is not None:# (B x 1) -> (B x 1 x gin_channels)g = self.embed_speakers(g.view(B, -1))# (B x gin_channels x 1)g = g.transpose(1, 2)assert g.dim() == 3# Expand global conditioning features to all time stepsg_bct = _expand_global_features(B, T, g, bct=True)if c is not None and self.upsample_net is not None:c = self.upsample_net(c)assert c.size(-1) == x.size(-1)# Feed data to networkx = self.first_conv(x)skips = 0for f in self.conv_layers:x, h = f(x, c, g_bct)skips += hskips *= math.sqrt(1.0 / len(self.conv_layers))x = skipsfor f in self.last_conv_layers:x = f(x)x = F.softmax(x, dim=1) if softmax else xreturn x

ResidualConv1dGLU是wavenet的主要部分,在1.1.2 中具体介绍。

1.1.2 ResidualConv1dGLU

ResidualConv1dGLU即上图虚线框中的部分,它包含了Residual dilated conv1d 以及Gated linear unit(GLU)。

GLU: f ( x ) = ( X ∗ W + b ) ⊗ σ ( X ∗ V + c ) f(x)=(X*W+b)\otimes \sigma(X*V+c) f(x)=(XW+b)σ(XV+c)

GTU: f ( x ) = tanh ⁡ ( X ∗ W + b ) ⊗ σ ( X ∗ V + c ) f(x)=\tanh(X*W+b)\otimes \sigma(X*V+c) f(x)=tanh(XW+b)σ(XV+c)

如果熟悉LSTM的话,LSTM中门控机制中就有多个GTU,可参考Deep Dive into Pytorch RNN/LSTM。

wavenet中用到的应该是GTU。

class ResidualConv1dGLU(nn.Module):def __init__(self, residual_channels, gate_channels, kernel_size,skip_out_channels=None,cin_channels=-1, gin_channels=-1,dropout=1 - 0.95, padding=None, dilation=1, causal=True,bias=True, *args, **kwargs):super(ResidualConv1dGLU, self).__init__()self.dropout = dropoutif skip_out_channels is None:skip_out_channels = residual_channelsif padding is None:# no future time stamps availableif causal:padding = (kernel_size - 1) * dilationelse:padding = (kernel_size - 1) // 2 * dilationself.causal = causalself.conv = Conv1d(residual_channels, gate_channels, kernel_size,padding=padding, dilation=dilation,bias=bias, *args, **kwargs)# local conditioningif cin_channels > 0:self.conv1x1c = Conv1d1x1(cin_channels, gate_channels, bias=False)else:self.conv1x1c = None# global conditioningif gin_channels > 0:self.conv1x1g = Conv1d1x1(gin_channels, gate_channels, bias=False)else:self.conv1x1g = None# conv output is split into two groupsgate_out_channels = gate_channels // 2self.conv1x1_out = Conv1d1x1(gate_out_channels, residual_channels, bias=bias)self.conv1x1_skip = Conv1d1x1(gate_out_channels, skip_out_channels, bias=bias)def forward(self, x, c=None, g=None):return self._forward(x, c, g, False)def _forward(self, x, c, g, is_incremental):residual = xx = F.dropout(x, p=self.dropout, training=self.training)splitdim = 1x = self.conv(x)# remove future time stepsx = x[:, :, :residual.size(-1)] if self.causal else xa, b = x.split(x.size(splitdim) // 2, dim=splitdim)# local conditioningif c is not None:assert self.conv1x1c is not Nonec = self.conv1x1c(c)ca, cb = c.split(c.size(splitdim) // 2, dim=splitdim)a, b = a + ca, b + cb# global conditioningif g is not None:assert self.conv1x1g is not Noneg = self.conv1x1g(g)ga, gb = g.split(g.size(splitdim) // 2, dim=splitdim)a, b = a + ga, b + gbx = torch.tanh(a) * torch.sigmoid(b)# For skip connections = _conv1x1_forward(self.conv1x1_skip, x, is_incremental)# For residual connectionx = _conv1x1_forward(self.conv1x1_out, x, is_incremental)x = (x + residual) * math.sqrt(0.5)return x, s

1.2 wavenet在纳米孔测序中的应用

纳米孔测序是一种三代测序技术,它是将生化反应产生的电流信号解码成ATCG序列信息。

Xin Gao教授等提出一种基于双向wavene的wavenano模型,来提高测序性能。
在这里插入图片描述

2.Temporal Convolutional Network(TCN)

2.1 TCN模型介绍

TCN出自论文An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling。其主要结构和wavenet并无二致,即基于dilated conv1D及residual特征。

与wavenet相比,主要不同点在于:

-取消了wavenet中的门控机制(GLU);

-增加了weightnorm及dropout。
在这里插入图片描述

2.3 TCN代码实现及可视化

模型实现可参考pytorch TCN。

import torch
from torch import nn
import torch.nn.functional as F
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)

针对论文中的Sequential MNIST任务,构建由2个TCN block组成的模型,输出为10个类别:

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])return F.log_softmax(o, dim=1)if __name__ == '__main__':import netronn_classes = 10channel_sizes = [25]*2x = torch.rand(8, 1, 28*28)input_channels = x.shape[1]model = TCN(input_channels, n_classes, channel_sizes,kernel_size=3, dropout=0.05)o = model(x)onnx_path = "D:\\onnx_model_name.onnx"torch.onnx.export(model, x, onnx_path)netron.start(onnx_path)

使用netron进行可视化:
在这里插入图片描述
表明看起来和普通的resblock没有差别~

3.wavenet/TCN的优点

如TCN中所述,与RNN架构相比,wavenet/TCN模型在处理时序相关任务时,有如下优势:

-RNN结构的模型,在训练及推断时,t时刻的计算需要t-1时刻的状态,因此无法实现并行;

-wavenet/TCN中通过stacked dilated causal conv来增大感受野,这是RNNs无法实现的;

-RNNs在训练时存在梯度爆炸/消失等情况,导致训练比较困难;而在CNN结构中较少出现;

-RNNs在训练阶段需要存储很多偏导结果,导致较大的内存开销。

参考文献

[1] wavenet
[2] Deep Voice: Real-time Neural TTS
[3] An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling
[4] 初步理解TCN与WaveNet
[5] https://github.com/r9y9/wavenet_vocoder/blob/master/wavenet_vocoder/wavenet.py


http://chatgpt.dhexx.cn/article/4k4wvwZ6.shtml

相关文章

时序模型(一)—— TCN 时间卷积网络

一、 概述 TCN是18年提出的时序卷积神经网络模型。 时序问题建模,通常采用RNN循环神经网络及其相关变种,比如LSTM、GRU等,这里将卷积神经网络通过膨胀卷积达到抓取长时依赖信息的效果,TCN在一些任务上甚至能超过RNN相关模型。 …

【学习日志】【TCN】时间序列卷积神经网络(1)

1. ask bing(Temporal Convolutional Network) 问:“我对CNN、RNN、TCN等神经网络没有任何基础,你能直观地给我讲一下TCN的结构、输入输出和原理吗?” bing对TCN的解释如下: TCN是一种用于处理序列数据的神…

LSTM的备胎,用卷积处理时间序列——TCN与因果卷积(理论+Python实践)

什么是TCN TCN全称Temporal Convolutional Network,时序卷积网络,是在2018年提出的一个卷积模型,但是可以用来处理时间序列。 卷积如何处理时间序列 时间序列预测,最容易想到的就是那个马尔可夫模型: P ( y k ∣ x…

python深度学习之TCN实例

1.TCN的介绍 近些年,关于时间序列、自然语言处理等任务大家一般都会想到RNN、LSTM、GRU,一维CNN以及后面延伸出的Bi-Lstm、ConvLstm等等,这是因为RNN天生可以记住以前时段的信息,而传统的神经网络并不具有这个功能。卷积神经网络…

时间卷积网络TCN:时间序列处理的新模型

这篇文章回顾了基于TCN的解决方案的最新创新。我们首先介绍了一个运动检测的案例研究,并简要回顾了TCN架构及其相对于传统方法的优势,如卷积神经网络(CNN)和递归神经网络(RNN)。然后,我们介绍了一些使用TCN的应用,包括改进交通预测…

TCN论文及代码解读总结

前言:传统的时序处理,普遍采用RNN做为基础网络模型,如其变体LSTM、GRU、BPTT等。但是在处理使用LSTM时时序的卷积神经网络 目录 论文及代码链接一、论文解读1、 摘要2、引言(摘)3、时序卷积神经网络(Temporal Convolutional Networks)3.1 因果…

轨道交通中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 …