ius / scripts /infer_epu.py
pgatoula's picture
Sync from GitHub via hub-sync
99ec8a2 verified
import os
import torch
import argparse
from pathlib import Path
from datetime import datetime
# mine
from data.loading import EPUDatasetFromConfig
from data.dataloader import to_dataloader
from model.module_mapping import layer_mapping
from utils.metrics import EPUMetrics
from utils.eval_utils import EPUCNNEval
from utils.eval_utils import InferenceRunnerEPUCNN
from utils.train_utils import create_output_folders, save_to_json
from utils.omega_parser import IUSConfig
BASE_PATH = Path(__file__).resolve().parent
def parse_options():
parser = argparse.ArgumentParser()
parser.add_argument("--experiment_folder_name", type=str, required=True,
help="Folder name containing epu configuration & saved ckpt")
parser.add_argument("--data_split", type=str, default="test", choices=["train", "test", "validation"],)
args = parser.parse_args()
return args
def main():
args = parse_options()
data_split = args.data_split
group_by = None
# Load saved config
print('Loading configuration...')
saved_epu_folder = (BASE_PATH / "../results/checkpoints").resolve()
saved_epu_folder = os.path.join(saved_epu_folder, args.experiment_folder_name)
cfg_path = os.path.join(saved_epu_folder, "epu_config.yaml")
cfg = IUSConfig.from_yaml(cfg_path)
# Setup Dataset & Dataloader
print('Load data...')
dset = EPUDatasetFromConfig(dataconfig=cfg.data_params, group_by=group_by)
eval_dataset = dset.get_dataset(dataset_mode=data_split)
# update cfg.data_params.data_loading
cfg.data_params.data_loading.shuffle = False
cfg.data_params.data_loading.batch_size = 1
dataloader_eval = to_dataloader(dataset=eval_dataset, loading_cfg=cfg.data_params.data_loading)
# Setup Saving Dir
output_folder = str((BASE_PATH / "../results/classification_performance").resolve())
output_folder = os.path.join(output_folder, args.experiment_folder_name)
create_output_folders(output_folder) # skipped if exists
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
# Load model
print('Loading trained model...')
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
trained_ckpt = os.path.join(saved_epu_folder, f"ckpt_{cfg.experiment_saved_folder_name}.pt")
epu = EPUCNNEval(epu_cfg=cfg.model)
trained_epu = epu.load_ckpt(device=device, ckpt_path=trained_ckpt)
trained_epu = InferenceRunnerEPUCNN(epu_model=trained_epu,
device=device,
mode=cfg.train_params.mode)
# metrics = EPUMetrics(mode=cfg.train_params.mode,
# n_classes=cfg.model.num_classes,
# activation=layer_mapping(cfg.model.epu_activation)())
# epu_results = trained_epu.predict(dataloader=dataloader_eval,
# raw_logits=True, # not epu activation
# return_predictions=True)
epu_results = trained_epu.predict(dataloader=dataloader_eval,
raw_logits=False, # apply epu activation
return_predictions=True)
confidence_level = 0.5
metrics = EPUMetrics(mode=cfg.train_params.mode,
n_classes=cfg.model.num_classes,
confidence_level=confidence_level,
activation=layer_mapping("none")())
metric_scores = metrics.compute(y_true=epu_results["targets"], y_pred=epu_results["predictions"],)
save_info_dict = {
"epu_ckpt": trained_ckpt,
"config": cfg_path,
"data_split": data_split,
"batch_size": cfg.data_params.data_loading.batch_size,
"dataloader_samples": len(epu_results["targets"]),
"classification_performance": metric_scores,
"confidence": confidence_level,
"timestamp": timestamp,
"experiment_id": cfg.experiment_saved_folder_name,
}
json_file_path = os.path.join(output_folder, f"epu_classification_performance_{timestamp}.json")
save_to_json(save_info_dict, json_file_path)
if __name__ == "__main__":
# python -m scripts.infer_epu --experiment_folder_name ius_dataset_name_base_one_0000_timestamp
main()