目录

1.最一开始的输入和encoder之前的处理

2.得到seasonal和trend

3.拼接得到seasonal和trend

4.对原始的向量进行编码得到输出

5.接下来进入了encoder的部分

5.1整个encoder的架构

5.2整个encoder_layer的架构

5.3attention的计算


1.最一开始的输入和encoder之前的处理

这里mean和zeros的维度都是(32,96,7)。而输入的x_enc的维度也是(32,96,7)。对mean和zeros进行查看。如下图:

crossattention的pytorch实现 pytorch self attention_目标检测

crossattention的pytorch实现 pytorch self attention_python_02

crossattention的pytorch实现 pytorch self attention_目标检测_03

2.得到seasonal和trend

接下来将会得到论文中所讲到的两个部分,一个是seasonal一个是trend。这个decomp这个函数的需要的输入是(x_enc),

crossattention的pytorch实现 pytorch self attention_python_04

 

而decomp是series_decomp这个方法的实例化,这个方法需要一个Kernel_size。(一般这个参数都是卷积才会用到的,所以这里的操作类似卷积?)

crossattention的pytorch实现 pytorch self attention_人工智能_05

 接下来到了series_decomp这个函数这里,这个函数重点的地方在初始化的地方,他只有一个moving_avg这个方法,而这个方法需要的参数和卷积很像。到了这里这个x的维度是(32,96,7)也就是最一开始的那个dec后的向量。目标是对这个向量进行分解

crossattention的pytorch实现 pytorch self attention_机器学习_06

接下来到了最里面的部分也就是moving_avg这个函数,这个函数仅仅需要一个kernel_size和一个一维卷积。看来这个主要的操作也就是卷积操作。

crossattention的pytorch实现 pytorch self attention_机器学习_07


x[:, 0:1, :]:这个是(32,1,7)的维度。


front = x[:, 0:1, :].repeat(1, (self.kernel_size - 1) // 2, 1):这个是将第二个维度进行扩充变成了12。


end = x[:, -1:, :].repeat(1, (self.kernel_size - 1) // 2, 1):这个end是将倒数第一个维度进行扩充变成了12。所以到了这里,front和end的维度都是变成了(32,12,7)。而原来的输入的x的维度是(32,96,7)。为了形成对比方便理解记录一下。一前一后都是取这个原来的x的其中一个维度进行复制12份,而原来的x的维度是(32,96,7)。


x = torch.cat([front, x, end], dim=1)。这一步是将这三个矩阵进行叠加,形成了一个维度为(32,120,7)的新的向量。


x = self.avg(x.permute(0, 2, 1))。这一步是对这个x进行卷积的操作,permute是将tensor的维度进行换位。这一步结束后,x的维度是(32,7,96)。


x = x.permute(0, 2, 1)。这一步是对x进行维度的换,经过这一次x的维度变成了(32,96,7)。


crossattention的pytorch实现 pytorch self attention_机器学习_08

这个repeat的用法是这样的:

crossattention的pytorch实现 pytorch self attention_目标检测_09

 

crossattention的pytorch实现 pytorch self attention_python_10

到了这一步,这个movingmean是刚才出来的卷积后的tensor。也就是(32,96,7)的维度的数据。这个res是用x来减去这个moving_mean,得到的是res,也就是整个返回的结果。也就是说整个series_decomp这个class返回的结果是一个是进行首尾相加然后卷积出来的moving_mean,还有一个就是res这个res是利用原来的x减去moving_mean的结果。这两个向量的维度都是(32,96,7)的维度。

crossattention的pytorch实现 pytorch self attention_机器学习_11

 然后返回到整个model的结构这里这里返回的的seasonal_init,trend_init都是刚才返回的结果。也就是说,上文用原本的x减去叠加卷积的x得到的res是seasonal_init,moving_mean也就是trend_init,也就是说叠加后再进行卷积得到的是这个长期的?用原本的x减去叠加卷积后的x是短期的seasonal_init?

crossattention的pytorch实现 pytorch self attention_python_12

3.拼接得到seasonal和trend

到了这一步,这个label_len是(48),所以取trend_init的后48位和mean进行拼接。取seasonal_init的后48位置和zeros进行拼接,得到最终的trend_init和seasonal_init。这两个向量的维度都是(32,144,7)。

到这里总结一下,

1.seasonal_init是怎么来的:seasonal_init,是decomp的第一个参数,也就是对原本的x进行叠加和卷积后的moving_mean,用原本的x进行减去他得到的结果。对于这个结果是(32,96,7)然后再取后48位,利用这个和zeros进行拼接,得到一个(32,144,7)的向量。

2.trend_init是怎么来的:trend_init是decomp的第二个参数,也就是对x进行叠加和卷积后的moving_mean这个本体,然后对于这个数进行取后48位置,和mean进行拼接,得到一个(32,144,7)的向量。

crossattention的pytorch实现 pytorch self attention_机器学习_13

 也就是如论文中下面这几个图所示的部分,

crossattention的pytorch实现 pytorch self attention_神经网络_14

 

crossattention的pytorch实现 pytorch self attention_python_15

 

crossattention的pytorch实现 pytorch self attention_目标检测_16

4.对原始的向量进行编码得到输出

接下来到了这一步,这一步对x_enc进行编码,得到了一个(32,96,512)的维度的词编码,这个词编码是对最原始的x_enc进行编码得到的,还没有和season和trend这两个部分联系上。

crossattention的pytorch实现 pytorch self attention_神经网络_17

5.接下来进入了encoder的部分

encoder,应该是在整个部分比较重要的结构。记录一下这里传入的enc_out是对原本的x进行编码的数据,也就是(32,96,512)的维度的数据。

crossattention的pytorch实现 pytorch self attention_python_18

5.1整个encoder的架构

整个encoder部分,重要的部分只有一个EncoderLayer层。

crossattention的pytorch实现 pytorch self attention_神经网络_19

 整个EncoderLayer其中有两个比较重要的部分,一个是AutoCorrelation还有一个是moving_avg。反映在论文中的如下图,

crossattention的pytorch实现 pytorch self attention_神经网络_20

 论文中的图,如下:根据代码中猜测,红色和绿色的中间应该是还有两层卷积层进行信息的提取,一个EncoderLayer层包括一个Auto-Correlation的计算,还有两个Series Decomp的分解。

crossattention的pytorch实现 pytorch self attention_目标检测_21

5.2整个encoder_layer的架构

整个EncoderLayer对应的部分如下图所示,

crossattention的pytorch实现 pytorch self attention_目标检测_22

crossattention的pytorch实现 pytorch self attention_python_23

 然后进入了Encoderlayer里面,也就是Encoder的attn_layer,也就是Encoderlayer。

crossattention的pytorch实现 pytorch self attention_机器学习_24

接下来查看整个EncoderLayer层在做什么

crossattention的pytorch实现 pytorch self attention_神经网络_25

对应论文中的如下图:

crossattention的pytorch实现 pytorch self attention_机器学习_26

 整个层大概分为这四个部分,发现到最后decomp只返回了第一个参数作为res,查看这个res看看他是哪个部分。查看series_decomp这个函数,发现res是利用原本的x对原本的x进行叠加和卷积后减去的这个结果。也就是一开始的seasonal的部分。

crossattention的pytorch实现 pytorch self attention_神经网络_27

5.3attention的计算

然后正式进入了EncoderLayer层的,attention的计算的部分:

crossattention的pytorch实现 pytorch self attention_机器学习_28

这个attention的计算也就是AutoCorrelationLayer这个部分:发现这个部分相比于Transformer的attention的计算中主要有区别的就是inner_correlation这个部分。

crossattention的pytorch实现 pytorch self attention_python_29

 接下来进入到了其中最麻烦的部分也就是,AutoCorrelation的计算的部分。

crossattention的pytorch实现 pytorch self attention_机器学习_30