228 lines
14 KiB
Python
228 lines
14 KiB
Python
import argparse
|
||
import os
|
||
import torch
|
||
|
||
from cross_exp.exp_crossformer import Exp_crossformer
|
||
from utils.tools import string_split
|
||
|
||
parser = argparse.ArgumentParser(description='CrossFormer')
|
||
|
||
parser.add_argument('--data', type=str, required=True, default='Wind_farm', help='data')
|
||
parser.add_argument('--root_path', type=str, default='./datasets/', help='root path of the data file')
|
||
parser.add_argument('--data_path', type=str, default='Wind farm site 6 (Nominal capacity-96MW).csv', help='data file')
|
||
parser.add_argument('--data_split', type=str, default='0.7,0.1,0.2',help='train/val/test split, can be ratio or number')
|
||
parser.add_argument('--checkpoints', type=str, default='./checkpoints/', help='location to store model checkpoints')
|
||
|
||
"""
|
||
1. --in_len (输入时间序列长度, T)
|
||
作用: 该参数指定输入多时间序列(MTS)的长度。它表示在模型训练或预测时,输入序列的时间步数。
|
||
示例: 如果 in_len 设置为 96,意味着模型将使用过去 96 个时间步的数据来进行预测
|
||
|
||
2. --out_len (输出时间序列长度, τ)
|
||
作用: 该参数指定模型的输出长度,即模型在给定输入序列后需要预测的未来时间步数。
|
||
示例: 如果 out_len 设置为 24,表示模型将预测接下来的 24 个时间步的值。
|
||
|
||
3. --seg_len (分段长度, L_seg)
|
||
作用: 该参数用于定义在处理输入序列时,如何将其分成更小的段。分段可以帮助模型更好地捕捉局部特征。
|
||
示例: 如果 seg_len 设置为 6,模型将把输入序列分成长度为 6 的小段进行处理。
|
||
|
||
4. --win_size (窗口大小)
|
||
作用: 该参数指定在合并段时使用的窗口大小。窗口大小影响如何从多个小段中提取信息并合并成一个更大的表示。
|
||
示例: 如果 win_size 设置为 2,模型将在进行段合并时考虑相邻的 2 个段。
|
||
|
||
5. --factor (跨维度阶段的路由器数量, c)
|
||
作用: 该参数指定在 Transformer 的跨维度阶段(Cross-Dimension Stage)中使用的路由器的数量。路由器用于处理不同维度之间的信息流动。
|
||
示例: 如果 factor 设置为 10,模型将在跨维度处理阶段使用 10 个路由器来增强模型对不同维度特征的学习能力。
|
||
"""
|
||
parser.add_argument('--in_len', type=int, default=192, help='input MTS length (T)')
|
||
parser.add_argument('--out_len', type=int, default=12, help='output MTS length (\tau)')
|
||
parser.add_argument('--seg_len', type=int, default=6, help='segment length (L_seg)')
|
||
parser.add_argument('--win_size', type=int, default=2, help='window size for segment merge')
|
||
parser.add_argument('--factor', type=int, default=10, help='num of routers in Cross-Dimension Stage of TSA (c)')
|
||
|
||
"""
|
||
1. --data_dim (多时间序列数据的维度数, D)
|
||
作用: 该参数指定输入多时间序列(MTS)数据的维度数。每个时间步的数据可以包含多个特征(维度),例如温度、湿度、风速等。
|
||
示例: 如果 data_dim 设置为 7,意味着每个时间步的数据包含 7 个特征。
|
||
|
||
2. --d_model (隐藏状态的维度, d_model)
|
||
作用: 该参数定义模型内部表示的维度,即 Transformer 模型中隐藏状态的维度。这是模型处理输入数据时所使用的主要特征维度。
|
||
示例: 如果 d_model 设置为 256,模型的隐藏层将使用 256 维的向量来表示每个时间步的特征。
|
||
|
||
3. --d_ff (Transformer 中 MLP 的维度)
|
||
作用: 该参数指定 Transformer 中前馈神经网络(MLP)的维度。前馈网络通常由两个线性层组成,具有激活函数(如 ReLU)作为非线性变换。
|
||
示例: 如果 d_ff 设置为 512,前馈网络的隐藏层将具有 512 维的输出。
|
||
|
||
4. --n_heads (多头注意力机制中的头数)
|
||
作用: 该参数设置多头注意力机制中的头数。多头注意力允许模型在不同的子空间中并行地学习信息,从而增强模型的表达能力。
|
||
示例: 如果 n_heads 设置为 4,模型将在计算注意力时使用 4 个独立的注意力头。
|
||
|
||
--e_layers (编码器层数, N)
|
||
作用: 该参数指定 Transformer 编码器的层数。更多的层数通常可以让模型捕捉到更复杂的特征,但也可能导致过拟合。
|
||
示例: 如果 e_layers 设置为 3,模型将使用 3 层编码器来处理输入数据。
|
||
|
||
6. --dropout (dropout 率)
|
||
作用: 该参数用于控制 dropout 的比例,以防止模型过拟合。在训练过程中,dropout 会随机丢弃一定比例的神经元,以增加模型的泛化能力。
|
||
示例: 如果 dropout 设置为 0.2,表示在训练过程中,20% 的神经元将被随机丢弃。
|
||
"""
|
||
parser.add_argument('--data_dim', type=int, default=11, help='Number of dimensions of the MTS data (D)')
|
||
parser.add_argument('--d_model', type=int, default=256, help='dimension of hidden states (d_model)')
|
||
parser.add_argument('--d_ff', type=int, default=512, help='dimension of MLP in transformer')
|
||
parser.add_argument('--n_heads', type=int, default=4, help='num of heads')
|
||
parser.add_argument('--e_layers', type=int, default=3, help='num of encoder layers (N)')
|
||
parser.add_argument('--dropout', type=float, default=0.2, help='dropout')
|
||
|
||
"""
|
||
--baseline 参数用于控制模型是否使用一个基线方法进行预测。以下是对该参数的详细解释:
|
||
|
||
|
||
--baseline (基线预测)
|
||
作用: 该参数是一个布尔值,用于指示是否使用过去时间序列的均值作为预测的基线。基线方法是一种简单的预测策略,通常用于评估更复杂模型的性能。
|
||
用法:
|
||
如果设置为 True,模型将在进行预测时使用过去时间序列的均值作为基线预测。这意味着模型的输出将与基线预测进行比较,以评估模型的改进效果。
|
||
如果设置为 False,模型将不使用基线预测,而是完全依赖于其学习到的特征和模式进行预测。
|
||
|
||
示例
|
||
默认值: 在这个参数的定义中,default=False 表示如果没有在命令行中指定该参数,模型将不会使用基线预测。
|
||
使用场景: 在模型训练和评估中,使用基线预测可以帮助研究人员理解模型的性能是否优于简单的均值预测。例如,如果一个复杂模型的预测性能仅略好于均值预测,那么可能需要进一步改进模型。
|
||
|
||
总结
|
||
该参数的主要目的是提供一个简单的基线预测方法,以便在模型评估时进行比较。通过控制是否使用基线,用户可以更好地理解模型的效果和实用性。
|
||
"""
|
||
parser.add_argument('--baseline', action='store_true', help='whether to use mean of past series as baseline for prediction', default=False)
|
||
|
||
"""
|
||
这些参数主要与模型训练过程中的数据加载、训练设置和优化有关。以下是每个参数的详细解释:
|
||
|
||
|
||
1. --num_workers (数据加载器的工作进程数)
|
||
作用: 该参数指定在数据加载过程中使用的并行工作进程的数量。增加工作进程数可以加速数据加载,尤其是在处理大规模数据集时。
|
||
示例: 如果设置为 4,数据加载器将使用 4 个进程来并行加载数据。
|
||
|
||
2. --batch_size (训练输入数据的批大小)
|
||
作用: 该参数定义每次训练迭代中使用的样本数量。批大小的选择会影响训练的稳定性和速度。
|
||
示例: 如果设置为 32,模型在每次迭代中将使用 32 个样本进行训练。
|
||
|
||
3. --train_epochs (训练轮数)
|
||
作用: 该参数指定模型训练的总轮数(epoch)。一个 epoch 是指模型对整个训练数据集进行一次完整的前向和反向传播。
|
||
示例: 如果设置为 20,模型将在训练过程中经历 20 个完整的训练轮次。
|
||
|
||
4. --patience (早停的耐心值)
|
||
作用: 该参数用于控制早停(early stopping)的耐心值。早停是一种防止过拟合的策略,当验证集的性能在指定轮数内没有改善时,训练将提前停止。
|
||
示例: 如果设置为 3,意味着如果在连续 3 个 epoch 中验证性能没有改善,训练将停止。
|
||
|
||
5. --learning_rate (优化器的初始学习率)
|
||
作用: 该参数定义优化器在训练开始时使用的学习率。学习率决定了模型在每次参数更新时步长的大小。
|
||
示例: 如果设置为 1e-4,模型的初始学习率将为 0.0001。
|
||
|
||
6. --lradj (学习率调整策略)
|
||
作用: 该参数指定学习率的调整策略。不同的调整策略可以在训练过程中动态调整学习率,以提高训练效果。
|
||
示例: 如果设置为 type1,表示使用特定的学习率调整策略(具体的策略定义可能在代码中有详细说明)。
|
||
|
||
7. --itr (实验次数)
|
||
作用: 该参数指定实验的重复次数。这对于进行多次实验以评估模型的稳定性和性能非常有用。
|
||
示例: 如果设置为 1,表示只进行一次实验;如果设置为 5,表示将进行 5 次实验并可能计算平均性能。
|
||
|
||
"""
|
||
parser.add_argument('--num_workers', type=int, default=0, help='data loader num workers')
|
||
parser.add_argument('--batch_size', type=int, default=32, help='batch size of train input data')
|
||
parser.add_argument('--train_epochs', type=int, default=20, help='train epochs')
|
||
parser.add_argument('--patience', type=int, default=3, help='early stopping patience')
|
||
parser.add_argument('--learning_rate', type=float, default=1e-4, help='optimizer initial learning rate')
|
||
parser.add_argument('--lradj', type=str, default='type1',help='adjust learning rate')
|
||
parser.add_argument('--itr', type=int, default=1, help='experiments times')
|
||
|
||
"""
|
||
是否保存预测结果。
|
||
"""
|
||
parser.add_argument('--save_pred', action='store_true', help='whether to save the predicted future MTS', default=False)
|
||
|
||
"""
|
||
1. --use_gpu (是否使用 GPU)
|
||
作用: 该参数指示是否在训练过程中使用 GPU。GPU 通常比 CPU 更适合处理深度学习任务。
|
||
类型: 布尔值(bool)。
|
||
默认值: True,表示默认使用 GPU。
|
||
示例: 如果设置为 False,则模型将在 CPU 上训练。
|
||
|
||
2. --gpu (指定 GPU 编号)
|
||
作用: 该参数用于指定要使用的 GPU 的编号。在多 GPU 环境中,用户可以选择特定的 GPU 进行训练。
|
||
类型: 整数(int)。
|
||
默认值: 0,表示默认使用编号为 0 的 GPU。
|
||
示例: 如果系统中有多个 GPU,用户可以通过设置此参数为 1、2 等来选择不同的 GPU。
|
||
|
||
3. --use_multi_gpu (是否使用多个 GPU)
|
||
作用: 该参数指示是否在训练过程中使用多个 GPU。使用多个 GPU 可以进一步加速模型训练。
|
||
类型: 布尔值(store_true)。
|
||
默认值: False,表示默认不使用多个 GPU。
|
||
示例: 如果在命令行中指定该参数(如 --use_multi_gpu),则表示希望使用多个 GPU 进行训练。
|
||
|
||
4. --devices (多 GPU 的设备 ID)
|
||
作用: 该参数用于指定要使用的多个 GPU 的设备 ID。用户可以通过逗号分隔的方式列出多个 GPU 的编号。
|
||
类型: 字符串(str)。
|
||
默认值: '0,1,2,3',表示默认使用编号为 0、1、2 和 3 的 GPU。
|
||
示例: 如果设置为 0,1,则模型将在编号为 0 和 1 的 GPU 上进行训练。
|
||
"""
|
||
parser.add_argument('--use_gpu', type=bool, default=True, help='use gpu')
|
||
parser.add_argument('--gpu', type=int, default=0, help='gpu')
|
||
"""
|
||
action='store_true' 的含义
|
||
布尔开关: 当在命令行中包含该选项时,argparse 会将对应的变量设置为 True;如果没有包含该选项,则变量将被设置为 False。
|
||
用法示例:
|
||
如果你在命令行中运行程序时使用 --use_multi_gpu,则 args.use_multi_gpu 将被设置为 True。
|
||
如果你不使用该选项(即不在命令行中包含 --use_multi_gpu),则 args.use_multi_gpu 将保持为 False(这是默认值)。
|
||
"""
|
||
parser.add_argument('--use_multi_gpu', action='store_true', help='use multiple gpus', default=False)
|
||
parser.add_argument('--devices', type=str, default='0,1,2,3',help='device ids of multile gpus')
|
||
|
||
args = parser.parse_args()
|
||
|
||
args.use_gpu = True if torch.cuda.is_available() and args.use_gpu else False
|
||
# 在用户指定使用 GPU 且使用多个 GPU 的情况下,解析和处理 GPU 设备 ID 的字符串,去掉空格,将其分割成列表,并将第一个 GPU 的 ID 存储在 args.gpu 中。最后,打印出该 GPU 的 ID。这使得后续的模型训练或推理可以使用指定的 GPU 进行计算。
|
||
if args.use_gpu and args.use_multi_gpu:
|
||
args.devices = args.devices.replace(' ','')
|
||
device_ids = args.devices.split(',')
|
||
args.device_ids = [int(id_) for id_ in device_ids]
|
||
args.gpu = args.device_ids[0]
|
||
print(args.gpu)
|
||
|
||
data_parser = {
|
||
'ETTh1':{'data':'ETTh1.csv', 'data_dim':7, 'split':[12*30*24, 4*30*24, 4*30*24]},
|
||
'ETTm1':{'data':'ETTm1.csv', 'data_dim':7, 'split':[4*12*30*24, 4*4*30*24, 4*4*30*24]},
|
||
'WTH':{'data':'WTH.csv', 'data_dim':12, 'split':[28*30*24, 10*30*24, 10*30*24]},
|
||
'ECL':{'data':'ECL.csv', 'data_dim':321, 'split':[15*30*24, 3*30*24, 4*30*24]},
|
||
'ILI':{'data':'national_illness.csv', 'data_dim':7, 'split':[0.7, 0.1, 0.2]},
|
||
'Traffic':{'data':'traffic.csv', 'data_dim':862, 'split':[0.7, 0.1, 0.2]},
|
||
}
|
||
if args.data in data_parser.keys():
|
||
data_info = data_parser[args.data]
|
||
args.data_path = data_info['data']
|
||
args.data_dim = data_info['data_dim']
|
||
args.data_split = data_info['split']
|
||
else:
|
||
args.data_split = string_split(args.data_split)
|
||
|
||
print('Args in experiment:')
|
||
print(args)
|
||
"""
|
||
定义实验的设置。
|
||
创建实验实例。
|
||
进行多次训练和测试,每次使用相同的参数但不同的迭代次数。
|
||
在每次训练和测试之前,输出当前的实验设置,以便跟踪和记录实验过程。
|
||
|
||
这种结构常用于机器学习和深度学习实验,以便于进行参数调优和结果比较。
|
||
"""
|
||
Exp = Exp_crossformer
|
||
|
||
for ii in range(args.itr):
|
||
# setting record of experiments
|
||
setting = 'Crossformer_{}_il{}_ol{}_sl{}_win{}_fa{}_dm{}_nh{}_el{}_itr{}'.format(args.data,
|
||
args.in_len, args.out_len, args.seg_len, args.win_size, args.factor,
|
||
args.d_model, args.n_heads, args.e_layers, ii)
|
||
|
||
exp = Exp(args) # set experiments
|
||
print('>>>>>>>start training : {}>>>>>>>>>>>>>>>>>>>>>>>>>>'.format(setting))
|
||
exp.train(setting)
|
||
|
||
print('>>>>>>>testing : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting))
|
||
exp.test(setting, args.save_pred)
|