解决合并冲突,整合dev和main分支的更改
This commit is contained in:
commit
bef30b9c2f
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,52 @@
|
||||||
|
data:
|
||||||
|
num_nodes: 358
|
||||||
|
lag: 12
|
||||||
|
horizon: 12
|
||||||
|
val_ratio: 0.2
|
||||||
|
test_ratio: 0.2
|
||||||
|
tod: False
|
||||||
|
normalizer: std
|
||||||
|
column_wise: False
|
||||||
|
default_graph: True
|
||||||
|
add_time_in_day: True
|
||||||
|
add_day_in_week: True
|
||||||
|
steps_per_day: 288
|
||||||
|
days_per_week: 7
|
||||||
|
|
||||||
|
model:
|
||||||
|
input_dim: 1
|
||||||
|
output_dim: 1
|
||||||
|
embed_dim: 10
|
||||||
|
in_len: 12
|
||||||
|
rnn_units: 64
|
||||||
|
num_layers: 1
|
||||||
|
cheb_order: 2
|
||||||
|
use_day: True
|
||||||
|
use_week: True
|
||||||
|
graph_size: 30
|
||||||
|
expert_nums: 8
|
||||||
|
top_k: 2
|
||||||
|
|
||||||
|
train:
|
||||||
|
loss_func: mae
|
||||||
|
seed: 10
|
||||||
|
batch_size: 64
|
||||||
|
epochs: 300
|
||||||
|
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
|
||||||
|
real_value: True
|
||||||
|
|
||||||
|
test:
|
||||||
|
mae_thresh: null
|
||||||
|
mape_thresh: 0.0
|
||||||
|
|
||||||
|
log:
|
||||||
|
log_step: 2000
|
||||||
|
plot: False
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
data:
|
||||||
|
num_nodes: 307
|
||||||
|
lag: 12
|
||||||
|
horizon: 12
|
||||||
|
val_ratio: 0.2
|
||||||
|
test_ratio: 0.2
|
||||||
|
tod: False
|
||||||
|
normalizer: std
|
||||||
|
column_wise: False
|
||||||
|
default_graph: True
|
||||||
|
add_time_in_day: True
|
||||||
|
add_day_in_week: True
|
||||||
|
steps_per_day: 288
|
||||||
|
days_per_week: 7
|
||||||
|
cycle: 288
|
||||||
|
|
||||||
|
model:
|
||||||
|
batch_size: 64
|
||||||
|
input_dim: 1
|
||||||
|
output_dim: 1
|
||||||
|
in_len: 12
|
||||||
|
cycle_len: 288
|
||||||
|
|
||||||
|
|
||||||
|
train:
|
||||||
|
loss_func: mae
|
||||||
|
seed: 10
|
||||||
|
batch_size: 64
|
||||||
|
epochs: 300
|
||||||
|
lr_init: 0.003
|
||||||
|
weight_decay: 0
|
||||||
|
lr_decay: False
|
||||||
|
lr_decay_rate: 0.5
|
||||||
|
lr_decay_step: "5,20,40,65"
|
||||||
|
early_stop: True
|
||||||
|
early_stop_patience: 15
|
||||||
|
grad_norm: False
|
||||||
|
max_grad_norm: 5
|
||||||
|
real_value: True
|
||||||
|
|
||||||
|
|
||||||
|
test:
|
||||||
|
mae_thresh: null
|
||||||
|
mape_thresh: 0.0
|
||||||
|
|
||||||
|
log:
|
||||||
|
log_step: 200
|
||||||
|
plot: False
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
data:
|
||||||
|
num_nodes: 883
|
||||||
|
lag: 12
|
||||||
|
horizon: 12
|
||||||
|
val_ratio: 0.2
|
||||||
|
test_ratio: 0.2
|
||||||
|
tod: False
|
||||||
|
normalizer: std
|
||||||
|
column_wise: False
|
||||||
|
default_graph: True
|
||||||
|
add_time_in_day: True
|
||||||
|
add_day_in_week: True
|
||||||
|
steps_per_day: 288
|
||||||
|
days_per_week: 7
|
||||||
|
|
||||||
|
model:
|
||||||
|
batch_size: 64
|
||||||
|
input_dim: 1
|
||||||
|
output_dim: 1
|
||||||
|
in_len: 12
|
||||||
|
|
||||||
|
|
||||||
|
train:
|
||||||
|
loss_func: mae
|
||||||
|
seed: 10
|
||||||
|
batch_size: 64
|
||||||
|
epochs: 300
|
||||||
|
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
|
||||||
|
real_value: True
|
||||||
|
|
||||||
|
test:
|
||||||
|
mae_thresh: null
|
||||||
|
mape_thresh: 0.0
|
||||||
|
|
||||||
|
log:
|
||||||
|
log_step: 200
|
||||||
|
plot: False
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
data:
|
||||||
|
num_nodes: 170
|
||||||
|
lag: 12
|
||||||
|
horizon: 12
|
||||||
|
val_ratio: 0.2
|
||||||
|
test_ratio: 0.2
|
||||||
|
tod: False
|
||||||
|
normalizer: std
|
||||||
|
column_wise: False
|
||||||
|
default_graph: True
|
||||||
|
add_time_in_day: True
|
||||||
|
add_day_in_week: True
|
||||||
|
steps_per_day: 288
|
||||||
|
days_per_week: 7
|
||||||
|
|
||||||
|
model:
|
||||||
|
batch_size: 64
|
||||||
|
input_dim: 1
|
||||||
|
output_dim: 1
|
||||||
|
in_len: 12
|
||||||
|
|
||||||
|
|
||||||
|
train:
|
||||||
|
loss_func: mae
|
||||||
|
seed: 10
|
||||||
|
batch_size: 64
|
||||||
|
epochs: 300
|
||||||
|
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
|
||||||
|
real_value: True
|
||||||
|
|
||||||
|
test:
|
||||||
|
mae_thresh: null
|
||||||
|
mape_thresh: 0.0
|
||||||
|
|
||||||
|
log:
|
||||||
|
log_step: 200
|
||||||
|
plot: False
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
data:
|
||||||
|
num_nodes: 716
|
||||||
|
lag: 12
|
||||||
|
horizon: 12
|
||||||
|
val_ratio: 0.2
|
||||||
|
test_ratio: 0.2
|
||||||
|
tod: False
|
||||||
|
normalizer: std
|
||||||
|
column_wise: False
|
||||||
|
default_graph: True
|
||||||
|
add_time_in_day: True
|
||||||
|
add_day_in_week: True
|
||||||
|
steps_per_day: 288
|
||||||
|
days_per_week: 7
|
||||||
|
|
||||||
|
model:
|
||||||
|
batch_size: 64
|
||||||
|
input_dim: 1
|
||||||
|
output_dim: 1
|
||||||
|
in_len: 12
|
||||||
|
|
||||||
|
train:
|
||||||
|
loss_func: mae
|
||||||
|
seed: 10
|
||||||
|
batch_size: 64
|
||||||
|
epochs: 300
|
||||||
|
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
|
||||||
|
real_value: True
|
||||||
|
|
||||||
|
test:
|
||||||
|
mae_thresh: null
|
||||||
|
mape_thresh: 0.0
|
||||||
|
|
||||||
|
log:
|
||||||
|
log_step: 2000
|
||||||
|
plot: False
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
data:
|
||||||
|
num_nodes: 307
|
||||||
|
lag: 12
|
||||||
|
horizon: 12
|
||||||
|
val_ratio: 0.2
|
||||||
|
test_ratio: 0.2
|
||||||
|
tod: False
|
||||||
|
normalizer: std
|
||||||
|
column_wise: False
|
||||||
|
default_graph: True
|
||||||
|
add_time_in_day: True
|
||||||
|
add_day_in_week: True
|
||||||
|
steps_per_day: 288
|
||||||
|
days_per_week: 7
|
||||||
|
|
||||||
|
model:
|
||||||
|
input_dim: 1
|
||||||
|
output_dim: 1
|
||||||
|
embed_dim: 10
|
||||||
|
rnn_units: 64
|
||||||
|
num_layers: 1
|
||||||
|
cheb_order: 2
|
||||||
|
patch_size: 3
|
||||||
|
use_day: True
|
||||||
|
use_week: True
|
||||||
|
|
||||||
|
train:
|
||||||
|
loss_func: mae
|
||||||
|
seed: 10
|
||||||
|
batch_size: 64
|
||||||
|
epochs: 300
|
||||||
|
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
|
||||||
|
real_value: True
|
||||||
|
|
||||||
|
test:
|
||||||
|
mae_thresh: null
|
||||||
|
mape_thresh: 0.0
|
||||||
|
|
||||||
|
log:
|
||||||
|
log_step: 200
|
||||||
|
plot: False
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
data:
|
||||||
|
num_nodes: 358
|
||||||
|
lag: 12
|
||||||
|
horizon: 12
|
||||||
|
val_ratio: 0.2
|
||||||
|
test_ratio: 0.2
|
||||||
|
tod: False
|
||||||
|
normalizer: std
|
||||||
|
column_wise: False
|
||||||
|
default_graph: True
|
||||||
|
add_time_in_day: True
|
||||||
|
add_day_in_week: True
|
||||||
|
steps_per_day: 288
|
||||||
|
days_per_week: 7
|
||||||
|
|
||||||
|
model:
|
||||||
|
num_nodes: 358
|
||||||
|
in_steps: 12
|
||||||
|
out_steps: 12
|
||||||
|
steps_per_day: 288
|
||||||
|
input_dim: 1
|
||||||
|
output_dim: 1
|
||||||
|
input_embedding_dim: 24
|
||||||
|
tod_embedding_dim: 24
|
||||||
|
dow_embedding_dim: 24
|
||||||
|
spatial_embedding_dim: 0
|
||||||
|
adaptive_embedding_dim: 80
|
||||||
|
feed_forward_dim: 256
|
||||||
|
num_heads: 4
|
||||||
|
num_layers: 3
|
||||||
|
dropout: 0.1
|
||||||
|
use_mixed_proj: true
|
||||||
|
|
||||||
|
train:
|
||||||
|
loss_func: mae
|
||||||
|
seed: 10
|
||||||
|
batch_size: 64
|
||||||
|
epochs: 300
|
||||||
|
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
|
||||||
|
real_value: True
|
||||||
|
|
||||||
|
test:
|
||||||
|
mae_thresh: null
|
||||||
|
mape_thresh: 0.0
|
||||||
|
|
||||||
|
log:
|
||||||
|
log_step: 200
|
||||||
|
plot: False
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
data:
|
||||||
|
num_nodes: 307
|
||||||
|
lag: 12
|
||||||
|
horizon: 12
|
||||||
|
val_ratio: 0.1
|
||||||
|
test_ratio: 0.2
|
||||||
|
tod: False
|
||||||
|
normalizer: std
|
||||||
|
column_wise: False
|
||||||
|
default_graph: True
|
||||||
|
add_time_in_day: True
|
||||||
|
add_day_in_week: True
|
||||||
|
steps_per_day: 288
|
||||||
|
days_per_week: 7
|
||||||
|
|
||||||
|
model:
|
||||||
|
num_nodes: 307
|
||||||
|
in_steps: 12
|
||||||
|
out_steps: 12
|
||||||
|
steps_per_day: 288
|
||||||
|
input_dim: 1
|
||||||
|
output_dim: 1
|
||||||
|
input_embedding_dim: 24
|
||||||
|
tod_embedding_dim: 24
|
||||||
|
dow_embedding_dim: 24
|
||||||
|
spatial_embedding_dim: 0
|
||||||
|
adaptive_embedding_dim: 80
|
||||||
|
feed_forward_dim: 256
|
||||||
|
num_heads: 4
|
||||||
|
num_layers: 3
|
||||||
|
dropout: 0.1
|
||||||
|
use_mixed_proj: true
|
||||||
|
|
||||||
|
train:
|
||||||
|
loss_func: Huber
|
||||||
|
seed: 10
|
||||||
|
batch_size: 16
|
||||||
|
epochs: 200
|
||||||
|
lr_init: 0.001
|
||||||
|
weight_decay: 0.0003
|
||||||
|
lr_decay: True
|
||||||
|
lr_decay_rate: 0.1
|
||||||
|
lr_decay_step: "5,20,40,70"
|
||||||
|
early_stop: True
|
||||||
|
early_stop_patience: 30
|
||||||
|
grad_norm: False
|
||||||
|
real_value: True
|
||||||
|
|
||||||
|
test:
|
||||||
|
mae_thresh: null
|
||||||
|
mape_thresh: 0.0
|
||||||
|
|
||||||
|
log:
|
||||||
|
log_step: 2000
|
||||||
|
plot: False
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
data:
|
||||||
|
num_nodes: 883
|
||||||
|
lag: 12
|
||||||
|
horizon: 12
|
||||||
|
val_ratio: 0.2
|
||||||
|
test_ratio: 0.2
|
||||||
|
tod: False
|
||||||
|
normalizer: std
|
||||||
|
column_wise: False
|
||||||
|
default_graph: True
|
||||||
|
add_time_in_day: True
|
||||||
|
add_day_in_week: True
|
||||||
|
steps_per_day: 288
|
||||||
|
days_per_week: 7
|
||||||
|
|
||||||
|
model:
|
||||||
|
num_nodes: 883
|
||||||
|
in_steps: 12
|
||||||
|
out_steps: 12
|
||||||
|
steps_per_day: 288
|
||||||
|
input_dim: 1
|
||||||
|
output_dim: 1
|
||||||
|
input_embedding_dim: 24
|
||||||
|
tod_embedding_dim: 24
|
||||||
|
dow_embedding_dim: 24
|
||||||
|
spatial_embedding_dim: 0
|
||||||
|
adaptive_embedding_dim: 80
|
||||||
|
feed_forward_dim: 256
|
||||||
|
num_heads: 4
|
||||||
|
num_layers: 3
|
||||||
|
dropout: 0.1
|
||||||
|
use_mixed_proj: true
|
||||||
|
|
||||||
|
train:
|
||||||
|
loss_func: mae
|
||||||
|
seed: 10
|
||||||
|
batch_size: 64
|
||||||
|
epochs: 300
|
||||||
|
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
|
||||||
|
real_value: True
|
||||||
|
|
||||||
|
test:
|
||||||
|
mae_thresh: null
|
||||||
|
mape_thresh: 0.0
|
||||||
|
|
||||||
|
log:
|
||||||
|
log_step: 200
|
||||||
|
plot: False
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
data:
|
||||||
|
num_nodes: 170
|
||||||
|
lag: 12
|
||||||
|
horizon: 12
|
||||||
|
val_ratio: 0.2
|
||||||
|
test_ratio: 0.2
|
||||||
|
tod: False
|
||||||
|
normalizer: std
|
||||||
|
column_wise: False
|
||||||
|
default_graph: True
|
||||||
|
add_time_in_day: True
|
||||||
|
add_day_in_week: True
|
||||||
|
steps_per_day: 288
|
||||||
|
days_per_week: 7
|
||||||
|
|
||||||
|
model:
|
||||||
|
num_nodes: 170
|
||||||
|
in_steps: 12
|
||||||
|
out_steps: 12
|
||||||
|
steps_per_day: 288
|
||||||
|
input_dim: 1
|
||||||
|
output_dim: 1
|
||||||
|
input_embedding_dim: 24
|
||||||
|
tod_embedding_dim: 24
|
||||||
|
dow_embedding_dim: 24
|
||||||
|
spatial_embedding_dim: 0
|
||||||
|
adaptive_embedding_dim: 80
|
||||||
|
feed_forward_dim: 256
|
||||||
|
num_heads: 4
|
||||||
|
num_layers: 3
|
||||||
|
dropout: 0.1
|
||||||
|
use_mixed_proj: true
|
||||||
|
|
||||||
|
train:
|
||||||
|
loss_func: mae
|
||||||
|
seed: 10
|
||||||
|
batch_size: 64
|
||||||
|
epochs: 300
|
||||||
|
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
|
||||||
|
real_value: True
|
||||||
|
|
||||||
|
test:
|
||||||
|
mae_thresh: null
|
||||||
|
mape_thresh: 0.0
|
||||||
|
|
||||||
|
log:
|
||||||
|
log_step: 200
|
||||||
|
plot: False
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
data:
|
||||||
|
num_nodes: 307
|
||||||
|
lag: 12
|
||||||
|
horizon: 12
|
||||||
|
val_ratio: 0.2
|
||||||
|
test_ratio: 0.2
|
||||||
|
tod: False
|
||||||
|
normalizer: std
|
||||||
|
column_wise: False
|
||||||
|
default_graph: True
|
||||||
|
add_time_in_day: True
|
||||||
|
add_day_in_week: True
|
||||||
|
steps_per_day: 288
|
||||||
|
days_per_week: 7
|
||||||
|
|
||||||
|
model:
|
||||||
|
input_dim: 3
|
||||||
|
output_dim: 1
|
||||||
|
history: 12
|
||||||
|
horizon: 12
|
||||||
|
num_nodes: 307
|
||||||
|
input_len: 12
|
||||||
|
embed_dim": 32
|
||||||
|
output_len: 12
|
||||||
|
num_layer: 3
|
||||||
|
if_node: True
|
||||||
|
node_dim: 32
|
||||||
|
if_T_i_D: True
|
||||||
|
if_D_i_W: True
|
||||||
|
temp_dim_tid: 32
|
||||||
|
temp_dim_diw: 32
|
||||||
|
time_of_day_size: 288
|
||||||
|
day_of_week_size: 7
|
||||||
|
|
||||||
|
|
||||||
|
train:
|
||||||
|
loss_func: mae
|
||||||
|
seed: 1
|
||||||
|
batch_size: 64
|
||||||
|
epochs: 300
|
||||||
|
lr_init: 0.002
|
||||||
|
weight_decay: 0.0001
|
||||||
|
lr_decay: False
|
||||||
|
lr_decay_rate: 0.3
|
||||||
|
lr_decay_step: "1,50,80"
|
||||||
|
early_stop: True
|
||||||
|
early_stop_patience: 15
|
||||||
|
grad_norm: False
|
||||||
|
max_grad_norm: 5
|
||||||
|
real_value: True
|
||||||
|
|
||||||
|
test:
|
||||||
|
mae_thresh: null
|
||||||
|
mape_thresh: 0.0
|
||||||
|
|
||||||
|
log:
|
||||||
|
log_step: 200
|
||||||
|
plot: False
|
||||||
|
|
@ -18,7 +18,7 @@ log:
|
||||||
plot: false
|
plot: false
|
||||||
model:
|
model:
|
||||||
cheb_order: 2
|
cheb_order: 2
|
||||||
embed_dim: 5
|
embed_dim: 12
|
||||||
input_dim: 1
|
input_dim: 1
|
||||||
num_layers: 1
|
num_layers: 1
|
||||||
output_dim: 1
|
output_dim: 1
|
||||||
|
|
@ -29,10 +29,10 @@ test:
|
||||||
mae_thresh: None
|
mae_thresh: None
|
||||||
mape_thresh: 0.001
|
mape_thresh: 0.001
|
||||||
train:
|
train:
|
||||||
batch_size: 64
|
batch_size: 12
|
||||||
early_stop: true
|
early_stop: true
|
||||||
early_stop_patience: 15
|
early_stop_patience: 30
|
||||||
epochs: 100
|
epochs: 200
|
||||||
grad_norm: false
|
grad_norm: false
|
||||||
loss_func: mae
|
loss_func: mae
|
||||||
lr_decay: true
|
lr_decay: true
|
||||||
|
|
@ -41,5 +41,5 @@ train:
|
||||||
lr_init: 0.003
|
lr_init: 0.003
|
||||||
max_grad_norm: 5
|
max_grad_norm: 5
|
||||||
real_value: true
|
real_value: true
|
||||||
seed: 12
|
seed: 3407
|
||||||
weight_decay: 0
|
weight_decay: 0
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,213 @@
|
||||||
|
import numpy as np
|
||||||
|
import gc
|
||||||
|
import os
|
||||||
|
import torch
|
||||||
|
import h5py
|
||||||
|
from lib.normalization import normalize_dataset
|
||||||
|
|
||||||
|
|
||||||
|
def get_dataloader(args, normalizer='std', single=True):
|
||||||
|
# args should now include 'cycle'
|
||||||
|
data = load_st_dataset(args['type'], args['sample']) # [T, N, F]
|
||||||
|
L, N, F = data.shape
|
||||||
|
|
||||||
|
# compute cycle index
|
||||||
|
cycle_arr = np.arange(L) % args['cycle'] # length-L array
|
||||||
|
|
||||||
|
# Step 1: sliding windows for X and Y
|
||||||
|
x = add_window_x(data, args['lag'], args['horizon'], single)
|
||||||
|
y = add_window_y(data, args['lag'], args['horizon'], single)
|
||||||
|
# window count = M = L - lag - horizon + 1
|
||||||
|
M = x.shape[0]
|
||||||
|
|
||||||
|
# Step 2: time features
|
||||||
|
time_in_day = np.tile(
|
||||||
|
np.array([i % args['steps_per_day'] / args['steps_per_day'] for i in range(L)]),
|
||||||
|
(N, 1)
|
||||||
|
).T.reshape(L, N, 1)
|
||||||
|
day_in_week = np.tile(
|
||||||
|
np.array([(i // args['steps_per_day']) % args['days_per_week'] for i in range(L)]),
|
||||||
|
(N, 1)
|
||||||
|
).T.reshape(L, N, 1)
|
||||||
|
|
||||||
|
x_day = add_window_x(time_in_day, args['lag'], args['horizon'], single)
|
||||||
|
x_week = add_window_x(day_in_week, args['lag'], args['horizon'], single)
|
||||||
|
x = np.concatenate([x, x_day, x_week], axis=-1)
|
||||||
|
# del x_day, x_week
|
||||||
|
# gc.collect()
|
||||||
|
|
||||||
|
# Step 3: extract cycle index per window: take value at end of sequence
|
||||||
|
cycle_win = np.array([cycle_arr[i + args['lag']] for i in range(M)]) # shape [M]
|
||||||
|
|
||||||
|
# Step 4: split into train/val/test
|
||||||
|
if args['test_ratio'] > 1:
|
||||||
|
x_train, x_val, x_test = split_data_by_days(x, args['val_ratio'], args['test_ratio'])
|
||||||
|
y_train, y_val, y_test = split_data_by_days(y, args['val_ratio'], args['test_ratio'])
|
||||||
|
c_train, c_val, c_test = split_data_by_days(cycle_win, args['val_ratio'], args['test_ratio'])
|
||||||
|
else:
|
||||||
|
x_train, x_val, x_test = split_data_by_ratio(x, args['val_ratio'], args['test_ratio'])
|
||||||
|
y_train, y_val, y_test = split_data_by_ratio(y, args['val_ratio'], args['test_ratio'])
|
||||||
|
c_train, c_val, c_test = split_data_by_ratio(cycle_win, args['val_ratio'], args['test_ratio'])
|
||||||
|
# del x, y, cycle_win
|
||||||
|
# gc.collect()
|
||||||
|
|
||||||
|
# Step 5: normalization on X only
|
||||||
|
scaler = normalize_dataset(x_train[..., :args['input_dim']], normalizer, args['column_wise'])
|
||||||
|
x_train[..., :args['input_dim']] = scaler.transform(x_train[..., :args['input_dim']])
|
||||||
|
x_val[..., :args['input_dim']] = scaler.transform(x_val[..., :args['input_dim']])
|
||||||
|
x_test[..., :args['input_dim']] = scaler.transform(x_test[..., :args['input_dim']])
|
||||||
|
|
||||||
|
# add time features to Y
|
||||||
|
y_day = add_window_y(time_in_day, args['lag'], args['horizon'], single)
|
||||||
|
y_week = add_window_y(day_in_week, args['lag'], args['horizon'], single)
|
||||||
|
y = np.concatenate([y, y_day, y_week], axis=-1)
|
||||||
|
# del y_day, y_week, time_in_day, day_in_week
|
||||||
|
# gc.collect()
|
||||||
|
|
||||||
|
# split Y time-augmented
|
||||||
|
if args['test_ratio'] > 1:
|
||||||
|
y_train, y_val, y_test = split_data_by_days(y, args['val_ratio'], args['test_ratio'])
|
||||||
|
else:
|
||||||
|
y_train, y_val, y_test = split_data_by_ratio(y, args['val_ratio'], args['test_ratio'])
|
||||||
|
# del y
|
||||||
|
|
||||||
|
# Step 6: create dataloaders including cycle index
|
||||||
|
train_loader = data_loader_with_cycle(x_train, y_train, c_train, args['batch_size'], shuffle=True, drop_last=True)
|
||||||
|
val_loader = data_loader_with_cycle(x_val, y_val, c_val, args['batch_size'], shuffle=False, drop_last=True)
|
||||||
|
test_loader = data_loader_with_cycle(x_test, y_test, c_test, args['batch_size'], shuffle=False, drop_last=False)
|
||||||
|
|
||||||
|
return train_loader, val_loader, test_loader, scaler
|
||||||
|
|
||||||
|
|
||||||
|
def data_loader_with_cycle(X, Y, C, batch_size, shuffle=True, drop_last=True):
|
||||||
|
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
|
||||||
|
X_t = torch.tensor(X, dtype=torch.float32, device=device)
|
||||||
|
Y_t = torch.tensor(Y, dtype=torch.float32, device=device)
|
||||||
|
C_t = torch.tensor(C, dtype=torch.long, device=device).unsqueeze(-1) # [B,1]
|
||||||
|
dataset = torch.utils.data.TensorDataset(X_t, Y_t, C_t)
|
||||||
|
loader = torch.utils.data.DataLoader(dataset, batch_size=batch_size, shuffle=shuffle, drop_last=drop_last)
|
||||||
|
return loader
|
||||||
|
|
||||||
|
# Rest of the helper functions (load_st_dataset, split_data..., add_window_x/y) unchanged
|
||||||
|
|
||||||
|
|
||||||
|
def load_st_dataset(dataset, sample):
|
||||||
|
# output B, N, D
|
||||||
|
match dataset:
|
||||||
|
case 'PEMSD3':
|
||||||
|
data_path = os.path.join('./data/PEMS03/PEMS03.npz')
|
||||||
|
data = np.load(data_path)['data'][:, :, 0] # only the first dimension, traffic flow data
|
||||||
|
case 'PEMSD4':
|
||||||
|
data_path = os.path.join('./data/PEMS04/PEMS04.npz')
|
||||||
|
data = np.load(data_path)['data'][:, :, 0] # only the first dimension, traffic flow data
|
||||||
|
case 'PEMSD7':
|
||||||
|
data_path = os.path.join('./data/PEMS07/PEMS07.npz')
|
||||||
|
data = np.load(data_path)['data'][:, :, 0] # only the first dimension, traffic flow data
|
||||||
|
case 'PEMSD8':
|
||||||
|
data_path = os.path.join('./data/PEMS08/PEMS08.npz')
|
||||||
|
data = np.load(data_path)['data'][:, :, 0] # only the first dimension, traffic flow data
|
||||||
|
case 'PEMSD7(L)':
|
||||||
|
data_path = os.path.join('./data/PEMS07(L)/PEMS07L.npz')
|
||||||
|
data = np.load(data_path)['data'][:, :, 0] # only the first dimension, traffic flow data
|
||||||
|
case 'PEMSD7(M)':
|
||||||
|
data_path = os.path.join('./data/PEMS07(M)/V_228.csv')
|
||||||
|
data = np.genfromtxt(data_path, delimiter=',') # Read CSV directly with numpy
|
||||||
|
case 'METR-LA':
|
||||||
|
data_path = os.path.join('./data/METR-LA/METR.h5')
|
||||||
|
with h5py.File(data_path, 'r') as f: # Use h5py to handle HDF5 files without pandas
|
||||||
|
data = np.array(f['data'])
|
||||||
|
case 'BJ':
|
||||||
|
data_path = os.path.join('./data/BJ/BJ500.csv')
|
||||||
|
data = np.genfromtxt(data_path, delimiter=',', skip_header=1) # Skip header if present
|
||||||
|
case 'Hainan':
|
||||||
|
data_path = os.path.join('./data/Hainan/Hainan.npz')
|
||||||
|
data = np.load(data_path)['data'][:, :, 0]
|
||||||
|
case 'SD':
|
||||||
|
data_path = os.path.join('./data/SD/data.npz')
|
||||||
|
data = np.load(data_path)["data"][:, :, 0].astype(np.float32)
|
||||||
|
case _:
|
||||||
|
raise ValueError(f"Unsupported dataset: {dataset}")
|
||||||
|
|
||||||
|
# Ensure data shape compatibility
|
||||||
|
if len(data.shape) == 2:
|
||||||
|
data = np.expand_dims(data, axis=-1)
|
||||||
|
|
||||||
|
print('加载 %s 数据集中... ' % dataset)
|
||||||
|
return data[::sample]
|
||||||
|
|
||||||
|
def split_data_by_days(data, val_days, test_days, interval=30):
|
||||||
|
t = int((24 * 60) / interval)
|
||||||
|
test_data = data[-t * int(test_days):]
|
||||||
|
val_data = data[-t * int(test_days + val_days):-t * int(test_days)]
|
||||||
|
train_data = data[:-t * int(test_days + val_days)]
|
||||||
|
return train_data, val_data, test_data
|
||||||
|
|
||||||
|
|
||||||
|
def split_data_by_ratio(data, val_ratio, test_ratio):
|
||||||
|
data_len = data.shape[0]
|
||||||
|
test_data = data[-int(data_len * test_ratio):]
|
||||||
|
val_data = data[-int(data_len * (test_ratio + val_ratio)):-int(data_len * test_ratio)]
|
||||||
|
train_data = data[:-int(data_len * (test_ratio + val_ratio))]
|
||||||
|
return train_data, val_data, test_data
|
||||||
|
|
||||||
|
|
||||||
|
def data_loader(X, Y, batch_size, shuffle=True, drop_last=True):
|
||||||
|
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
|
||||||
|
X = torch.tensor(X, dtype=torch.float32, device=device)
|
||||||
|
Y = torch.tensor(Y, dtype=torch.float32, device=device)
|
||||||
|
data = torch.utils.data.TensorDataset(X, Y)
|
||||||
|
dataloader = torch.utils.data.DataLoader(data, batch_size=batch_size,
|
||||||
|
shuffle=shuffle, drop_last=drop_last)
|
||||||
|
return dataloader
|
||||||
|
|
||||||
|
|
||||||
|
def add_window_x(data, window=3, horizon=1, single=False):
|
||||||
|
"""
|
||||||
|
Generate windowed X values from the input data.
|
||||||
|
|
||||||
|
:param data: Input data, shape [B, ...]
|
||||||
|
:param window: Size of the sliding window
|
||||||
|
:param horizon: Horizon size
|
||||||
|
:param single: If True, generate single-step windows, else multi-step
|
||||||
|
:return: X with shape [B, W, ...]
|
||||||
|
"""
|
||||||
|
length = len(data)
|
||||||
|
end_index = length - horizon - window + 1
|
||||||
|
x = [] # Sliding windows
|
||||||
|
index = 0
|
||||||
|
|
||||||
|
while index < end_index:
|
||||||
|
x.append(data[index:index + window])
|
||||||
|
index += 1
|
||||||
|
|
||||||
|
return np.array(x)
|
||||||
|
|
||||||
|
|
||||||
|
def add_window_y(data, window=3, horizon=1, single=False):
|
||||||
|
"""
|
||||||
|
Generate windowed Y values from the input data.
|
||||||
|
|
||||||
|
:param data: Input data, shape [B, ...]
|
||||||
|
:param window: Size of the sliding window
|
||||||
|
:param horizon: Horizon size
|
||||||
|
:param single: If True, generate single-step windows, else multi-step
|
||||||
|
:return: Y with shape [B, H, ...]
|
||||||
|
"""
|
||||||
|
length = len(data)
|
||||||
|
end_index = length - horizon - window + 1
|
||||||
|
y = [] # Horizon values
|
||||||
|
index = 0
|
||||||
|
|
||||||
|
while index < end_index:
|
||||||
|
if single:
|
||||||
|
y.append(data[index + window + horizon - 1:index + window + horizon])
|
||||||
|
else:
|
||||||
|
y.append(data[index + window:index + window + horizon])
|
||||||
|
index += 1
|
||||||
|
|
||||||
|
return np.array(y)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
res = load_st_dataset('SD', 1)
|
||||||
|
k = 1
|
||||||
|
|
@ -121,6 +121,9 @@ def load_st_dataset(dataset, sample):
|
||||||
case 'Hainan':
|
case 'Hainan':
|
||||||
data_path = os.path.join('./data/Hainan/Hainan.npz')
|
data_path = os.path.join('./data/Hainan/Hainan.npz')
|
||||||
data = np.load(data_path)['data'][:, :, 0]
|
data = np.load(data_path)['data'][:, :, 0]
|
||||||
|
case 'SD':
|
||||||
|
data_path = os.path.join('./data/SD/data.npz')
|
||||||
|
data = np.load(data_path)["data"][:, :, 0].astype(np.float32)
|
||||||
case _:
|
case _:
|
||||||
raise ValueError(f"Unsupported dataset: {dataset}")
|
raise ValueError(f"Unsupported dataset: {dataset}")
|
||||||
|
|
||||||
|
|
@ -204,3 +207,6 @@ def add_window_y(data, window=3, horizon=1, single=False):
|
||||||
return np.array(y)
|
return np.array(y)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
res = load_st_dataset('SD', 1)
|
||||||
|
k = 1
|
||||||
|
|
@ -1,11 +1,13 @@
|
||||||
from dataloader.cde_loader.cdeDataloader import get_dataloader as cde_loader
|
from dataloader.cde_loader.cdeDataloader import get_dataloader as cde_loader
|
||||||
from dataloader.PeMSDdataloader import get_dataloader as normal_loader
|
from dataloader.PeMSDdataloader import get_dataloader as normal_loader
|
||||||
from dataloader.DCRNNdataloader import get_dataloader as DCRNN_loader
|
from dataloader.DCRNNdataloader import get_dataloader as DCRNN_loader
|
||||||
|
from dataloader.EXPdataloader import get_dataloader as EXP_loader
|
||||||
|
|
||||||
def get_dataloader(config, normalizer, single):
|
def get_dataloader(config, normalizer, single):
|
||||||
match config['model']['type']:
|
match config['model']['type']:
|
||||||
case 'STGNCDE': return cde_loader(config['data'], normalizer, single)
|
case 'STGNCDE': return cde_loader(config['data'], normalizer, single)
|
||||||
case 'DCRNN': return DCRNN_loader(config['data'], normalizer, single)
|
case 'DCRNN': return DCRNN_loader(config['data'], normalizer, single)
|
||||||
|
case 'EXP': return EXP_loader(config['data'], normalizer, single)
|
||||||
case _: return normal_loader(config['data'], normalizer, single)
|
case _: return normal_loader(config['data'], normalizer, single)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,267 @@
|
||||||
|
import pickle
|
||||||
|
import torch
|
||||||
|
import numpy as np
|
||||||
|
import os
|
||||||
|
import gc
|
||||||
|
# ! X shape: (B, T, N, C)
|
||||||
|
|
||||||
|
def load_pkl(pickle_file: str) -> object:
|
||||||
|
"""
|
||||||
|
Load data from a pickle file.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
pickle_file (str): Path to the pickle file.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
object: Loaded object from the pickle file.
|
||||||
|
"""
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(pickle_file, "rb") as f:
|
||||||
|
pickle_data = pickle.load(f)
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
with open(pickle_file, "rb") as f:
|
||||||
|
pickle_data = pickle.load(f, encoding="latin1")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Unable to load data from {pickle_file}: {e}")
|
||||||
|
raise
|
||||||
|
return pickle_data
|
||||||
|
|
||||||
|
def get_dataloaders_from_index_data(
|
||||||
|
data_dir, tod=False, dow=False, batch_size=64, log=None, train_size=0.6
|
||||||
|
):
|
||||||
|
data = np.load(os.path.join(data_dir, "data.npz"))["data"].astype(np.float32)
|
||||||
|
|
||||||
|
features = [0]
|
||||||
|
if tod:
|
||||||
|
features.append(1)
|
||||||
|
if dow:
|
||||||
|
features.append(2)
|
||||||
|
# if dom:
|
||||||
|
# features.append(3)
|
||||||
|
data = data[..., features]
|
||||||
|
|
||||||
|
index = np.load(os.path.join(data_dir, "index.npz"))
|
||||||
|
|
||||||
|
train_index = index["train"] # (num_samples, 3)
|
||||||
|
val_index = index["val"]
|
||||||
|
test_index = index["test"]
|
||||||
|
|
||||||
|
x_train_index = vrange(train_index[:, 0], train_index[:, 1])
|
||||||
|
y_train_index = vrange(train_index[:, 1], train_index[:, 2])
|
||||||
|
x_val_index = vrange(val_index[:, 0], val_index[:, 1])
|
||||||
|
y_val_index = vrange(val_index[:, 1], val_index[:, 2])
|
||||||
|
x_test_index = vrange(test_index[:, 0], test_index[:, 1])
|
||||||
|
y_test_index = vrange(test_index[:, 1], test_index[:, 2])
|
||||||
|
|
||||||
|
x_train = data[x_train_index]
|
||||||
|
y_train = data[y_train_index][..., :1]
|
||||||
|
x_val = data[x_val_index]
|
||||||
|
y_val = data[y_val_index][..., :1]
|
||||||
|
x_test = data[x_test_index]
|
||||||
|
y_test = data[y_test_index][..., :1]
|
||||||
|
|
||||||
|
scaler = StandardScaler(mean=x_train[..., 0].mean(), std=x_train[..., 0].std())
|
||||||
|
|
||||||
|
x_train[..., 0] = scaler.transform(x_train[..., 0])
|
||||||
|
x_val[..., 0] = scaler.transform(x_val[..., 0])
|
||||||
|
x_test[..., 0] = scaler.transform(x_test[..., 0])
|
||||||
|
|
||||||
|
print_log(f"Trainset:\tx-{x_train.shape}\ty-{y_train.shape}", log=log)
|
||||||
|
print_log(f"Valset: \tx-{x_val.shape} \ty-{y_val.shape}", log=log)
|
||||||
|
print_log(f"Testset:\tx-{x_test.shape}\ty-{y_test.shape}", log=log)
|
||||||
|
|
||||||
|
trainset = torch.utils.data.TensorDataset(
|
||||||
|
torch.FloatTensor(x_train), torch.FloatTensor(y_train)
|
||||||
|
)
|
||||||
|
valset = torch.utils.data.TensorDataset(
|
||||||
|
torch.FloatTensor(x_val), torch.FloatTensor(y_val)
|
||||||
|
)
|
||||||
|
testset = torch.utils.data.TensorDataset(
|
||||||
|
torch.FloatTensor(x_test), torch.FloatTensor(y_test)
|
||||||
|
)
|
||||||
|
if train_size != 0.6:
|
||||||
|
drop_last=True
|
||||||
|
else:
|
||||||
|
drop_last=False
|
||||||
|
trainset_loader = torch.utils.data.DataLoader(
|
||||||
|
trainset, batch_size=batch_size, shuffle=True, drop_last=drop_last
|
||||||
|
)
|
||||||
|
valset_loader = torch.utils.data.DataLoader(
|
||||||
|
valset, batch_size=batch_size, shuffle=False, drop_last=drop_last
|
||||||
|
)
|
||||||
|
testset_loader = torch.utils.data.DataLoader(
|
||||||
|
testset, batch_size=batch_size, shuffle=False, drop_last=drop_last
|
||||||
|
)
|
||||||
|
|
||||||
|
return trainset_loader, valset_loader, testset_loader, scaler
|
||||||
|
|
||||||
|
def get_dataloaders_from_index_data_MTS(
|
||||||
|
data_dir,
|
||||||
|
in_steps=12,
|
||||||
|
out_steps=12,
|
||||||
|
tod=False,
|
||||||
|
dow=False,
|
||||||
|
y_tod=False,
|
||||||
|
y_dow=False,
|
||||||
|
batch_size=64,
|
||||||
|
log=None,
|
||||||
|
):
|
||||||
|
data = np.load(os.path.join(data_dir, f"data.npz"))["data"].astype(np.float32)
|
||||||
|
index = np.load(os.path.join(data_dir, f"index_{in_steps}_{out_steps}.npz"))
|
||||||
|
|
||||||
|
x_features = [0]
|
||||||
|
if tod:
|
||||||
|
x_features.append(1)
|
||||||
|
if dow:
|
||||||
|
x_features.append(2)
|
||||||
|
|
||||||
|
y_features = [0]
|
||||||
|
if y_tod:
|
||||||
|
y_features.append(1)
|
||||||
|
if y_dow:
|
||||||
|
y_features.append(2)
|
||||||
|
|
||||||
|
train_index = index["train"] # (num_samples, 3)
|
||||||
|
val_index = index["val"]
|
||||||
|
test_index = index["test"]
|
||||||
|
|
||||||
|
# Parallel
|
||||||
|
# x_train_index = vrange(train_index[:, 0], train_index[:, 1])
|
||||||
|
# y_train_index = vrange(train_index[:, 1], train_index[:, 2])
|
||||||
|
# x_val_index = vrange(val_index[:, 0], val_index[:, 1])
|
||||||
|
# y_val_index = vrange(val_index[:, 1], val_index[:, 2])
|
||||||
|
# x_test_index = vrange(test_index[:, 0], test_index[:, 1])
|
||||||
|
# y_test_index = vrange(test_index[:, 1], test_index[:, 2])
|
||||||
|
|
||||||
|
# x_train = data[x_train_index][..., x_features]
|
||||||
|
# y_train = data[y_train_index][..., y_features]
|
||||||
|
# x_val = data[x_val_index][..., x_features]
|
||||||
|
# y_val = data[y_val_index][..., y_features]
|
||||||
|
# x_test = data[x_test_index][..., x_features]
|
||||||
|
# y_test = data[y_test_index][..., y_features]
|
||||||
|
|
||||||
|
# Iterative
|
||||||
|
x_train = np.stack([data[idx[0] : idx[1]] for idx in train_index])[..., x_features]
|
||||||
|
y_train = np.stack([data[idx[1] : idx[2]] for idx in train_index])[..., y_features]
|
||||||
|
x_val = np.stack([data[idx[0] : idx[1]] for idx in val_index])[..., x_features]
|
||||||
|
y_val = np.stack([data[idx[1] : idx[2]] for idx in val_index])[..., y_features]
|
||||||
|
x_test = np.stack([data[idx[0] : idx[1]] for idx in test_index])[..., x_features]
|
||||||
|
y_test = np.stack([data[idx[1] : idx[2]] for idx in test_index])[..., y_features]
|
||||||
|
|
||||||
|
scaler = StandardScaler(mean=x_train[..., 0].mean(), std=x_train[..., 0].std())
|
||||||
|
|
||||||
|
x_train[..., 0] = scaler.transform(x_train[..., 0])
|
||||||
|
x_val[..., 0] = scaler.transform(x_val[..., 0])
|
||||||
|
x_test[..., 0] = scaler.transform(x_test[..., 0])
|
||||||
|
|
||||||
|
print_log(f"Trainset:\tx-{x_train.shape}\ty-{y_train.shape}", log=log)
|
||||||
|
print_log(f"Valset: \tx-{x_val.shape} \ty-{y_val.shape}", log=log)
|
||||||
|
print_log(f"Testset:\tx-{x_test.shape}\ty-{y_test.shape}", log=log)
|
||||||
|
|
||||||
|
trainset = torch.utils.data.TensorDataset(
|
||||||
|
torch.FloatTensor(x_train), torch.FloatTensor(y_train)
|
||||||
|
)
|
||||||
|
valset = torch.utils.data.TensorDataset(
|
||||||
|
torch.FloatTensor(x_val), torch.FloatTensor(y_val)
|
||||||
|
)
|
||||||
|
testset = torch.utils.data.TensorDataset(
|
||||||
|
torch.FloatTensor(x_test), torch.FloatTensor(y_test)
|
||||||
|
)
|
||||||
|
|
||||||
|
trainset_loader = torch.utils.data.DataLoader(
|
||||||
|
trainset, batch_size=batch_size, shuffle=True
|
||||||
|
)
|
||||||
|
valset_loader = torch.utils.data.DataLoader(
|
||||||
|
valset, batch_size=batch_size, shuffle=False
|
||||||
|
)
|
||||||
|
testset_loader = torch.utils.data.DataLoader(
|
||||||
|
testset, batch_size=batch_size, shuffle=False
|
||||||
|
)
|
||||||
|
|
||||||
|
return trainset_loader, valset_loader, testset_loader, scaler
|
||||||
|
|
||||||
|
def get_dataloaders_from_index_data_Test(
|
||||||
|
data_dir,
|
||||||
|
in_steps=12,
|
||||||
|
out_steps=12,
|
||||||
|
tod=False,
|
||||||
|
dow=False,
|
||||||
|
y_tod=False,
|
||||||
|
y_dow=False,
|
||||||
|
batch_size=64,
|
||||||
|
log=None,
|
||||||
|
):
|
||||||
|
data = np.load(os.path.join(data_dir, f"data.npz"))["data"].astype(np.float32)
|
||||||
|
index = np.load(os.path.join(data_dir, f"index_{in_steps}_{out_steps}.npz"))
|
||||||
|
|
||||||
|
x_features = [0]
|
||||||
|
if tod:
|
||||||
|
x_features.append(1)
|
||||||
|
if dow:
|
||||||
|
x_features.append(2)
|
||||||
|
|
||||||
|
y_features = [0]
|
||||||
|
if y_tod:
|
||||||
|
y_features.append(1)
|
||||||
|
if y_dow:
|
||||||
|
y_features.append(2)
|
||||||
|
|
||||||
|
train_index = index["train"] # (num_samples, 3)
|
||||||
|
# val_index = index["val"]
|
||||||
|
test_index = index["test"]
|
||||||
|
|
||||||
|
# Parallel
|
||||||
|
# x_train_index = vrange(train_index[:, 0], train_index[:, 1])
|
||||||
|
# y_train_index = vrange(train_index[:, 1], train_index[:, 2])
|
||||||
|
# x_val_index = vrange(val_index[:, 0], val_index[:, 1])
|
||||||
|
# y_val_index = vrange(val_index[:, 1], val_index[:, 2])
|
||||||
|
# x_test_index = vrange(test_index[:, 0], test_index[:, 1])
|
||||||
|
# y_test_index = vrange(test_index[:, 1], test_index[:, 2])
|
||||||
|
|
||||||
|
# x_train = data[x_train_index][..., x_features]
|
||||||
|
# y_train = data[y_train_index][..., y_features]
|
||||||
|
# x_val = data[x_val_index][..., x_features]
|
||||||
|
# y_val = data[y_val_index][..., y_features]
|
||||||
|
# x_test = data[x_test_index][..., x_features]
|
||||||
|
# y_test = data[y_test_index][..., y_features]
|
||||||
|
|
||||||
|
# Iterative
|
||||||
|
x_train = np.stack([data[idx[0] : idx[1]] for idx in train_index])[..., x_features]
|
||||||
|
# y_train = np.stack([data[idx[1] : idx[2]] for idx in train_index])[..., y_features]
|
||||||
|
# x_val = np.stack([data[idx[0] : idx[1]] for idx in val_index])[..., x_features]
|
||||||
|
# y_val = np.stack([data[idx[1] : idx[2]] for idx in val_index])[..., y_features]
|
||||||
|
x_test = np.stack([data[idx[0] : idx[1]] for idx in test_index])[..., x_features]
|
||||||
|
y_test = np.stack([data[idx[1] : idx[2]] for idx in test_index])[..., y_features]
|
||||||
|
|
||||||
|
scaler = StandardScaler(mean=x_train[..., 0].mean(), std=x_train[..., 0].std())
|
||||||
|
|
||||||
|
# x_train[..., 0] = scaler.transform(x_train[..., 0])
|
||||||
|
# x_val[..., 0] = scaler.transform(x_val[..., 0])
|
||||||
|
x_test[..., 0] = scaler.transform(x_test[..., 0])
|
||||||
|
|
||||||
|
# print_log(f"Trainset:\tx-{x_train.shape}\ty-{y_train.shape}", log=log)
|
||||||
|
# print_log(f"Valset: \tx-{x_val.shape} \ty-{y_val.shape}", log=log)
|
||||||
|
print_log(f"Testset:\tx-{x_test.shape}\ty-{y_test.shape}", log=log)
|
||||||
|
|
||||||
|
# trainset = torch.utils.data.TensorDataset(
|
||||||
|
# torch.FloatTensor(x_train), torch.FloatTensor(y_train)
|
||||||
|
# )
|
||||||
|
# valset = torch.utils.data.TensorDataset(
|
||||||
|
# torch.FloatTensor(x_val), torch.FloatTensor(y_val)
|
||||||
|
# )
|
||||||
|
testset = torch.utils.data.TensorDataset(
|
||||||
|
torch.FloatTensor(x_test), torch.FloatTensor(y_test)
|
||||||
|
)
|
||||||
|
|
||||||
|
# trainset_loader = torch.utils.data.DataLoader(
|
||||||
|
# trainset, batch_size=batch_size, shuffle=True
|
||||||
|
# )
|
||||||
|
# valset_loader = torch.utils.data.DataLoader(
|
||||||
|
# valset, batch_size=batch_size, shuffle=False
|
||||||
|
# )
|
||||||
|
testset_loader = torch.utils.data.DataLoader(
|
||||||
|
testset, batch_size=batch_size, shuffle=False
|
||||||
|
)
|
||||||
|
|
||||||
|
return testset_loader, scaler
|
||||||
|
|
@ -12,6 +12,8 @@ def init_model(args, device):
|
||||||
nn.init.xavier_uniform_(p)
|
nn.init.xavier_uniform_(p)
|
||||||
else:
|
else:
|
||||||
nn.init.uniform_(p)
|
nn.init.uniform_(p)
|
||||||
|
total_params = sum(p.numel() for p in model.parameters())
|
||||||
|
print(f"Model has {total_params} parameters")
|
||||||
return model
|
return model
|
||||||
|
|
||||||
def init_optimizer(model, args):
|
def init_optimizer(model, args):
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue