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

admin 4个月前 (05-21) 科技 43 0

什么是TCN

TCN全称Temporal Convolutional Network,时序卷积网络,是在2018年提出的一个卷积模子,然则可以用来处置时间序列。

卷积若何处置时间序列

时间序列展望,最容易想到的就是谁人马尔可夫模子:

\[P(y_k|x_k,x_{k-1},...,x_1) \]

就是盘算某一个时刻的输出值,已知条件就是这个时刻之前的所有特征值。上面公式中,P示意概率,可以不用管这个,\(y_k\)示意k时刻的输出值(标签),\(x_k\)示意k时刻的特征值。

若是使用LSTM或者是GRU这样的RNN模子,自然是可以处置这样的时间序列模子的,究竟RNN生来就是为了这个的。

然则这个时间序列模子,宏观上思索的话,实在就是对这个这个时刻之前的数据做某个操作,然后天生一个标签,回忆一下在卷积在图像中的操作,实在有异曲同工。(这里不明白也无妨,由于我之前搞了一段时间图像处置,以是对卷积相对熟悉一点)。

一维卷积

假设有一个时间序列,总共有五个时间点,譬喻说股市,有一个股票的价钱颠簸:[10,13,12,14,15]:

TCN中,或者说因果卷积中,使用的卷积核巨细都是2,我也不知道为啥不用更大的卷积核,看论文中似乎没有说明这个,若是有小伙伴知道缘故原由或者有料想,可以下方评论处一起讨论讨论。

卷积核是2,那么可想而知,对上面5个数据做一个卷积核为2的卷积是什么样子的:

五个数据经由一次卷积,可以酿成四个数据,然则每一个卷积后的数据都是基于两个原始数据获得的,以是说,现在卷积的视野域是2。

可以看到是输入是5个数据,然则经由卷积,酿成4个数据了,在图像中有一个观点是通过padding来保证卷积前后特征图尺寸稳定,以是在时间序列中,依然使用padding来保证尺寸稳定:

padding是左右两头都增添0,若是padding是1的话,就是上图的效果,实在会发生6个新数据,然则秉着:“输入输出尺寸相同”和“我们不能知道未来的数据”,以是最后边谁人未来的padding,就省略掉了,之后再代码中会体现出来。

总之,现在我们也许能明白,对时间序列卷积的大致流程了,也就是对一维数据卷积的历程(图像卷积算是二维)。

下面看若何使用Pytorch来实现一维卷积:

net = nn.Conv1d(in_channels=1,out_channels=1,kernel_size=2,stride=1,padding=1,dilation=1)

其中的参数跟二维卷积异常类似,也是有通道的观点的。这个好好品一下,一维数据的通道跟图像的通道一样,是凭据差别的卷积核从相同的输入中抽取出来差别的特征。kernel_size=2之前也说过了,padding=1也没问题,不外这个公式中如果输入5个数据+padding=1,会获得6个数据,最后一个数据被舍弃掉。dilation是膨胀系数,下面的下面会讲。

因果卷积

  • 因果卷积是在wavenet这个网络中提出的,之后被用在了TCN中。
    TCN的论文链接:
  • 因果卷积应为就是:Causal Convolutions。

之前已经讲了一维卷积的历程了,那么因果卷积,实在就是一维卷积的一种应用吧算是。

假设想用上面讲到的观点,做一个股票的展望决议模子,然后希望决议模子可以思量到这个时间点之前的4个时间点的股票价钱举行决议,总共有3种决议:

  • 0:不操作,1:买入,2:卖出

以是实在就是一个分类问题。由于要求视野域是4,以是根据上面的设想,要聚积3个卷积核为2的1维卷积层:
allbet gmaing代理:LSTM的备胎,用卷积处置时间序列——TCN与因果卷积(理论+Python实践) 第1张
三次卷积,可以让最后的输出,拥有4个视野域。就像是上图中红色的部门,就是做出一个决议的历程。

股票数据,往往是根据分钟纪录的,那少说也是十万、百万的数据量,我们决议,想要思量之前1000个时间点呢?视野域要是1000,那意味着要999层卷积?啥盘算机吃得消这样的盘算。以是引入了膨胀因果卷积。

膨胀因果卷积

  • 英文是Dilated Causal Convolution。这个实在就是朴陋卷积啦,不确定在之前的博文中有没有讲过这个观点(最近别人要求在写一个异常长的教程,和博客中的博文可能会有影象杂乱的情形2333)
  • 横竖就是,这个朴陋卷积、或者叫扩张卷积、或者叫膨胀卷积就是操作dilation这个参数。
    allbet gmaing代理:LSTM的备胎,用卷积处置时间序列——TCN与因果卷积(理论+Python实践) 第2张
    如图,这个就是dilation=2的时刻的情形,与之前的区别有两个:
  • 看红色区域:可以看到卷积核巨细依然是2,然则卷积核之间变得朴陋了,隔已往了一个数据;若是dilation=3的话,那么可以想而知,这个卷积核中心会空的更大,会隔已往两个数据。
  • 看淡绿色数据:由于dilation变大了,以是响应的padding的数目从1酿成了2,以是为了保证输入输出的特征维度相同,padding的数值即是dalition的数值(在卷积核是2的情形下,严酷说说:padding=(kernel_size-1)*dilation)

然后我们依然实现上面谁人例子,每次决议想要视野域为4:
allbet gmaing代理:LSTM的备胎,用卷积处置时间序列——TCN与因果卷积(理论+Python实践) 第3张
可以看到,第一次卷积使用dilation=1的卷积,然后第二次使用dilation=2的卷积,这样通过两次卷积就可以实现视野域是4.

那么假设事业域要是8呢?那就再加一个dilation=4的卷积。dilation的值是2的次方,然后视野域也是2的次方的增进,那么就算是要1000视野域,那十层也许就行了。

这里有一个动图,挺悦目的:
allbet gmaing代理:LSTM的备胎,用卷积处置时间序列——TCN与因果卷积(理论+Python实践) 第4张

TCN结构

TCN基本就是一个膨胀因果卷积的历程,只是上面我们实现因果卷积就只有一个卷积层。而TCN的稍微庞大一点(然则不难!)

  • 卷积竣事后会由于padding导致卷积之后的新数据的尺寸B>输入数据的尺寸A,以是只保留输出数据中前面A个数据;
  • 卷积之后加上个ReLU和Dropout层,不外分吧这要求。
  • 然后TCN中并不是每一次卷积都市扩大一倍的dilation,而是每两次扩大一倍的dilation
  • 总之TCN中的基本组件:TemporalBlock()是两个dilation相同的卷积层,卷积+修改数据尺寸+relu+dropout+卷积+修改数据尺寸+relu+dropout
  • 之后弄一个Resnet残差连接来制止梯度消逝,竣事!
    关于Resnet的内容:【从零学习PyTorch】 若何残差网络resnet作为pre-model +代码解说+残差网络resnet是个啥实在不看也行,不故障明白TCN

模子的PyTorch实现(最好领会一点PyTorch)

若是不领会的话,emm,我要安利我的博文了2333:
从零学习pytorch 第5课 PyTorch模子搭建三要素

# 导入库
import torch
import torch.nn as nn
from torch.nn.utils import weight_norm
# 这个函数是用来修剪卷积之后的数据的尺寸,让其与输入数据尺寸相同。
class Chomp1d(nn.Module):
    def __init__(self, chomp_size):
        super(Chomp1d, self).__init__()
        self.chomp_size = chomp_size

    def forward(self, x):
        return x[:, :, :-self.chomp_size].contiguous()

可以看出来,这个函数就是第一个数据到倒数第chomp_size的数据,这个chomp_size就是padding的值。譬喻说输入数据是5,padding是1,那么会发生6个数据没错吧,那么就是保留前5个数字。

# 这个就是TCN的基本模块,包罗8个部门,两个(卷积+修剪+relu+dropout)
# 内里提到的downsample就是下采样,实在就是实现残差链接的部门。不明白的可以无视这个
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 None
        self.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)

最后就是TCN的主网络了:

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 ** i
            in_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)

咋用的呢?就是num_inputs就是输入数据的通道数,一样平常就是1; num_channels应该是个列表,其他的np.array也行,譬喻说是[2,1]。那么整个TCN模子包罗两个TemporalBlock,整个模子共有4个卷积层,第一个TemporalBlock的两个卷积层的膨胀系数\(dilation=2^0=1\),第二个TemporalBlock的两个卷积层的膨胀系数是\(dilation=2^1=2\).

没了,整个TCN挺简朴的,若是之前学过PyTorch和图像处置的一些内容,然后用TCN来上手时间序列,效果会和LGM差不多。(凭据最近做的一个竞赛),没有跟Wavenet对照过,Wavenet的pytorch资源看起来怪庞大的,由于wavenet是用来处置音频天生的,会加倍庞大一点。

总之TCN就这么多,谢谢人人。

,

Sunbet

Sunbet www.yingerchevip.com Sunbet致力打造完美娱乐平台,为客户提供精彩绝伦的娱乐体验,各种娱乐方式让您大开眼界。sunbet等着你!

皇冠APP声明:该文看法仅代表作者自己,与本平台无关。转载请注明:allbet gmaing代理:LSTM的备胎,用卷积处置时间序列——TCN与因果卷积(理论+Python实践)

网友评论

  • (*)

最新评论

站点信息

  • 文章总数:539
  • 页面总数:0
  • 分类总数:8
  • 标签总数:985
  • 评论总数:166
  • 浏览总数:2702