长尾问题之LDAM

做法&代码&公式

step1: 全连接层的权重W和特征向量X都归一化,相乘 W * X = P (得到各个类别的概率)
# 定义权重,初始化
weight = nn.Parameter(torch.FloatTensor(num_classes, num_features))
weight.data.uniform_(-1, 1).renorm_(2, 1, 1e-5).mul_(1e5)

# 归一化W,X ; W * X =  P
Z = F.linear(F.normalize(x), F.normalize(self.weight))

step2: 损失参数计算及设置

计算 margin

其中nj是对应类别j的数量,C是一个超参常数。代码里C是最多样本类别的0.5倍

\gamma_j =\frac{C}{n_j^{\frac{1}{4}}}

以此类推,类别1,类别2 的分别margin

\gamma_1 =\frac{C}{n_1^{\frac{1}{4}}},\gamma_2 =\frac{C}{n_2^{\frac{1}{4}}}

代码部分

s = 30 # 设置缩放系数 s=30 
num_class_list=[13000,450,4231,8000 ... ]  # 各个类别样本数量

max_m = 0.5  
m_list = 1.0 / np.sqrt(np.sqrt(num_class_list))
m_list = m_list * (max_m / np.max(m_list)) # ignore是0影响计算

re-weight

epoch∈(0~160)时为

betas = [0, 0.9999]
re_weights = (1.0 - betas[0]) / (1.0 - np.power(betas[0], num_class_list))
re_weights = re_weights / np.sum(per_cls_weights) * num_class)

epoch∈(160~maxepoch)时为:

betas = [0, 0.9999]
re_weights = (1.0 - betas[1]) / (1.0 - np.power(betas[1], num_class_list))
re_weights = re_weights / np.sum(re_weights) * num_class)

step4:计算损失

# index: 哪些位置是y_true
x_m = Z - m_list
outputs = torch.where(index, x_m, Z)
F.cross_entropy(s * outputs, targets, weight=re_weight)

参考:https://github.com/zhangyongshun/BagofTricks-LT/blob/main/documents/trick_gallery.md

MMPretrain实现 不要积分的,免费的

https://download.csdn.net/download/magic_shuang/88632302

mmpretrain/models/heads/ldam_head.py

mmpretrain/models/losses/ldam_loss.py

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值