JustAGeek commited on
Commit
d7e0e08
·
verified ·
1 Parent(s): 41b6a9d

Upload scripts/run_multiseed_baseline.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. scripts/run_multiseed_baseline.py +203 -0
scripts/run_multiseed_baseline.py ADDED
@@ -0,0 +1,203 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ run_multiseed_baseline.py
3
+ Multi-seed training for DLoc baseline (Enc_2Dec_Network).
4
+ """
5
+ import os, sys, time, random
6
+ import torch
7
+ import numpy as np
8
+ import warnings
9
+ with warnings.catch_warnings():
10
+ warnings.filterwarnings("ignore", category=FutureWarning)
11
+
12
+ from utils import localization_error, write_log
13
+ from data_loader import load_data
14
+ from modelADT import ModelADT
15
+ from joint_model import Enc_2Dec_Network
16
+
17
+ SEEDS = [42, 123, 777]
18
+ EPOCHS = 120
19
+ BATCH_SIZE = 64
20
+ NUM_WORKERS = 4
21
+
22
+ trainpath = [
23
+ "./data/dataset_jacobs_July28.mat",
24
+ "./data/dataset_non_fov_train_jacobs_July28_2.mat",
25
+ "./data/dataset_fov_train_jacobs_July28_2.mat",
26
+ ]
27
+ testpath = [
28
+ "./data/dataset_fov_test_jacobs_July28_2.mat",
29
+ "./data/dataset_non_fov_test_jacobs_July28_2.mat",
30
+ ]
31
+
32
+ SEP1 = "=" * 60
33
+ SEP2 = "=" * 65
34
+ SEP3 = "-" * 65
35
+
36
+
37
+ def set_seed(seed):
38
+ random.seed(seed)
39
+ np.random.seed(seed)
40
+ torch.manual_seed(seed)
41
+ if torch.cuda.is_available():
42
+ torch.cuda.manual_seed_all(seed)
43
+
44
+
45
+ def build_model():
46
+ from params_storage.params_fig10b_single_gpu import opt_exp, opt_encoder, opt_decoder, opt_offset_decoder
47
+ enc = ModelADT(); enc.initialize(opt_encoder); enc.setup(opt_encoder)
48
+ dec = ModelADT(); dec.initialize(opt_decoder); dec.setup(opt_decoder)
49
+ off = ModelADT(); off.initialize(opt_offset_decoder); off.setup(opt_offset_decoder)
50
+ model = Enc_2Dec_Network()
51
+ model.initialize(opt_exp, enc, dec, off, gpu_ids=opt_exp.gpu_ids)
52
+ return model
53
+
54
+
55
+ def train_one_seed(seed, train_loader, test_loader, save_dir):
56
+ set_seed(seed)
57
+ print(f"\n{SEP1}")
58
+ print(f" SEED {seed} -- BASELINE DLoc ({EPOCHS} epochs)")
59
+ print(SEP1)
60
+
61
+ model = build_model()
62
+ seed_dir = os.path.join(save_dir, f"seed_{seed}")
63
+ os.makedirs(seed_dir, exist_ok=True)
64
+
65
+ best_median = float("inf")
66
+ best_p90 = float("inf")
67
+ best_p99 = float("inf")
68
+
69
+ for epoch in range(1, EPOCHS + 1):
70
+ t0 = time.time()
71
+
72
+ # TRAIN
73
+ model.encoder.net.train()
74
+ model.decoder.net.train()
75
+ model.offset_decoder.net.train()
76
+ for data in train_loader:
77
+ model.set_input(data[1], data[2], data[0], shuffle_channel=True)
78
+ model.optimize_parameters()
79
+
80
+ # LR scheduling (critical — linear decay from niter to niter+niter_decay)
81
+ model.encoder.update_learning_rate()
82
+ model.decoder.update_learning_rate()
83
+ model.offset_decoder.update_learning_rate()
84
+
85
+ # TEST
86
+ model.eval()
87
+ test_errors = []
88
+ with torch.no_grad():
89
+ for data in test_loader:
90
+ model.set_input(data[1], data[2], data[0], shuffle_channel=False)
91
+ model.test()
92
+ pred = model.decoder.output.cpu().numpy()
93
+ lbl = data[2].cpu().numpy()
94
+ if lbl.ndim == 3:
95
+ lbl = lbl[:, np.newaxis, :, :]
96
+ test_errors.extend(localization_error(pred, lbl, scale=0.1))
97
+
98
+ test_median = np.median(test_errors)
99
+ test_p90 = np.percentile(test_errors, 90)
100
+ test_p99 = np.percentile(test_errors, 99)
101
+ elapsed = time.time() - t0
102
+
103
+ rl = f"seed{seed}_baseline"
104
+ write_log([str(test_median)], rl, log_dir=seed_dir, log_type="test_median_error")
105
+ write_log([str(test_p90)], rl, log_dir=seed_dir, log_type="test_90_error")
106
+ write_log([str(test_p99)], rl, log_dir=seed_dir, log_type="test_99_error")
107
+
108
+ marker = ""
109
+ if test_median < best_median:
110
+ best_median = test_median
111
+ best_p90 = test_p90
112
+ best_p99 = test_p99
113
+ marker = " *"
114
+
115
+ if epoch % 10 == 0 or epoch == 1 or marker:
116
+ print(f" Epoch {epoch}/{EPOCHS} | {elapsed:.0f}s | "
117
+ f"med={test_median:.3f}m P90={test_p90:.3f}m P99={test_p99:.3f}m{marker}")
118
+
119
+ print(f" Seed {seed} done. Best: med={best_median:.4f}m P90={best_p90:.3f}m P99={best_p99:.3f}m")
120
+ return {"median": best_median, "p90": best_p90, "p99": best_p99}
121
+
122
+
123
+ def main():
124
+ device = torch.device("cuda:0")
125
+ print(f"Device: {device}")
126
+ print(f"Seeds: {SEEDS} | Epochs: {EPOCHS}")
127
+
128
+ print("\nLoading training data...")
129
+ train_wo, train_w, train_lbl = [], [], []
130
+ for fp in trainpath:
131
+ wo, w, lbl = load_data(fp)
132
+ if lbl.dim() == 3:
133
+ lbl = lbl.unsqueeze(1)
134
+ train_wo.append(wo)
135
+ train_w.append(w)
136
+ train_lbl.append(lbl)
137
+ train_wo = torch.cat(train_wo, 0)
138
+ train_w = torch.cat(train_w, 0)
139
+ train_lbl = torch.cat(train_lbl, 0)
140
+ print(f"Training samples: {train_w.shape[0]}")
141
+
142
+ print("Loading testing data...")
143
+ test_wo, test_w, test_lbl = [], [], []
144
+ for fp in testpath:
145
+ wo, w, lbl = load_data(fp)
146
+ if lbl.dim() == 3:
147
+ lbl = lbl.unsqueeze(1)
148
+ test_wo.append(wo)
149
+ test_w.append(w)
150
+ test_lbl.append(lbl)
151
+ test_wo = torch.cat(test_wo, 0)
152
+ test_w = torch.cat(test_w, 0)
153
+ test_lbl = torch.cat(test_lbl, 0)
154
+ print(f"Testing samples: {test_w.shape[0]}")
155
+
156
+ train_data = torch.utils.data.TensorDataset(train_wo, train_w, train_lbl)
157
+ test_data = torch.utils.data.TensorDataset(test_wo, test_w, test_lbl)
158
+ train_loader = torch.utils.data.DataLoader(
159
+ train_data, batch_size=BATCH_SIZE, shuffle=True,
160
+ num_workers=NUM_WORKERS, pin_memory=True, persistent_workers=True)
161
+ test_loader = torch.utils.data.DataLoader(
162
+ test_data, batch_size=BATCH_SIZE, shuffle=False,
163
+ num_workers=NUM_WORKERS, pin_memory=True, persistent_workers=True)
164
+
165
+ timestamp = time.strftime("%Y-%m-%d-%H-%M-%S")
166
+ save_dir = os.path.join("./runs", f"multiseed_baseline_{timestamp}")
167
+ os.makedirs(save_dir, exist_ok=True)
168
+
169
+ all_results = []
170
+ for seed in SEEDS:
171
+ result = train_one_seed(seed, train_loader, test_loader, save_dir)
172
+ all_results.append(result)
173
+
174
+ medians = [r["median"] for r in all_results]
175
+ p90s = [r["p90"] for r in all_results]
176
+ p99s = [r["p99"] for r in all_results]
177
+
178
+ print(f"\n\n{SEP2}")
179
+ print(f" MULTI-SEED RESULTS: BASELINE DLoc")
180
+ print(SEP2)
181
+ for i, seed in enumerate(SEEDS):
182
+ r = all_results[i]
183
+ print(f" Seed {seed:<5}: median={r['median']:.4f}m P90={r['p90']:.3f}m P99={r['p99']:.3f}m")
184
+ print(SEP3)
185
+ print(f" Median error: {np.mean(medians):.4f} +/- {np.std(medians):.4f} m")
186
+ print(f" P90 error: {np.mean(p90s):.3f} +/- {np.std(p90s):.3f} m")
187
+ print(f" P99 error: {np.mean(p99s):.3f} +/- {np.std(p99s):.3f} m")
188
+ print(SEP2)
189
+
190
+ report_path = os.path.join(save_dir, "report.txt")
191
+ with open(report_path, "w") as f:
192
+ f.write(f"Student: baseline\nMode: standalone\nSeeds: {SEEDS}\nEpochs: {EPOCHS}\n\n")
193
+ for i, seed in enumerate(SEEDS):
194
+ r = all_results[i]
195
+ f.write(f"Seed {seed}: median={r['median']:.4f}m P90={r['p90']:.3f}m P99={r['p99']:.3f}m\n")
196
+ f.write(f"\nMedian: {np.mean(medians):.4f} +/- {np.std(medians):.4f} m\n")
197
+ f.write(f"P90: {np.mean(p90s):.3f} +/- {np.std(p90s):.3f} m\n")
198
+ f.write(f"P99: {np.mean(p99s):.3f} +/- {np.std(p99s):.3f} m\n")
199
+ print(f"\nReport saved to: {report_path}")
200
+
201
+
202
+ if __name__ == "__main__":
203
+ main()