GNN4Colliders / validation /transfer.py
ho22joshua's picture
rewriting codebase (#7)
916755e
Raw History Blame
2.71 kB
#!/usr/bin/env python3
"""Compare legacy/new transfer-learning forward with a fixed binary head."""
from __future__ import annotations
import argparse
from pathlib import Path
import dgl
import numpy as np
import torch
from validation.artifacts import load_artifact
from validation.forward import _graph
LEGACY_CONFIG = {
"module": "models.GCN",
"class": "Edge_Network",
"args": {
"hid_size": 64,
"out_size": 12,
"n_layers": 4,
"n_proc_steps": 4,
"dropout": 0.0,
},
}
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument(
"--implementation", choices=("legacy", "rewrite"), required=True
)
parser.add_argument("--artifact", type=Path, required=True)
parser.add_argument("--checkpoint", type=Path, required=True)
parser.add_argument("--output", type=Path, required=True)
parser.add_argument("--events", type=int, default=96)
parser.add_argument("--trainable-backbone", action="store_true")
args = parser.parse_args()
artifact = load_artifact(args.artifact)
count = min(args.events, artifact.event_count)
graphs = [_graph(artifact, index) for index in range(count)]
batch_graph = dgl.batch(graphs)
empty_globals = torch.empty((1, 0), dtype=torch.float32)
if args.implementation == "legacy":
from models.GCN import Transferred_Learning_Finetuning
model = Transferred_Learning_Finetuning(
str(args.checkpoint),
LEGACY_CONFIG,
graphs[0],
empty_globals,
64,
1,
4,
4,
dropout=0.0,
frozen_pretraining=not args.trainable_backbone,
)
classifier = model.classify
else:
from gnn4colliders.models.root_gnn import EdgeNetwork, FineTunedEdgeNetwork
backbone = EdgeNetwork(graphs[0], empty_globals, 64, 12, 4, 4, dropout=0.0)
payload = torch.load(args.checkpoint, map_location="cpu", weights_only=False)
from gnn4colliders.models.root_gnn import load_legacy_edge_network_state_dict
load_legacy_edge_network_state_dict(backbone, payload)
model = FineTunedEdgeNetwork(
backbone, 1, freeze_backbone=not args.trainable_backbone
)
classifier = model.classifier
torch.manual_seed(20260818)
classifier.load_state_dict(torch.nn.Linear(64, 1).state_dict())
model.eval()
with torch.inference_mode():
logits = model(batch_graph, None).cpu().numpy()
args.output.parent.mkdir(parents=True, exist_ok=True)
np.savez_compressed(args.output, logits=logits)
return 0
if __name__ == "__main__":
raise SystemExit(main())