def eval_perplexity(self): """ Knowledge evaluation on dataset, perplexity :param dataset: :return: """ print("Knowledge evaluating ...") dataset = self.dataset self.forward_init(1) perpls = [] knw_size = len(self.knw_list) hidden = torch.zeros(1, 1, knw_size) datab = [] for data in dataset: datavec = np.zeros(self.lsize) datavec[data] = 1 datab.append(datavec) datab = np.array(datab) databpt = torch.from_numpy(datab) databpt = databpt.type(torch.FloatTensor) for nn in range(len(databpt) - 1): x = databpt[nn] y = databpt[nn + 1] prd, hidden = self.forward(x.view(1, 1, self.lsize), hidden, plogits=self.plogits) prd = torch.exp(prd) / torch.sum(np.exp(prd)) perp = cal_kldiv(y, prd.view(-1)) perpls.append(perp) avperp = np.mean(np.array(perpls)) print("Calculated knowledge perplexity:", np.exp(avperp)) return np.exp(avperp)
def cal_knwU(self): tmp = self.prior.copy() tmp[self.data[-1]] = 0 KnwU = cal_kldiv( tmp, self.prior) * (self.prior[self.data[0]] / np.sum(self.prior)) return KnwU