IntegrationTest / models /mlp /eval_accuracy.py
Yingtao-Zheng's picture
Upload partially updated files
8bbb872
Raw
History Blame Contribute Delete
1.77 kB
"""Load saved MLP checkpoint and print test accuracy, F1, AUC."""
import os
import sys
import numpy as np
import torch
from sklearn.metrics import f1_score, roc_auc_score
REPO_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
if REPO_ROOT not in sys.path:
sys.path.insert(0, REPO_ROOT)
from data_preparation.prepare_dataset import get_dataloaders
from models.mlp.train import BaseModel
CKPT_PATH = os.path.join(REPO_ROOT, "checkpoints", "mlp_best.pt")
def main():
if not os.path.isfile(CKPT_PATH):
print(f"No checkpoint at {CKPT_PATH}. Train first: python -m models.mlp.train")
return
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
train_loader, val_loader, test_loader, num_features, num_classes, _ = get_dataloaders(
model_name="face_orientation",
batch_size=32,
split_ratios=(0.7, 0.15, 0.15),
seed=42,
)
model = BaseModel(num_features, num_classes).to(device)
model.load_state_dict(torch.load(CKPT_PATH, map_location=device, weights_only=True))
model.eval()
criterion = torch.nn.CrossEntropyLoss()
test_loss, test_acc, test_probs, test_preds, test_labels = model.test_step(
test_loader, criterion, device
)
f1 = float(f1_score(test_labels, test_preds, average="weighted"))
if num_classes > 2:
auc = float(roc_auc_score(test_labels, test_probs, multi_class="ovr", average="weighted"))
else:
auc = float(roc_auc_score(test_labels, test_probs[:, 1]))
print("MLP (face_orientation) — test set")
print(" Accuracy: {:.2%}".format(test_acc))
print(" F1: {:.4f}".format(f1))
print(" ROC-AUC: {:.4f}".format(auc))
if __name__ == "__main__":
main()