diff --git a/.vscode/launch.json b/.vscode/launch.json index e92ed4c..4b07128 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,6 +5,14 @@ "version": "0.2.0", "configurations": [ + { + "name": "DDGCRN: METR-LA", + "type": "debugpy", + "request": "launch", + "program": "run.py", + "console": "integratedTerminal", + "args": "--config ./config/DDGCRN/METR-LA.yaml" + }, // STID 模型组 { "name": "STID: PEMS-BAY", diff --git a/config/DDGCRN/METR-LA.yaml b/config/DDGCRN/METR-LA.yaml new file mode 100755 index 0000000..7374cb2 --- /dev/null +++ b/config/DDGCRN/METR-LA.yaml @@ -0,0 +1,59 @@ +basic: + dataset: "METR-LA" + mode: "train" + device: "cuda:0" + model: "DDGCRN" + seed: 2023 + +data: + add_day_in_week: true + add_time_in_day: true + column_wise: false + days_per_week: 7 + default_graph: true + horizon: 24 + lag: 24 + normalizer: std + num_nodes: 207 + steps_per_day: 288 + test_ratio: 0.2 + tod: false + val_ratio: 0.2 + sample: 1 + input_dim: 1 + batch_size: 64 + +model: + input_dim: 1 + output_dim: 1 + embed_dim: 12 + rnn_units: 64 + num_layers: 1 + cheb_order: 2 + use_day: True + use_week: False + num_nodes: 207 + horizon: 24 + + +train: + loss_func: mask_mae + seed: 10 + batch_size: 64 + epochs: 100 + lr_init: 0.003 + weight_decay: 0 + lr_decay: False + lr_decay_rate: 0.3 + lr_decay_step: "5,20,40,70" + early_stop: True + early_stop_patience: 15 + grad_norm: False + max_grad_norm: 5 + debug: false + mae_thresh: 0.0 + mape_thresh: 0.0 + log_step: 10000 + plot: False + output_dim: 1 + diff --git a/trainer/Trainer.py b/trainer/Trainer.py index 508230e..85060f1 100755 --- a/trainer/Trainer.py +++ b/trainer/Trainer.py @@ -203,7 +203,7 @@ class Trainer: self.stats.record_step_time(step_time, mode) # 累积损失和预测结果 - total_loss += loss.item() + total_loss += d_loss.item() y_pred.append(d_output.detach().cpu()) y_true.append(d_label.detach().cpu()) diff --git a/utils/initializer.py b/utils/initializer.py index 95b352d..b69c67f 100755 --- a/utils/initializer.py +++ b/utils/initializer.py @@ -84,9 +84,10 @@ def init_device(args): def init_loss(args, scaler): device = args["basic"]["device"] args = args["train"] + mask_v = args['mae_thresh'] match args["loss_func"]: case "mask_mae": - return masked_mae_loss(scaler, mask_value=None) + return masked_mae_loss(scaler, mask_value=mask_v) case "mae": return torch.nn.L1Loss().to(device) case "mse": diff --git a/utils/loss_function.py b/utils/loss_function.py index 55722b7..72d7048 100755 --- a/utils/loss_function.py +++ b/utils/loss_function.py @@ -1,30 +1,16 @@ +import torch + + def masked_mae_loss(scaler, mask_value): def loss(preds, labels): - # 仅对预测反归一化;标签在数据管道中保持原始量纲 - if scaler: - preds = scaler.inverse_transform(preds) + # # 仅对预测反归一化;标签在数据管道中保持原始量纲 + # if scaler: + # preds = scaler.inverse_transform(preds) return mae_torch(pred=preds, true=labels, mask_value=mask_value) return loss -def get_loss_function(args, scaler): - if args["loss_func"] == "mask_mae": - # Return callable loss (no .to for function closures); disable masking by default - return masked_mae_loss(scaler, mask_value=None) - elif args["loss_func"] == "mae": - return torch.nn.L1Loss().to(args["device"]) - elif args["loss_func"] == "mse": - return torch.nn.MSELoss().to(args["device"]) - elif args["loss_func"] == "Huber": - return torch.nn.HuberLoss().to(args["device"]) - else: - raise ValueError("Unsupported loss function: {}".format(args.loss_func)) - - -import torch - - def mae_torch(pred, true, mask_value=None): if mask_value is not None: mask = torch.gt(true, mask_value)