#!/bin/bash # VLAlert-X v2 Phase 3 — 5-seed Danger Head training. # # Each seed: 50 epochs cosine LR + early-stop (patience 10) on val per_frame AUC. # Expected per-seed wall time: ~1 GPU-hr (small head on cached features) # 5 seeds total: ~5 GPU-hr. set -euo pipefail cd "$(dirname "$0")/../.." OUT_ROOT="checkpoints/danger_v2" mkdir -p logs "$OUT_ROOT" for seed in 0 1 2 3 4; do echo "================================================================" echo "Danger Head seed=${seed}" echo "================================================================" python -m training.Policy.train_danger_head \ --out_dir "${OUT_ROOT}/seed${seed}" \ --epochs 50 \ --batch_size 128 \ --lr 3e-4 \ --weight_decay 1e-4 \ --hidden 512 \ --k_queries 4 \ --dropout 0.2 \ --w_clip 0.5 \ --patience 10 \ --seed "${seed}" 2>&1 | tee "logs/phase3_danger_seed${seed}.log" done echo "" echo "===============================================================" echo "5-seed summary (val per_frame AUC):" for seed in 0 1 2 3 4; do if [[ -f "${OUT_ROOT}/seed${seed}/best.pt" ]]; then python -c " import torch d = torch.load('${OUT_ROOT}/seed${seed}/best.pt', weights_only=False, map_location='cpu') m = d['val_metrics'] print(f\" seed${seed}: per_frame_auc={m.get('per_frame_auc',0):.4f} \" + f\"clip_auc={m.get('clip_auc',0):.4f} ep={d['epoch']}\") " fi done echo "==============================================================="