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

     2023-03-12     8

关键词:

【中文标题】在 CrossEntropyLoss 和 BCELoss (PyTorch) 中使用权重【英文标题】:Using weights in CrossEntropyLoss and BCELoss (PyTorch) 【发布时间】:2021-08-16 04:44:25 【问题描述】:

我正在训练一个 PyTorch 模型来执行二进制分类。我的少数类约占数据的 10%,所以我想使用加权损失函数。 BCELossCrossEntropyLoss 的文档说我可以为每个样本使用 'weight'

但是,当我声明CE_loss = nn.BCELoss()nn.CrossEntropyLoss() 然后执行CE_Loss(output, target, weight=batch_weights),其中outputtargetbatch_weightsTensors 的batch_size,我收到以下错误留言:

forward() got an unexpected keyword argument 'weight'

【问题讨论】:

【参考方案1】:

您是否想对数据集中第 0 类和第 1 类的所有元素应用单独的固定权重?目前尚不清楚您在这里为 batch_weights 传递了什么值。如果是这样,那么这不是 BCELoss 中的权重参数所做的。 weight 参数要求您为数据集中的每个 ELEMENT 传递一个单独的权重,而不是为每个 CLASS 传递一个单独的权重。有几种方法可以解决这个问题。您可以为每个元素构建一个权重表。或者,您可以使用自定义损失函数来满足您的需求:

def BCELoss_class_weighted(weights):

    def loss(input, target):
        input = torch.clamp(input,min=1e-7,max=1-1e-7)
        bce = - weights[1] * target * torch.log(input) - (1 - target) * weights[0] * torch.log(1 - input)
        return torch.mean(bce)

  return loss

请注意,添加钳位以避免数值不稳定很重要。

HTH 杰伦

【讨论】:

【参考方案2】:

实现目标的另一种方法是在初始化损失时使用reduction=none,然后在计算平均值之前将结果张量乘以权重。 例如

loss = torch.nn.BCELoss(reduction='none')
model = torch.sigmoid

weights = torch.rand(10,1)
inputs = torch.rand(10,1)
targets = torch.rand(10,1)

intermediate_losses = loss(model(inputs), targets)
final_loss = torch.mean(weights*intermediate_losses)

当然,对于您的场景,您仍然需要计算权重张量。但希望这会有所帮助!

【讨论】:

【参考方案3】:

问题在于您提供了 weight 参数。正如文档here 中提到的,应该在模块实例化期间提供 weights 参数。

例如,类似,

from torch import nn
weights = torch.FloatTensor([2.0, 1.2]) 
loss = nn.BCELoss(weights=weights)

您可以找到更具体的示例 here 或其他有用的 PT 论坛讨论 here。

【讨论】:

BCELoss 的文档说“权重”应该是“手动重新调整权重,赋予每个批次元素的损失”。如果给定,则必须是大小为 nbatch 的张量。如果每批的权重都发生变化怎么办? 从表面上看,我认为这是不可能的。最重要的是,我认为每批动态调整权重可能会对学习产生负面影响,因为损失函数属性每批都在不断变化。【参考方案4】:

你需要像下面这样传递权重:

CE_loss = CrossEntropyLoss(weight=[…])

【讨论】:

使用 nn.CrossEntropyLoss() 训练的网络的测试和置信度得分

】使用nn.CrossEntropyLoss()训练的网络的测试和置信度得分【英文标题】:TestingandConfidencescoreofNetworktrainedwithnn.CrossEntropyLoss()【发布时间】:2020-04-2810:34:16【问题描述】:我已经训练了一个具有以下结构的网络:Intent_LSTM((attention):Att... 查看详情

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

】1.CrossEntropyLoss()中的加权损失2.WeightedRandomSampler和subsampler的组合【英文标题】:1.WeightedLossinCrossEntropyLoss()2.CombinationofWeightedRandomSamplerandsubsampler【发布时间】:2022-01-1719:36:54【问题描述】:我想为我的3类分类问题实现类权重。... 查看详情

简单谈谈crossentropyloss

写在前面分类问题和回归问题是监督学习的两大种类:分类问题的目标变量是离散的;回归问题的目标变量是连续的数值。神经网络模型的效果及优化的目标是通过损失函数来定义的。回归问题解决的是对具体数值的预... 查看详情

pytorch 自定义损失函数 nn.CrossEntropyLoss

】pytorch自定义损失函数nn.CrossEntropyLoss【英文标题】:pytorchcustomlossfunctionnn.CrossEntropyLoss【发布时间】:2021-11-1300:54:21【问题描述】:在学习了autograd之后,我尝试自己制作损失函数。这是我的损失defmyCEE(outputs,targets):exp=torch.exp(ou... 查看详情

pytorch nn.CrossEntropyLoss() 中的交叉熵损失

】pytorchnn.CrossEntropyLoss()中的交叉熵损失【英文标题】:Crossentropylossinpytorchnn.CrossEntropyLoss()【发布时间】:2018-04-1409:06:25【问题描述】:也许有人可以在这里帮助我。我正在尝试计算我的网络给定输出的交叉熵损失printoutputVariable... 查看详情

org.apache.tomcat.util.bcel.classfile.classformatexception:nullisnotajava.classfile

 org.apache.tomcat.util.bcel.classfile.ClassFormatException:nullisnotaJava.classfile 在$TOMCAT_HOME/conf/catalina.properties文件 的tomcat.util.scan.DefaultJarScanner.jarsToSkip中添加DB2驱动的Jar包 查看详情

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

】pytorch错误:CrossEntropyLoss()中不支持多目标【英文标题】:pytorcherror:multi-targetnotsupportedinCrossEntropyLoss()【发布时间】:2018-08-1818:43:33【问题描述】:我正在使用加速度数据来预测某些活动的项目。但是我在损失计算上有问题。... 查看详情

pytorch中bcewithlogitsloss&crossentropyloss函数

...tsLoss函数包括了Sigmoid层和BCELoss层.适用于多标签分类任务CrossEntropyLoss函数包含Softmax,层和NLLLoss层,适用于单标签分类问题对Sigmoid和Softmax函数不熟悉的可以看上一篇文章:https://www.jianshu.com/p/b13f4f419cce再来看两个函数的具体计算过... 查看详情

pytorch常用的交叉熵损失函数crossentropyloss()详解(代码片段)

...主要是用来判定实际的输出与期望的输出的接近程度2、CrossEntropyLoss()损失函数结合了nn.LogSoftmax()和nn.NLLLoss()两个函数。它在做分类(具体几类)训练的时候是非常有用的。3、softm 查看详情

通过使用 BCEL 解析 Java 字节码来确定 LCOM4(方法中缺乏内聚)

】通过使用BCEL解析Java字节码来确定LCOM4(方法中缺乏内聚)【英文标题】:DeterminingtheLCOM4(LackofCohesioninMethods)byparsingtheJavaBytecodeusingBCEL【发布时间】:2017-05-1807:09:06【问题描述】:我已经构建了一个程序,它接收提供的“.class”... 查看详情

Pytorch:CrossEntropyLoss 的多目标错误

】Pytorch:CrossEntropyLoss的多目标错误【英文标题】:Pytorch:multi-targeterrorwithCrossEntropyLoss【发布时间】:2020-07-1215:31:24【问题描述】:所以我正在训练一个转化率。神经网络。以下是基本细节:原始标签dim=torch.Size([64,1])网络输出dim... 查看详情

org.apache.tomcat.util.bcel.classfile.ClassFormatException:常量池中的无效字节标记:15

】org.apache.tomcat.util.bcel.classfile.ClassFormatException:常量池中的无效字节标记:15【英文标题】:org.apache.tomcat.util.bcel.classfile.ClassFormatException:Invalidbytetaginconstantpool:15【发布时间】:2014-06-2519:57:01【问题描述】:我正在将一个webapp从... 查看详情

pytorch常用函数参数详解

...的维度为[2,4],则torch.cat((a,b),dim=1)的维度为[2,7]2、torch.nn.CrossEntropyLoss()函数作用:CrossEntropy是交叉熵的意思,故而CrossEntropyLoss的作用是计算交叉熵。CrossEntropyLoss函数是将torch.nn.Softmax和torch.nn.NLLLoss两个函数组合在一起使用,故... 查看详情

fastjson-bcel不出网打法原理分析(代码片段)

FastJson反序列化漏洞与原生的Java反序列化的区别在于,FastJson反序列化并未使用readObject方法,而是由FastJson自定一套反序列化的过程。通过在反序列化的过程中自动调用类属性的setter方法和getter方法,将JSON字符串还原... 查看详情

深入浅出pytorch中的nn.crossentropyloss(代码片段)

...基础三、主要参数3.1输入与输出四、从零开始实现`nn.CrossEntropyLoss`一、前言nn.CrossEntropyLoss常用作多分类问题的损失函数(对交叉熵还不了解的读者可以看我的这篇文章),本文将围绕PyTorch的官方文档对重要知... 查看详情

用于pytorch中图像分割的通道方式CrossEntropyLoss

】用于pytorch中图像分割的通道方式CrossEntropyLoss【英文标题】:ChannelwiseCrossEntropyLossforimagesegmentationinpytorch【发布时间】:2018-11-2612:41:49【问题描述】:我正在做一个图像分割任务。总共有7个类,所以最终输出是一个张量,如[bat... 查看详情

softmax与crossentropyloss(),log_softmax与nllloss()(代码片段)

我们在处理单标签多分类问题时,若考虑用softmax来对模型最后输出作计算以得到各标签的概率分布,那之后可以通过crossentropy做一个似然估计,求得误差但softmax求出来的概率分布中,每个标签的概率p∈(0,1),... 查看详情

softmax与crossentropyloss(),log_softmax与nllloss()(代码片段)

我们在处理单标签多分类问题时,若考虑用softmax来对模型最后输出作计算以得到各标签的概率分布,那之后可以通过crossentropy做一个似然估计,求得误差但softmax求出来的概率分布中,每个标签的概率p∈(0,1),... 查看详情