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
从命令行中解析参数,从命令行中将参数读出来
- parser.add_argument('--freq'):数据重采样(将多个样本结合为一个,比如求均值)
- parser.add_argument('--label_len'): 训练样本(含标签样本)序列长度(模型里先验知识)
- parser.add_argument('--pred_len'):预测样本序列长度
- parser.add_argument('--enc_in'): 输入样本数据维度/输入编码器的样本大小(比如csv训练数据有多少列)
- args.s_layers : 模块循环次数
- 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
- 初始化:input = torch.zeros()
- 合并48个先验序列:input = torch.cat()
embed.py
-
DataEmbedding
encoder.py
-
class EncoderLayer
-
forward: attention
计算Q\K\V
-
attn.py
-
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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步