当前位置:   article > 正文

torch 对样本进行加权_torch cross_entropy 添加权重

torch cross_entropy 添加权重

在分类问题中,当遇到样本不均衡时,可以对各类别设置不同的权重,如下:

batch_size = 10
nb_classes = 2

model = nn.Linear(10, nb_classes)
weight = torch.empty(nb_classes).uniform_(0, 1)

# 初始化CrossEntropy函数时传入各个class的权重
criterion = nn.CrossEntropyLoss(weight=weight)
ce = nn.CrossEntropyLoss(ignore_index=255, weight=weight_CE)
loss = ce(inputs,outputs)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

但有时候,我们不仅每个类别有权重,而且每个样本的权重也不相同。这时候需要更精细的控制了,可通过两步来达到此目的:

  1. 在初始化函数时设置 reduction=‘none’, 此时loss函数返回的是一个array,表示各个sample的loss;reduction默认设置为mean,表示loss函数会默认对所有样本的loss取平均,返回一个标量;
  2. 手动加权,得到各个样本的loss array后,我们可以对每个loss赋予(乘以)相应的权重,这时即达到了对不同样本赋予不同权重的目的。
batch_size = 10
nb_classes = 2

model = nn.Linear(10, nb_classes)
weight = torch.empty(nb_classes).uniform_(0, 1)
# 初始化CrossEntropy函数时传入各个class的权重, 
# 且设置reduction为None表示不进行聚合,返回一个loss数组
criterion = nn.CrossEntropyLoss(weight=weight, reduction='none')

# This would be returned from your DataLoader
x = torch.randn(batch_size, 10)
target = torch.empty(batch_size, dtype=torch.long).random_(nb_classes)
sample_weight = torch.empty(batch_size).uniform_(0, 1)

output = model(x)
loss = criterion(output, target)
# 各个样本乘以其权重,然后求均值
loss = loss * sample_weight
loss.mean().backward()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

此外,还可以对每个样本的loss进行归一化,使得所有batch的loss大小范围较为相近:

loss =(loss * sample_weight / sample_weight.sum()).sum()
  • 1

此步非必须,因为我们给定各个样本不同权重其实就是要使得各个样本的loss有区别的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/133444
推荐阅读
相关标签
  

闽ICP备14008679号