def forward(self, cosine: torch.Tensor, label, x): # a_i a_i = torch.norm(x, dim=1, keepdim=True).clamp(self.l_a, self.u_a) # m(a_i) m = self.margin(a_i).mean().item() index = torch.where(label != -1)[0] # make varaible margin m_hot = torch.zeros(index.size()[0], cosine.size()[1], device=cosine.device) m_hot.scatter_(1, label[index, None], m) # make fixed margin m_hot2 = torch.zeros(index.size()[0], cosine.size()[1], device=cosine.device) m_hot2.scatter_(1, label[index, None], self.m) # add to variable margin in angular space cosine.acos_() cosine[index] += m_hot cosine.cos_() # add to fixed margin in cosine space cosine[index] -= m_hot2 cosine = cosine * self.s g = self.calc_loss_G(a_i) * self.lambda_g return cosine, g
def forward(self, cosine: torch.Tensor, label, x): index = torch.where(label != -1)[0] # label에서 GT 위치 # SphereFace m1_hot = torch.ones(index.size()[0], cosine.size()[1], device=cosine.device) m1_hot.scatter_(1, label[index, None], self.m1) # ArcFace m2_hot = torch.zeros(index.size()[0], cosine.size()[1], device=cosine.device) m2_hot.scatter_(1, label[index, None], self.m2) # CosFace m3_hot = torch.zeros(index.size()[0], cosine.size()[1], device=cosine.device) m3_hot.scatter_(1, label[index, None], self.m3) cosine.acos_() cosine[index] *= m1_hot cosine[index] += m2_hot cosine.cos_() cosine[index] -= m3_hot ret = cosine * self.s return ret, 0
def forward(self, cosine: torch.Tensor, label): index = torch.where(label != -1)[0] m_hot = torch.zeros(index.size()[0], cosine.size()[1], device=cosine.device) m_hot.scatter_(1, label[index, None], self.m) cosine.acos_() cosine[index] += m_hot cosine.cos_().mul_(self.s) return cosine
def forward(self, cosine: torch.Tensor, label, x): #print(cosine) index = torch.where(label != -1)[0] # label에서 GT 위치 m_hot = torch.ones(index.size()[0], cosine.size()[1], device=cosine.device) m_hot.scatter_(1, label[index, None], self.m) #print(index.size()[0], cosine.size(), cosine.size()[1], label.size(), m_hot.size()) cosine.acos_() cosine[index] *= m_hot cosine.cos_().mul_(self.s) #print(cosine) return cosine, 0
def forward(self, cosine: torch.Tensor, label, x): a_i = torch.norm(x, dim=1, keepdim=True).clamp(self.l_a, self.u_a) m = self.margin(a_i).mean().item() index = torch.where(label != -1)[0] m_hot = torch.zeros(index.size()[0], cosine.size()[1], device=cosine.device) m_hot.scatter_(1, label[index, None], m) cosine.acos_() cosine[index] += m_hot cosine.cos_().mul_(self.s) g = self.calc_loss_G(a_i) * self.lambda_g return cosine, g.item()
def forward(self, input: torch.Tensor, target: torch.Tensor) -> torch.Tensor: """ :param input: Arccos of cosine similarity between weight matrix and features output. :param target: correct labels of each angle data :return: CrossEntropyLoss of added margin cosine similarity (rescaled) """ # input.cpu() # target.cpu() index = torch.where(target != -1)[0] m_hot = torch.zeros(index.size()[0], input.size()[1], device=input.device) m_hot.scatter_(1, target[index, None], self.margin) input.acos_() input[index] += m_hot input.cos_().mul_(self.scale_factor) return super(ArcFace, self).forward(input, target)
def forward(self, cosine: torch.Tensor, label): index = torch.where(label != -1)[0] m_hot = torch.zeros(index.size()[0], cosine.size()[1], device=cosine.device) m_hot.scatter_(1, label[index, None], self.m) cosine.clamp_(min=-1.0 + 1e-7, max=1.0 - 1e-7) cosine.acos_() # cosine_np = cosine.data.cpu().numpy() # cosine_np = np.arccos(cosine_np) # cosine.data = torch.from_numpy(cosine_np).to(device=cosine.device) cosine[index] += m_hot cosine.cos_().mul_(self.s) if torch.isnan(cosine).sum() > 0: index = torch.where(torch.isnan(cosine)) print(3, index) print(3, cosine[index]) assert False, torch.isnan(cosine).sum() return cosine