1. CrossEntropyLoss() 中的加权损失 2. WeightedRandomSampler 和 subsampler 的组合

Posted

技术标签:

【中文标题】1. CrossEntropyLoss() 中的加权损失 2. WeightedRandomSampler 和 subsampler 的组合【英文标题】:1. Weighted Loss in CrossEntropyLoss() 2. Combination of WeightedRandomSampler and subsampler 【发布时间】:2022-01-17 19:36:54 【问题描述】:

我想为我的 3 类分类问题实现类权重。

尝试直接添加权重,这在将模型输出和标签传递给我的损失时会出错

criterion = nn.CrossEntropyLoss(weight=torch.tensor([1,2,2]))

错误:

loss = criterion(out, labels)         
expected scalar type Float but found Long

所以我打印 dtypes 并将它们更改为浮动,但它仍然给我同样的错误

labels = labels.float()
print("Labels Training", labels, labels.dtype)
print("Out Training ", out, out.dtype)
loss = criterion(out, labels) 

>>Labels Training tensor([2.]) torch.float32
>>Out Training  tensor([[ 0.0540, -0.1439, -0.0070]], grad_fn=<AddmmBackward0>) torch.float32
>>expected scalar type Float but found Long

我也试过改成float64(),但是告诉我tensor Object没有float64属性

    问题:我没有尝试过这个,但我发现更常用的方法是 RandomWeightedSampler。我的问题是我将 CV 与 K-Fold 一起使用,并为此使用了 SubSampler。可以同时使用吗?还没有找到与此相关的任何东西。

【问题讨论】:

【参考方案1】:

对于第一个问题,nn.CrossEntropyLoss 要求输出为 float 类型,标签为 long 类型,权重为 float 类型。因此,您应该将 nn.CrossEntropyLoss "weight" 的可选参数更改为 float by:

criterion = nn.CrossEntropyLoss(weight=torch.tensor([1.0,2.0,2.0]))
loss = criterion(out, labels.long())

【讨论】:

以上是关于1. CrossEntropyLoss() 中的加权损失 2. WeightedRandomSampler 和 subsampler 的组合的主要内容,如果未能解决你的问题,请参考以下文章

深入浅出PyTorch中的nn.CrossEntropyLoss

pytorch 自定义损失函数 nn.CrossEntropyLoss

pytorch中BCEWithLogitsLoss&CrossEntropyLoss函数

pytorch 错误:CrossEntropyLoss() 中不支持多目标

pytorch CrossEntropyLoss(), Softmax(), logSoftmax, NLLLoss

在 CrossEntropyLoss 和 BCELoss (PyTorch) 中使用权重