Ejemplo n.º 1
0
def lmmd(source,
         target,
         s_label,
         t_label,
         kernel_mul=2.0,
         kernel_num=5,
         fix_sigma=None,
         num_classes=10):
    batch_size = source.size()[0]
    weight_ss, weight_tt, weight_st = Weight.cal_weight(s_label,
                                                        t_label,
                                                        type='visual',
                                                        class_nums=num_classes)
    weight_ss = torch.from_numpy(weight_ss).cuda()
    weight_tt = torch.from_numpy(weight_tt).cuda()
    weight_st = torch.from_numpy(weight_st).cuda()

    kernels = guassian_kernel(source,
                              target,
                              kernel_mul=kernel_mul,
                              kernel_num=kernel_num,
                              fix_sigma=fix_sigma)
    loss = torch.Tensor([0]).cuda()
    #print(kernels)
    if torch.sum(torch.isnan(sum(kernels))):
        return loss
    SS = kernels[:batch_size, :batch_size]
    TT = kernels[batch_size:, batch_size:]
    ST = kernels[:batch_size, batch_size:]

    loss += torch.sum(weight_ss * SS + weight_tt * TT - 2 * weight_st * ST)
    return loss
Ejemplo n.º 2
0
    def conditional(self,
                    source,
                    target,
                    s_label,
                    t_label,
                    kernel_mul=2.0,
                    kernel_num=5,
                    fix_sigma=None):
        batch_size = source.size()[0]
        weight_ss, weight_tt, weight_st = Weight.cal_weight(s_label,
                                                            t_label,
                                                            type='visual')
        weight_ss = torch.from_numpy(weight_ss).cuda()
        weight_tt = torch.from_numpy(weight_tt).cuda()
        weight_st = torch.from_numpy(weight_st).cuda()

        kernels = self.guassian_kernel(source,
                                       target,
                                       kernel_mul=kernel_mul,
                                       kernel_num=kernel_num,
                                       fix_sigma=fix_sigma)
        loss = torch.Tensor([0]).cuda()
        if torch.sum(torch.isnan(sum(kernels))):
            return loss
        SS = kernels[:batch_size, :batch_size]
        TT = kernels[batch_size:, batch_size:]
        ST = kernels[:batch_size, batch_size:]

        loss += torch.sum(weight_ss * SS + weight_tt * TT - 2 * weight_st * ST)
        return loss