Spaces:
Sleeping
Sleeping
import os | |
from typing import Tuple | |
import numpy as np | |
from sklearn.metrics import (accuracy_score, f1_score, precision_score, | |
recall_score) | |
from tqdm.auto import tqdm | |
import torch | |
from newsclassifier.config.config import Cfg, logger | |
from newsclassifier.data import NewsDataset, collate | |
from newsclassifier.models import CustomModel | |
from torch.utils.data import DataLoader | |
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") | |
def test_step(test_loader: DataLoader, model) -> Tuple[np.ndarray, np.ndarray]: | |
"""Eval step.""" | |
model.eval() | |
y_trues, y_preds = [], [] | |
with torch.inference_mode(): | |
for step, (inputs, labels) in tqdm(enumerate(test_loader)): | |
inputs = collate(inputs) | |
for k, v in inputs.items(): | |
inputs[k] = v.to(device) | |
labels = labels.to(device) | |
y_pred = model(inputs) | |
y_trues.extend(labels.cpu().numpy()) | |
y_preds.extend(torch.argmax(y_pred, dim=1).cpu().numpy()) | |
return np.vstack(y_trues), np.vstack(y_preds) | |
def inference(): | |
logger.info("Loading inference data.") | |
try: | |
test_dataset = NewsDataset(os.path.join(Cfg.preprocessed_data_path, "test.csv")) | |
test_loader = DataLoader(test_dataset, batch_size=Cfg.batch_size, shuffle=False, num_workers=4, pin_memory=True, drop_last=False) | |
except Exception as e: | |
logger.error(e) | |
logger.info("loading model.") | |
try: | |
model = CustomModel(num_classes=Cfg.num_classes) | |
model.load_state_dict(torch.load(Cfg.model_path, map_location=torch.device("cpu"))) | |
model.to(device) | |
except Exception as e: | |
logger.error(e) | |
y_true, y_pred = test_step(test_loader, model) | |
print( | |
f'Precision: {precision_score(y_true, y_pred, average="weighted")} \n Recall: {recall_score(y_true, y_pred, average="weighted")} \n F1: {f1_score(y_true, y_pred, average="weighted")} \n Accuracy: {accuracy_score(y_true, y_pred)}' | |
) | |