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() 中不支持多目标