Informer模型学习记录

Informer 时间序列模型

data

1. WTH.csv

ETT是电力长期调配中的重要指标。我们收集了中国两个分离的县2年的数据。为了探索LSTF问题的粒度,我们分别创建了1小时级别的{ ETTh1,ETTh2 }和15分钟级别的ETTm1数据集。每个数据点由目标值"油温"和6个电力负荷特征组成。Train / Val / Test为12 / 4 / 4个月。

  • csv格式数据,总共13列,包含一列标签,12列特征,后面输入模型维度:12
  • 每隔一小时一条记录
  • 每个时间点对应多个特征,最后一个数据值作为数据标签

2. ECL.csv

  • csv格式数据
    收集321个客户的用电量( Kwh )。由于缺失数据( Li等2019),将数据集转换为2年的小时消费,并将' MT 320 '设为目标值。Train / Val / Test为15 / 3 / 4个月。

3. Weather

该数据集包含了2010年至2013年4年间近1600个美国地方的气候数据,其中每1小时收集一次数据点。

3. data_loader

cols = list(df_raw.columns); cols.remove(self.target); cols.remove('date')
df_raw = df_raw[['date']+cols+[self.target]]
num_train = int(len(df_raw)*0.7)
num_test = int(len(df_raw)*0.2)
num_vali = len(df_raw) - num_train - num_test
border1s = [0, num_train-self.seq_len, len(df_raw)-num_test-self.seq_len]
border2s = [num_train, num_train+num_vali, len(df_raw)]
border1 = border1s[self.set_type]
border2 = border2s[self.set_type]

border: 由于输入数据是一个连续的序列,因此在原始数据集里取序列的时候【不可以把数据集里末端元素作为序列头】,因为后面没有元素了,无法组成一个完整的序列,因此在划分的训练集、测试集、验证集里会有一个序列边界border的概念,即【最后一个可以组成完整序列的序列头】元素位置。

  • 以减去seq_len序列长度操作来实现【限定(组成完整序列)的边界】

model

🐱tips : 由于pytorch机制,debug nn.module的时候在forward处打断点

main

命令行参数parser

从命令行中解析参数,从命令行中将参数读出来

  1. parser.add_argument('--freq'):数据重采样(将多个样本结合为一个,比如求均值)
  2. parser.add_argument('--label_len'): 训练样本(含标签样本)序列长度(模型里先验知识)
  3. parser.add_argument('--pred_len'):预测样本序列长度
  4. parser.add_argument('--enc_in'): 输入样本数据维度/输入编码器的样本大小(比如csv训练数据有多少列)
  5. args.s_layers : 模块循环次数
  6. args.freq: 时间序列的间隔大小(小时)

data_parser字典

data_parser = {
'ETTh1':{'data':'ETTh1.csv','T':'OT','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]},
'ETTh2':{'data':'ETTh2.csv','T':'OT','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]},
'ETTm1':{'data':'ETTm1.csv','T':'OT','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]},
'ETTm2':{'data':'ETTm2.csv','T':'OT','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]},
'WTH':{'data':'WTH.csv','T':'WetBulbCelsius','M':[12,12,12],'S':[1,1,1],'MS':[12,12,1]},
'ECL':{'data':'ECL.csv','T':'MT_320','M':[321,321,321],'S':[1,1,1],'MS':[321,321,1]},
'Solar':{'data':'solar_AL.csv','T':'POWER_136','M':[137,137,137],'S':[1,1,1],'MS':[137,137,1]},

定义了一个字典,字典里提供了很多样例数据,不同的样例数据,指定了标签具体是数据中的哪一列。

  • T: 标签列
  • M:序列大小

这个可以用于后面自定义数据,指定数据大小等等,自己定义,模仿构建数据输入模式

Structure

  • 🔴Encoder: 96(包含了🟢label: 48)
  • ⚪Decoder: 72 =🟢 label: 48 + 🟡pred: 24

model.py

  • 🔴Encoder: 96(包含了🟢label: 48)
  • ⚪Decoder: 72 =🟢 label: 48 + 🟡pred: 24
    1. 初始化:input = torch.zeros()
    2. 合并48个先验序列:input = torch.cat()

embed.py

  • DataEmbedding

encoder.py

  • class EncoderLayer

    1. forward: attention

      计算Q\K\V

    2. attn.py

    3. ProbAttention(Informer核心:创新QKV的计算)

      Q\K\V

      每个Q和每个K计算,效率太慢,

      比如96个Q和96个K

      不把96个Q全部和K一一计算,从96个Q中选一部分作为代表

      怎么选出Q呢?

      先随机选25个K,作为评判标准,

      计算96个Q与25个K之间的attention

      将得分从大到小排序

      前25个得分高的Q作为代表

      实现用小的计算量达到同样高水平效果

      更新分数的时候只更新这25个Q值的,其他的用均值作为更新

Decoder.py

  • cross attention

    Q : X

    K : encoder 输出的特征

    V:encoder 输出的特征

  • output 多变量预测

最后反向传播,参数更新,学习参数

本文作者:Hecto

本文链接:https://www.cnblogs.com/tow1/p/17673740.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Hecto  阅读(780)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑