zz# 《异常检测——从经典算法到深度学习》
- 0 概论
- 1 基于隔离森林的异常检测算法
- 2 基于LOF的异常检测算法
- 3 基于One-Class SVM的异常检测算法
- 4 基于高斯概率密度异常检测算法
- 5 Opprentice——异常检测经典算法最终篇
- 6 基于重构概率的 VAE 异常检测
- 7 基于条件VAE异常检测
- 8 Donut: 基于 VAE 的 Web 应用周期性 KPI 无监督异常检测
- 9 异常检测资料汇总(持续更新&抛砖引玉)
- 10 Bagel: 基于条件 VAE 的鲁棒无监督KPI异常检测
- 11 ADS: 针对大量出现的KPI流快速部署异常检测模型
- 12 Buzz: 对复杂 KPI 基于VAE对抗训练的非监督异常检测
- 13 MAD: 基于GANs的时间序列数据多元异常检测
- 14 对于流数据基于 RRCF 的异常检测
- 15 通过无监督和主动学习进行实用的白盒异常检测
- 16 基于VAE和LOF的无监督KPI异常检测算法
- 17 基于 VAE-LSTM 混合模型的时间异常检测
- 18 USAD:多元时间序列的无监督异常检测
- 19 OmniAnomaly:基于随机循环网络的多元时间序列鲁棒异常检测
- 20 HotSpot:多维特征 Additive KPI 的异常定位
- 21 Anomaly Transformer: 基于关联差异的时间序列异常检测
- 22 Kontrast: 通过自监督对比学习识别软件变更中的错误
- 23TimesNet: 用于常规时间序列分析的时间二维变化模型
相关:
- VAE 模型基本原理简单介绍
- GAN 数学原理简单介绍以及代码实践
- 单指标时间序列异常检测——基于重构概率的变分自编码(VAE)代码实现(详细解释)
23. TimesNet: 用于常规时间序列分析的时间二维变化模型
论文名称:TIMESNET: TEMPORAL 2D-VARIATION MODELING FOR GENERAL TIME SERIES ANALYSIS
论文发表于 International Conference on Learning Representations 2023
论文下载:openreview
源码地址:https://github.com/thuml/TimesNet
23.1 论文概述
这篇论文的主要内容是介绍了一种新的方法来处理时间序列分析中的复杂时间模式。该方法将一维时间序列转换为二维张量,以便更好地发现多个周期内和周期间的变化。作者提出的TimesNet with TimesBlock 是一种通用的时间序列分析骨干(Backbone)网络,可以用于多种分析任务。该论文还介绍了一些实验结果和性能比较,以证明该方法的有效性和优越性。
该论文提出的方法主要包括以下技术:
-
TimesBlock:可以将一维时间序列自适应地转换为一组二维张量,并通过一个参数高效的Inception块来捕获二维空间中的周期内和周期间变化的模块。TimesBlock的设计使得它可以自适应地发现多个周期内和周期间的变化,并且可以通过Inception块来捕获这些变化。
-
TimesNet:这是一种通用的时间序列分析骨干网络,可以用于多种分析任务。TimesNet使用了TimesBlock模块来处理时间序列,并利用现有的视觉骨干网络来进一步提高性能。TimesNet的设计使得它可以自适应地发现多个周期内和周期间的变化,并且可以通过Inception块来捕获这些变化。
-
多周期性:该论文提出了一种新的思路,即将时间序列转换为二维张量,以便更好地发现多个周期内和周期间的变化。这种方法可以更好地捕获时间序列中的复杂模式,并且可以用于多种分析任务。
-
实验结果和性能比较:该论文通过实验结果和性能比较证明了TimesNet的有效性和优越性。作者在五个主流的时间序列分析任务中进行了实验,包括短期和长期预测、填充、分类和异常检测。实验结果表明,TimesNet在这些任务中均取得了一致的最先进性能。
23.2 相关技术
该论文提出的方法主要包括以下技术:
在该论文的RELATED WORK模块中,作者介绍了一些与他们的工作相关的先前研究。这些研究主要涉及时间序列分析和深度学习领域的一些关键技术和方法。以下是一些相关的研究:
-
时间序列分析:该部分介绍了时间序列分析的一些基本概念和方法,包括时间序列的基本特征、时间序列分解、周期性分析、自回归模型、移动平均模型等。
-
卷积神经网络(CNN):该部分介绍了CNN在时间序列分析中的应用。CNN可以通过卷积操作来捕获时间序列中的局部模式,并且可以通过池化操作来减少参数数量和计算量。
-
循环神经网络(RNN):该部分介绍了RNN在时间序列分析中的应用。RNN可以通过循环连接来处理时间序列中的时序信息,并且可以通过长短时记忆(LSTM)单元来处理长期依赖关系。
-
注意力机制:该部分介绍了注意力机制在时间序列分析中的应用。注意力机制可以通过对时间序列中不同部分的加权来提高模型的性能,并且可以通过自注意力机制来处理时间序列中的长期依赖关系。
-
时空卷积神经网络(ST-CNN):该部分介绍了ST-CNN在时间序列分析中的应用。ST-CNN可以通过卷积操作来捕获时间序列中的时空信息,并且可以通过池化操作来减少参数数量和计算量。
23.3 核心方法
23.3.1 论文结构梳理
Section | 内容概述 |
---|---|
1. INTRODUCTION | 相关背景介绍以及对本论文的概述 |
2. RELATED WORK | 相关技术介绍 |
3. TIMESNET | 论文主题部分 |
4. EXPERIMENTS | 实验部分 |
5. CONCLUSION AND FUTURE WORK | 总结以及未来工作 |
读者应当重点关注第3部分,如果需要对论文复现的话考虑读一些第4部分。
请一定不要太在意论文的结果复现时与你本地测试的结果不一致的问题,因为导致结果有所差异的原因很多,我们不是审稿员,也没有必要太较真实验结果。主要还是理清楚核心过程。
23.3.2 INTRODUCTION
本文从多周期性这一新的维度对时间序列进行分析,以解决复杂的时间变化问题。首先,我们观察到现实世界的时间序列通常呈现多周期性,例如天气观测的日变化和年变化,电力消耗的周变化和季度变化。这些多个时期相互重叠和相互作用,使得变化建模变得棘手。其次,对于每个时段,我们发现每个时间点的变化不仅受其相邻区域的时间模式的影响,而且与其相邻时段的变化高度相关。为了清楚起见,我们将这两种时间变化分别命名为期内变化和期间变化。前者表示一个时期内的短期时间模式。后者可以反映连续不同时期的长期趋势。注意,对于没有明确周期性的时间序列,变化将由周期内变化主导,并且等价于具有无限周期长度的时间序列。
由于不同的周期会导致不同的周期内和周期间的变化,多周期性可以自然地衍生出一个模块化的架构,用于时间变化建模,在那里我们可以捕获由某个特定的周期在一个模块中产生的变化。此外,这种设计使复杂的时间模式被解开,有利于时间变化建模。然而,值得注意的是,一维时间序列很难同时明确地呈现两种不同类型的变化。为了解决这个障碍,我们扩展到二维空间的时间变化的分析。具体来说,如图1所示,我们可以将一维时间序列重塑为二维张量,其中每列包含一个周期内的时间点,每行包含不同周期中同一阶段的时间点。因此,通过将一维时间序列变换为二维张量,可以突破一维空间的表征能力瓶颈,成功地将二维空间的周期内和周期间变化统一起来,得到时间二维变化。
在技术上,基于上述动机,我们超越了以前的骨干,提出了TimesNet作为一个新的任务通用模型的时间序列分析。通过TimesBlock的授权,TimesNet可以发现时间序列的多周期性,并在模块化架构中捕获相应的时间变化。具体来说,TimesBlock可以根据学习的周期自适应地将一维时间序列转换为一组二维张量,并通过参数高效的初始块进一步捕获二维空间中的周期内和周期间变化。在实验中,TimesNet在五个主流分析任务中实现了一致的最先进水平,包括短期和长期预测,插补,分类和异常检测。我们的贡献可归纳为三个方面:
- 基于多周期性和周期内、周期间复杂的相互作用,本文提出了一种时间变化建模的模块化方法。通过将一维时间序列转换到二维空间,我们可以同时呈现期内和期间的变化。
- 我们提出了TimesNet与TimesBlock发现多个周期和捕获时间的二维变化从变换的二维张量的参数有效的起始块。
- 作为一个通用的任务基础模型,TimesNet在五个主流的时间序列分析任务中达到了一致的先进水平。包括详细和有见地的可视化。
23.3.3 模型结构 1 —— 将一维变分变换为二维变分
如图1所示,每个时间点同时涉及两种类型的时间变化,即与其相邻区域的时间变化和不同时期之间的相同相位的时间变化,即期内变化和期间变化。然而,这种原始的时间序列的一维结构只能呈现相邻时间点之间的变化。为了解决这个问题,我们探索了时间变化的二维结构,它可以显式地呈现周期内和周期之间的变化,从而在表示能力方面具有更多优势,并有利于后续的表示学习。
具体地说,对于 C C C 个长度为 T T T 的时间序列记录变量(recorded variates),其原始一维组织形式为 X 1D ∈ R T × C \mathbf{X}_\text{1D} \in \mathbb{R}^{T×C} X1D∈RT×C。为了表示周期间的变化,我们需要首先发现周期。从技术上讲,我们通过快速傅里叶变换(Fast Fourier Transform,FFT)在频域中分析时间序列如下:
A = Avg ( Amp ( FFT ( X l D ) ) ) , { f 1 , ⋯ , f k } = arg Topk ( A ) , p i = ⌈ T f i ⌉ , i ∈ { 1 , ⋯ , k } . (1) \mathbf{A}=\text{Avg}\left(\text{ Amp }\left(\text{ FFT}(\mathbf{X}_{\mathrm{lD}})\right)\right),\{f_1,\cdots,f_k\}=\text{ arg Topk }\left(\mathbf{A}\right),p_i=\left\lceil\frac{T}{f_i}\right\rceil,i\in\{1,\cdots,k\}.\tag{1} A=Avg( Amp ( FFT(XlD))),{f1,⋯,fk}= arg Topk (A),pi=⌈fiT⌉,i∈{1,⋯,k}.(1)
其中, FFT ( ⋅ ) \text{FFT}(\cdot) FFT(⋅) 和 Amp ( ⋅ ) \text{Amp}(\cdot) Amp(⋅) 表示FFT和幅度值的计算。 A ∈ R T \mathbf{A}\in \mathbb{R}^T A∈RT 表示每个频率的计算振幅,这是从 C C C 维平均 Avg ( ⋅ ) \text{Avg}(\cdot) Avg(⋅)。注意,第 j j j 个值 A j A_j Aj 表示与周期长度对应的频率 j j j 周期基函数的强度 ⌈ T j ⌉ \lceil {\frac{T}{j}} \rceil ⌈jT⌉。考虑到频域的稀疏性和避免无意义的高频带来的噪声,我们只选择前 k k k 个幅度值 f 1 , . . . , f k f_1,...,f_k f1,...,fk 并获得最重要的频率 { A f 1 , . . . . , A f k } \{\mathbf{A}_{f_1},....,\mathbf{A}_{f_k}\} {Af1,....,Afk},其中 k k k 是超参数。这些选择的频率也对应于 k k k 个周期长度 { p i , . . . , p k } \{p_i, ..., p_k\} {pi,...,pk}。由于频域的共轭性,我们只考虑 { 1 , . . . , [ T 2 ] } \{1, ..., [\frac{T}{2}]\} {1,...,[2T]}内的频率。我们将等式1总结如下:
A , { f 1 , ⋯ , f k } , { p 1 , ⋯ , p k } = P e r i o d ( X 1 D ) (2) \mathbf{A},\{f_{1},\cdots,f_{k}\},\{p_{1},\cdots,p_{k}\}=\mathrm{Period}(\mathbf{X}_{1\text{D}} ) \tag{2} A,{f1,⋯,fk},{p1,⋯,pk}=Period(X1D)(2)
基于选定的频率 { f 1 , . . . , f k } \{f_1, ..., f_k\} {f1,...,fk} 和相应的周期长度 { p 1 , . . . , p k } \{p_1, ..., p_k\} {p1,...,pk},我们可以通过以下等式将一维时间序列 X 1 D ∈ R T × C \mathbf{X}_{1D} \in \mathbb{R}^{T\times C} X1D∈RT×C 整形为多个二维张量:
X 2 D i = Reshape p i , f i ( Padding ( X 1 D ) ) , i ∈ { 1 , ⋯ , k } (3) \mathbf{X}_{2 \mathrm{D}}^i=\operatorname{Reshape}_{p_i, f_i}\left(\operatorname{Padding}\left(\mathbf{X}_{1 \mathrm{D}}\right)\right), i \in\{1, \cdots, k\} \tag{3} X2Di=Reshapepi,fi(Padding(X1D)),i∈{1,⋯,k}(3)
其中 Padding ( ⋅ ) \text{Padding}(\cdot) Padding(⋅) 是将时间序列沿着时间维度扩展零,以使其与 Reshape p i , f i \text{Reshape}_{p_i, f_i} Reshapepi,fi ( ⋅ ) (\cdot) (⋅) 兼容,其中 p i p_i pi 和 f i f_i fi 分别表示变换后的二维张量的行数和列数。注意, X 2D i ∈ R p i × f i × C \mathbf{X}^i_{\text{2D}} \in \mathbb{R}^{p_i \times f_i \times C} X2Di∈Rpi×fi×C 表示基于频率 f i f_i fi 的第 i i i 个整型时间序列,其列和行分别表示相应周期长度 p i p_i pi 下的周期内变化和周期间变化。最终,如图2 所示,基于所选择的频率和估计的周期,我们获得一组二维张量 X 2 D 1 , . . . , X 2 D k \mathbf{X}^1_{2D},...,\mathbf{X}^k_{2D} X2D1,...,X2Dk ,其指示由不同周期导出的 k k k 个不同的时间二维张量。
同样值得注意的是,这种变换为变换后的2维张量带来了两种类型的局部,即相邻时间点(列,周期内变化)和相邻周期(行,周期间变化)之间的局部。因此,时间二维变换可以容易地由二维内核处理。
23.3.4 模型结构 2 —— TIMESBLOCK
如图3所示,我们以残差方式组织 TimesBlock。具体地说,对于长度为
T
T
T 的一维输入时间序列
X
1D
∈
R
T
×
C
\mathbf{X}_{\text{1D}} \in \mathbb{R}^{T \times C}
X1D∈RT×C,我们首先通过嵌入层
X
1D
0
=
Embed
(
X
1
D
)
\mathbf{X}^0 _{\text{1D}} = \text{Embed}(\textbf{X}_{1\text{D}})
X1D0=Embed(X1D) 将原始输入投影到深度特征
X
1D
0
∈
R
T
×
d
\mathbf{X}^0_{\text{1D}} \in \mathbb{R}^{T\times d}
X1D0∈RT×d 模型中。对于 TimesNet 的第
l
l
l 层,输入是
X
1D
l
−
1
∈
R
T
×
d
m
o
d
e
l
\mathbf{X}^{l−1}_{\text{1D}} \in \mathbb{R}^{T\times d_{model}}
X1Dl−1∈RT×dmodel,该过程可以形式化为:
X 1 D l = TimesBlock ( X 1 D l − 1 ) + X 1 D l − 1 (4) \mathbf{X}_{1 \mathrm{D}}^l=\text { TimesBlock }\left(\mathbf{X}_{1 \mathrm{D}}^{l-1}\right)+\mathbf{X}_{1 \mathrm{D}}^{l-1} \tag{4} X1Dl= TimesBlock (X1Dl−1)+X1Dl−1(4)
如图3所示,对于第 L L L 个TimesBlock,整个过程包括两个连续的部分:捕获时间二维变化和自适应地聚合来自不同时期的表示。
捕获时间2D变化 类似于等式1,我们可以通过 Period ( ⋅ ) \text{Period}(\cdot) Period(⋅) 估计深度特征 X 1D l − 1 \mathbf{X}^{l-1}_{\text{1D}} X1Dl−1 的周期长度。基于估计的周期长度,我们可以将一维时间序列变换到二维空间,得到一组二维张量,从这组张量中我们可以得到二维空间的参数有效信息表示,并得到一组二维张量,从这组张量中我们可以方便地得到参数有效起始块的信息表示。该过程形式化如下:
A l − 1 , { f 1 , ⋯ , f k } , { p 1 , ⋯ , p k } = Period ( X 1 D l − 1 ) X 2 D l , i = Reshape p i , f i ( Padding ( X 1 D l − 1 ) ) , i ∈ { 1 , ⋯ , k } X ^ 2 D l , i = Inception ( X 2 D l , i ) , i ∈ { 1 , ⋯ , k } X ^ 1 D l , i = Trunc ( Reshape 1 , ( p i × f i ) ( X ^ 2 D l , i ) ) , i ∈ { 1 , ⋯ , k } , (5) \begin{aligned} \mathbf{A}^{l-1},\left\{f_1, \cdots, f_k\right\},\left\{p_1, \cdots, p_k\right\} & =\operatorname{Period}\left(\mathbf{X}_{1 \mathrm{D}}^{l-1}\right) \\ \mathbf{X}_{2 \mathrm{D}}^{l, i} & =\operatorname{Reshape}_{p_i, f_i}\left(\operatorname{Padding}\left(\mathbf{X}_{1 \mathrm{D}}^{l-1}\right)\right), i \in\{1, \cdots, k\} \\ \widehat{\mathbf{X}}_{2 \mathrm{D}}^{l, i} & =\operatorname{Inception}\left(\mathbf{X}_{2 \mathrm{D}}^{l, i}\right), i \in\{1, \cdots, k\} \\ \widehat{\mathbf{X}}_{1 \mathrm{D}}^{l, i} & =\operatorname{Trunc}\left(\operatorname{Reshape}_{1,\left(p_i \times f_i\right)}\left(\widehat{\mathbf{X}}_{2 \mathrm{D}}^{l, i}\right)\right), i \in\{1, \cdots, k\}, \tag{5} \end{aligned} Al−1,{f1,⋯,fk},{p1,⋯,pk}X2Dl,iX 2Dl,iX 1Dl,i=Period(X1Dl−1)=Reshapepi,fi(Padding(X1Dl−1)),i∈{1,⋯,k}=Inception(X2Dl,i),i∈{1,⋯,k}=Trunc(Reshape1,(pi×fi)(X 2Dl,i)),i∈{1,⋯,k},(5)
其中 X 2D l , i ∈ R p i × f i × d m o d e l \mathbf{X}_{\text{2D}}^{l,i}\in\mathbb{R}^{p_i\times f_i \times d_{model}} X2Dl,i∈Rpi×fi×dmodel 表示第 i i i 个变换而得的二维向量。转换完成以后,我们通过参数有效的初始块将2D张量处理为初始 Inspection ( ⋅ ) \text{Inspection}(\cdot) Inspection(⋅),该初始块涉及多维2D核(multi-scale 2D kernels),是最知名的视觉骨干之一。然后,我们将学习到的2D表示 X ^ 2 D l , i \widehat{\mathbf{X}}_{2 \mathrm{D}}^{l, i} X 2Dl,i 转换回一维空间 X ^ 1 D l , i ∈ R T × d model \widehat{\mathbf{X}}_{1 \mathrm{D}}^{l, i} \in \mathbb{R}^{T \times d_{\text {model }}} X 1Dl,i∈RT×dmodel 从而用于聚合,其中我们使用 Trunc ( ⋅ ) \text{Trunc}(\cdot) Trunc(⋅) 将长度为 ( p i × f i ) (p_i \times f_i) (pi×fi) 的填充序列截断为原始长度 T T T。
注意,得益于一维时间序列的转换,起始块中的2D核可以同时聚合多尺度周期内变化(列)和周期间变化(行),覆盖相邻时间点和相邻周期。此外,我们对不同的重构 2D 张量 { X 2 D l , 1 , ⋯ , X 2 D l , k } \left\{\mathbf{X}_{2 \mathrm{D}}^{l, 1}, \cdots, \mathbf{X}_{2 \mathrm{D}}^{l, k}\right\} {X2Dl,1,⋯,X2Dl,k} 采用了共享的起始块来提高参数效率,这可以使模型大小对超参数k的选择保持不变。
自适应聚合 最后,我们需要为下一层融合 k k k 个不同的 1D 表示 { X ^ 1 D l , 1 , ⋯ , X ^ 1 D l , k } \left\{\widehat{\mathbf{X}}_{1 \mathrm{D}}^{l, 1}, \cdots, \widehat{\mathbf{X}}_{1 \mathrm{D}}^{l, k}\right\} {X 1Dl,1,⋯,X 1Dl,k}。受自相关的启发,幅度 A A A 可以反映所选择的频率和周期的相对重要性,从而对应于每个变换的2D张量的重要性。因此,我们基于振幅聚合1D表示:
A ^ f 1 l − 1 , ⋯ , A ^ f k l − 1 = Softmax ( A f 1 l − 1 , ⋯ , A f k l − 1 ) X 1 D l = ∑ i = 1 k A ^ f i l − 1 × X ^ 1 D l , i (6) \begin{aligned} \widehat{\mathbf{A}}_{f_1}^{l-1}, \cdots, \widehat{\mathbf{A}}_{f_k}^{l-1} & =\operatorname{Softmax}\left(\mathbf{A}_{f_1}^{l-1}, \cdots, \mathbf{A}_{f_k}^{l-1}\right) \\ \mathbf{X}_{1 \mathrm{D}}^l & =\sum_{i=1}^k \widehat{\mathbf{A}}_{f_i}^{l-1} \times \widehat{\mathbf{X}}_{1 \mathrm{D}}^{l, i} \end{aligned} \tag{6} A f1l−1,⋯,A fkl−1X1Dl=Softmax(Af1l−1,⋯,Afkl−1)=i=1∑kA fil−1×X 1Dl,i(6)
由于周期内和周期之间的变化已经涉及到多个高度结构化的2D张量,TimesBlock可以同时完全捕获多尺度时间2D变化。因此,TimesNet可以实现比直接从1D时间序列更有效的表示学习。
2D视觉主干的通用性 受益于1D时间序列到时间2D变化的转换,我们可以选择各种计算机视觉骨干来代替表示学习的初始块,例如广泛使用的 ResNet 和ResNeXt,先进的 ConvNeXt 和基于注意力的模型。因此,我们的时间二维变化设计也将一维时间序列与蓬勃发展的二维视觉骨干连接起来,使时间序列分析能够利用计算机视觉社区的发展。一般来说,用于表示学习的更强大的2D主干将带来更好的性能。考虑到性能和效率(图4右),我们基于参数高效的初始块进行主要实验,如公式5所示。
23.4 论文实验
特此声明:如果不打算基于这篇论文的源码开发,亦或者不需要了解代码细节,完全不需要运行所有源码。主要把论文思路梳理清楚就差不多了。因为复现这些源码比较麻烦,至少需要一张还过得去的显卡。不过有条件、有时间、感兴趣的同学可以试试。
23.4.1 数据准备
前去本论文的提到的github地址可以找到对应的谷歌云盘、清华云盘(当前已经失效)以及百度云盘的下载链接,如果觉得麻烦的话,可以考虑访问我的夸克云盘,地址如下:
夸克云盘
链接:https://pan.quark.cn/s/b167f0d17234
提取码:wQKX
数据文件解压的相对地址等,将在后面介绍。
23.4.2 源码准备
前去本论文提到的github地址,把源码clone或下载到本地,然后把前面下载的数据集压缩包接下,注意相对路径,而且需要把解压后的文件夹重命名为 dataset。如图所示:
23.4.3 安装相关依赖
为了尽可能地减少麻烦,先保证使用的python版本与论文实验一致,即 3.8,其次确保安装好了与显卡对应的驱动,确保cuda可用,这些方面的坑太多太多,所以为了避免继续踩坑,尽可能与原论文的版本保持一致。如图所示:
23.4.4 执行脚本
安装依赖以后,我们不妨写几行代码,确保 cuda 可用。
import torch
print(torch.cuda.is_available())
接着可以直接执行作者已经给我们写好的脚本,注意,可能出现GPU不能用的情况
编辑这个 sh 脚本文件,并如图所示,修改使用GPU的索引为0,因为我只有一张显卡,只能使用索引为0的显卡。
其他脚本皆是如此,如果只有一张显卡,就把脚本第一行最后一个值改为 0。
其他的脚本运行方法均是如此,唯一需要注意的就是 export CUDA_VISIBLE_DEVICES=0
确保是自己想用的显卡的序号。
23.5 总结
本篇论文介绍了一种新的方法,通过将一维时间序列转换为二维张量来处理时间序列分析中的复杂时间模式。作者提出的TimesNet with TimesBlock是一种通用的时间序列分析模型,可以发现时间序列中的多个周期内和周期间的变化。该模型在五个主流时间序列分析任务中表现出了很好的通用性和性能。作者还提出了未来的研究方向,包括在大规模预训练中进一步探索利用TimesNet作为骨干的方法,以及在实际应用中的潜在应用。
论文提供的源码集成了一些其他的算法,对于需要做比对实验的人来说,简直是太方便了。并且,如果你设计了某个算法,可以基于TimesNet 源码架构进行开发,然后合并到代码仓库中作为其中一个算子,简单方便直观,给作者团队点赞 ~
Smileyan
2023.10.31 22:58