带权重的交叉熵-CrossEntropyLoss,class_weight

7 篇文章 0 订阅
7 篇文章 0 订阅

背景:例如2分类中,类别极度不均衡,ok样本10万张,ng样本3张,就算模型把所有的样本都预测成ok样本,也能达到99.997%的状态,但是可能实际情况是宁可过杀也不放过。对ng样本添加惩罚项可以缓解这个问题:如果标签为ng,预测成了ng,把这个损失拉满。

  • Demo:用mmcls框架,求带权重的交叉熵。
import mmcls.models
import torch
#输入和标签
inputs = torch.FloatTensor([0,1,0,0,0,1])
outputs = torch.LongTensor([0,1])
inputs = inputs.view((1,3,2))
outputs = outputs.view((1,2))
# 定义两种交叉熵,前面为正常交叉熵,后面为带权重的交叉熵
CE = mmcls.models.losses.CrossEntropyLoss()
CE2 = mmcls.models.losses.CrossEntropyLoss(class_weight=[1,10,100])
loss1 = CE(inputs,outputs)     #tensor(1.4803)
loss2 = CE2(inputs,outputs)    #tensor(9.8593)

Demo2:手动求交叉熵和带权重的交叉熵

# step1:先求softmax,axis=1
inputs2 = inputs.softmax(inputs,1)
print(inputs2)
'''
    tensor([[[0.3333, 0.4223],
             [0.3333, 0.1554],
             [0.3333, 0.4223]]])
'''
# step2:再求log
inputs3 = inputs2.log()
print(inputs3)
'''
    tensor([[[-1.0986, -0.8620],
             [-1.0986, -1.8620],
             [-1.0986, -0.8620]]])
'''
# 上述过程等价于:
inputs3 = inputs.log_softmax(1)
# step3:再根据标签,求损失。
'''
inputs3的shape为(1,3,2),1是批次大小,3是总共包含的类别,2是最终需要计算的交叉熵的向量长度。
除去批次后,inputs3的shape为(3,2)。标签为0,1。表示从第0列需要找第0个元素,
表示从第1列需要找第1个元素.这样组合成交叉熵的向量。最终取到-1.0986和-1.8620
最后取反相加就是最终交叉熵;加上权重就是带权重的交叉熵
'''
1:loss1 = (1.0986+1.862)/2=1.4803
2:loss2 = (1.0986*1+1.862*10)/2=9.8593



可以看出:同样的网络输出,带权重的损失是9.85,不带权重的是1.48。

如果只用交叉熵,损失比较小,如果加上带权重的交叉熵,那么可以把想要关注的类别加入更大权重。

反向推导:如果想要loss2减小,则input3中[-0.8620,-1.8620,-0.8620],需要越逼近[a,-0.0000,b],则inputs2需要越逼近[0,1.,0],inputs1需要越逼近[小,大,小]。

inputs[0][1][1] = 1000000
'''
tensor([[[0., 0],
         [0., 1000000],
         [0., 1.]]])
'''
CE2(inputs,outputs)#tensor(0.5493)

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段话是一个配置文件,用于指定训练神经网络模型的超参数和数据集参数。具体解释如下: - setup: selflabel:表示使用自标签技术进行训练。 - confidence_threshold: 0.99:表示置信度阈值为0.99。 - use_ema: True,ema_alpha: 0.999:表示使用指数移动平均(EMA)方法进行训练,并设置EMA的衰减系数为0.999。 - criterion: confidence-cross-entropy,criterion_kwargs: apply_class_balancing: False:表示使用置信度交叉熵损失函数进行训练,并关闭类别平衡。 - backbone: resnet50,num_heads: 1:表示使用ResNet-50作为模型骨架,并设置模型头数为1。 - train_db_name: imagenet_50,val_db_name: imagenet_50,num_classes: 50:表示使用ImageNet-50数据集进行训练和验证,并共有50个类别。 - augmentation_strategy: ours,augmentation_kwargs: crop_size: 224,normalize: mean: [0.485, 0.456, 0.406] std: [0.229, 0.224, 0.225],num_strong_augs: 4,cutout_kwargs: n_holes: 1 length: 75 random: True:表示使用作者自己的数据增强策略进行训练,并设置裁剪尺寸为224、归一化参数为给定值、强增强次数为4、cutout参数为1个洞、洞的大小为75,并随机选择位置。 - transformation_kwargs: crop_size: 224,normalize: mean: [0.485, 0.456, 0.406] std: [0.229, 0.224, 0.225]:表示在验证时使用裁剪尺寸为224、归一化参数为给定值的数据增强策略。 - optimizer: sgd,optimizer_kwargs: lr: 0.03,weight_decay: 0.0,nesterov: False,momentum: 0.9:表示使用随机梯度下降(SGD)优化器进行训练,并设置学习率为0.03、权重衰减为0.0、是否使用Nesterov动量为False、动量系数为0.9。 - epochs: 25,batch_size: 512,num_workers: 16:表示总共训练25个epochs,每个batch的大小为512,使用16个worker进行数据加载。最后,scheduler: constant表示使用恒定的学习率调度程序,即不会随着训练过程中的epoch数量而改变。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值