File size: 2,486 Bytes
71f183c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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