final / models /mlp /eval_accuracy.py
Yingtao-Zheng's picture
Put all the models together (expect UI)
4a5bfab
"""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()