【实现Informer的途径】

1、使用PyTorch或TensorFlow自建Informer架构,并使用传统深度学习架构预测手段进行预测

2、使用由Huggingface的Informer模型架构

3、使用Informer原作者在Github开源代码zhouhaoyi/Informer2020: The GitHub repository for the paper "Informer" accepted by AAAI 2021.【项目结构】

  • main_informer:定义informer所需的所有参数、并执行实际的训练和预测流程。在PyCharm等非REPL式的编程工具中,我们都可以通过直接调用main_informer来运行算法的训练
  • data板块:存放数据集和数据集加载相关代码,核心代码为data_loader.py,既包括处理数据的代码,也包括导入数据的代码。在informer2020中类来导入数据。考虑到深度学习数据存在的形式丰富,原作者们很贴心地准备了可以导入论文中使用的数据的三个类(例如 Dataset_ETT_hour ),每个类对应不同的数据集。同时,也为我们写了一个可以导入excel表单/csv文件的类,并附有自动分割训练/测试/验证集的流程、以及将导入数据转变为Tensor的流程( Dataset_Custom, Dataset_Pred 等) 。在实际使用informer2020库的时候,我们也可以自己向dataloader.py中添加自己定义的数据导入类。而处理数据的代码部分,包括有归一化、各类embedding的选择等
  • exp板块:实验相关,数据加载,模型训练、测试、预测的过程代码,包括了定义损失函数、定义网络结构、进行训练等神经网络的基本流程。
  • models板块: Informer模型相关内容,包含词向量编码 (embed.py)、注意力机制 (attn.py) 、encoder编码器 (encoder.py) 、decoder(decoder.py) 解码器和模型定义 (model.py) 几部分。
  • utils板块:与项目相关的辅助代码,这里包含掩码相关 (masking.py)算法衡量指标(metrics.py)、时间特征( timefreatures.py) 和其它工具(tools.py) 几部分。

本项目使用的数据集为电力变压器数据集。

这里展开看一下main_informer.py里的全部参数

|参数名称|参数类型|参数讲解|
|--------|-------|-------|
|model|str|这是一个用于实验的参数设置,其中包含了三个选项: informer, informerstack, informerlight根据实验需求,可以选择其中之一来进行实验,默认是使用informer模型。
|data|str|数据,这个并不是数据集文件,而是你想要用官方定义的方法还是你自己的数据集进行定义数据加载器,如果是自己的数据集就输入custom(这也是这个开源项目做的比较好的地方,项目本身可以选择用自己的数据集)
|root_path|str|这个是文件的路径,不要到具体的文件,到目录级别即可。
|data_path|str|这个填写文件的名称。
|features|str|这个是特征有三个选项M,MS,S。分别是多元预测多元,多元预测单元,单元预测单元。
|target|str|这个是数据集中想要预测那一列数据,假设预测的是油温OT列就输入OT即可。
|freq|str|时间的间隔,数据集每一条数据之间的时间间隔。
|checkpoints|str|训练出来的模型保存路径
|seq_len|int|用过去的多少条数据来预测未来的数据
|label_len|int|可以裂解为更高的权重占比的部分,要小于seq_len
|pred_len|int|预测未来多少个时间点的数据
|enc_in|int|数据有多少列,要减去时间那一列
|dec_in|int|数据有多少列,要减去时间那一列
|c_out|int|如果features填写的是M那么和上面就一样,是数据列数,如果填写的MS那么这里要输入1因为你的输出只有一列数据。
|d_model|int|用于设置模型的维度,默认值为512。可以根据需要调整该参数的数值来改变模型的维度
|n_heads|int|用于设置模型中的注意力头数。默认值为8,表示模型会使用8个注意力头.(有时也会用数据有多少列作为头数,可以根据自己实际数据集情况设定)
|e_layers|int|用于设置编码器的层数
|d_layers|int|用于设置解码器的层数
|s_layers|str|用于设置堆叠编码器的层数
|d_ff|int|模型中全连接网络(FCN)的维度,默认值为2048
|factor|in|ProbSparse自注意力中的因子,默认值为5
|padding|int|填充类型,默认值为0,如果不够数据就填写0.
|distil|bool|是否在编码器中使用蒸馏操作。使用--distil参数表示不使用蒸馏操作,默认为True也是我们的论文中比较重要的一个改进。
|dropout|float|丢弃的概率,防止过拟合
|attn|str|编码器中使用的注意力类型,默认为"prob"论文的主要改进点,提出的注意力机制。
|embed|str|时间特征的编码方式,默认为"timeF"
|activation|str|激活函数
|output_attention|bool|是否在编码器中输出注意力,默认为False
|do_predict|bool|是否进行预测
|mix|bool|在生成式解码器中是否使用混合注意力,默认为True
|cols|str|从数据文件中选择特定的列作为输入特征,不常用
|num_workers|int|线程(windows最好设置成0否则会报线程错误,linux系统随便设置)
|itr|int|实验运行的次数,默认为2
|train_epochs|int|训练的次数
|batch_size|int|一次往模型力输入多少条数据
|patience|int|早停机制,如果损失多少个epochs没有改变就停止训练
|learning_rate|float|学习率
|des|str|实验描述,默认为"test"
|loss|str|损失函数,默认为"mse"
|lradj|str |学习率的调整方式,默认为"type1"
|use_amp|bool|混合精度训练,
|inverse|bool|是否将归一化后的数据转换为原始值,这里默认为False,如果你想要转换为原来的数据改成True。
|use_gpu|bool|是否使用GPU训练,根据自身来选择
|gpu|int|GPU的编号
|use_multi_gpu|bool|是否使用多个GPU训练。
|devices|str|GPU的编号
【实现】

实际使用informer的过程中,我们往往不会直接导出类或函数来使用,而是通过设置参数的方式来调用整个项目中的功能。

# 导入相应的库
import argparse 
import os
import torch
from exp.exp_informer import Exp_Informer as Exp #执行训练流程的板块

#告诉argparse库我们是需要往informer里面添加参数,并建立一个对象parser用于存储参数
parser = argparse.ArgumentParser(description='[Informer] Long Sequences Forecasting')

#使用add_argument功能来添加实际要使用的参数,其中'--model'是参数的名称
parser.add_argument('--model')

#将参数列表parser赋予具体的值,这些值会被保存在模型中形成一个个self.参数值
#这一步就相当于一般网络调用过程中为模型填写参数的部分
args = parser.parse_args(args=["--model", "informer", 
                               "--data", "ETTh1",
                               "--attn", 'prob',
                               "--freq", "h"])

#按照informer要求的格式将这些值赋予变量setting,代表我们为模型做的各种设置
setting = '{}_{}_ft{}_sl{}_ll{}_pl{}_dm{}_nh{}_el{}_dl{}_df{}_at{}_fc{}_eb{}_dt{}_{}'.format(args.model
                                                                                             , args.data, args.features
                                                                                             , args.seq_len, args.label_len
                                                                                             , args.pred_len
                                                                                             , args.d_model, args.n_heads
                                                                                             , args.e_layers
                                                                                             , args.d_layers, args.d_ff, args.attn
                                                                                             , args.factor, args.embed
                                                                                             , args.distil, args.des)

# 使用Exp实例化网络结构和训练流程的所有参数
exp = Exp(args)

# 训练 + 打印结果
print('>>>>>>>start training : {}>>>>>>>>>>>>>>>>>>>>>>>>>>'.format(setting))
exp.train(setting)

# 测试 + 打印结果
print('>>>>>>>testing : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting))
exp.test(setting)

所有的流程都是被封装好的,我们数据的预处理、数据配置、模型选择、模型结构、模型输入输出、训练过程中的学习率、batch_size等等信息全都是通过参数来控制的,甚至连数据的导入都是以参数的形式进行,我们需要修改的只有参数本身而已。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐