| from typing import Any |
|
|
| import torch |
| import torch.nn as nn |
|
|
| from .base_postprocessor import BasePostprocessor |
|
|
|
|
| class GENPostprocessor(BasePostprocessor): |
| def __init__(self, config): |
| super().__init__(config) |
| self.args = self.config.postprocessor.postprocessor_args |
| self.gamma = self.args.gamma |
| self.M = self.args.M |
| self.args_dict = self.config.postprocessor.postprocessor_sweep |
|
|
| @torch.no_grad() |
| def postprocess(self, net: nn.Module, data: Any): |
| output = net(data) |
| score = torch.softmax(output, dim=1) |
| _, pred = torch.max(score, dim=1) |
| conf = self.generalized_entropy(score, self.gamma, self.M) |
| return pred, conf |
|
|
| def set_hyperparam(self, hyperparam: list): |
| self.gamma = hyperparam[0] |
| self.M = hyperparam[1] |
|
|
| def get_hyperparam(self): |
| return [self.gamma, self.M] |
|
|
| def generalized_entropy(self, softmax_id_val, gamma=0.1, M=100): |
| probs = softmax_id_val |
| probs_sorted = torch.sort(probs, dim=1)[0][:, -M:] |
| scores = torch.sum(probs_sorted**gamma * (1 - probs_sorted)**(gamma), |
| dim=1) |
|
|
| return -scores |
|
|