import tqdm from src.process.metrics import * import torch @torch.no_grad() def validate_one_epoch(model, loader, criterion, device, num_classes) -> dict[str, float]: model.eval() losses = [] accuracies = [] precisions = [] recalls = [] f1s = [] f1s_weighted = [] for images, labels in tqdm.tqdm(loader, leave=False): images = images.to(device, non_blocking=True).float() labels = labels.to(device, non_blocking=True).long() logits = model(images) loss = criterion(logits, labels) m = metrics(logits, labels, num_classes) losses.append(loss.detach()) accuracies.append(m["accuracy"]) precisions.append(m["precision"]) recalls.append(m["recall"]) f1s.append(m["f1"]) f1s_weighted.append(m["f1_w"]) losses = torch.stack(losses) accuracies = torch.stack(accuracies) precisions = torch.stack(precisions) recalls = torch.stack(recalls) f1s = torch.stack(f1s) f1s_weighted = torch.stack(f1s_weighted) return { "loss": losses.mean().item(), "accuracy": accuracies.mean().item(), "precision": precisions.mean().item(), "recall": recalls.mean().item(), "f1": f1s.mean().item(), "f1_w": f1s_weighted.mean().item() }