final_test / models /mlp /eval_accuracy.py
Abdelrahman Almatrooshi
Deploy snapshot from main b7a59b11809483dfc959f196f1930240f2662c49
22a6915
"""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,
)
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()