Spaces:
Sleeping
Sleeping
import os | |
import numpy as np | |
from .glove_simi import generate_glove, AD_DIRECTORY | |
class AD_Distribution(): | |
def __init__(self, simi_name, alpha, beta): | |
print('using ........ ', simi_name, ' .... knowledge') | |
path_simi_name = os.path.join(AD_DIRECTORY, 'imagenet_cos_similarity') | |
file_simi_name = path_simi_name +'_'+ simi_name + '.npy' | |
if os.path.exists(file_simi_name): | |
self.cos_similarity = np.load(file_simi_name) | |
print(simi_name+" cos_similarity loaded") | |
else: | |
self.cos_similarity = self.generate_similarity(simi_name) | |
self.alpha = alpha | |
self.beta = beta | |
def generate_similarity(self,simi_name): | |
if simi_name == 'glove': | |
similarity = generate_glove() | |
else: | |
print(simi_name + 'not implemented yet') | |
return similarity | |
def generate_distribution(self, gt_label, target): | |
distribution=[] | |
for i in range(len(target)): | |
distri = self.single_distribution_build(i, target[i], gt_label[i]) | |
distribution.append(distri) | |
distribution = np.array(distribution) | |
return distribution | |
def single_distribution_build(self,index, target_id, gt_id): | |
if target_id.shape == (): | |
target_id = np.array([target_id]) | |
simil_logits = np.zeros(self.cos_similarity[target_id[0],:].shape) | |
for i in range(len(target_id)): | |
simil_logits += self.cos_similarity[target_id[i],:] | |
simil_logits = (simil_logits)/ len(target_id) | |
logit_value = self.alpha | |
for i in range(len(target_id)): | |
simil_logits[target_id[i]] = logit_value | |
logit_value = logit_value - self.beta | |
if not self.check_oreder_target_no_groundtruth(simil_logits, target_id): | |
print('fail to generate distribution for index: ', index) | |
logits = self.softmax(simil_logits) | |
return logits | |
def check_oreder_target_no_groundtruth(self, probs, target_id): | |
sort_labels = np.argsort(probs) | |
cnt = 0 | |
for i in range(len(target_id)): | |
if target_id[-(i+1)] == sort_labels[-(len(target_id)-i)]: | |
cnt +=1 | |
if (cnt == len(target_id)): | |
return True | |
else: | |
return False | |
def softmax(self,logits): | |
prob=np.exp(logits) / np.sum(np.exp(logits)) | |
return prob | |