Beispiel #1
0
    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
Beispiel #2
0
    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
Beispiel #3
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
Beispiel #4
0
 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
Beispiel #5
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)
Beispiel #7
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.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