【发布时间】:2022-06-10 20:50:32
【问题描述】:
我正在做一个研究项目,我想根据目标创建自定义损失函数。 IE。我想用BCEWithLogitsLoss 加上一个超参数lambda 来惩罚。如果模型没有正确检测到一个类,我只想添加这个超参数。
更详细地说,我有一个预训练模型,我想重新训练冻结一些层。该模型以一定的概率检测图像中的人脸。如果某些图像被错误地用因子 lambda 分类,我想对它们进行惩罚(假设需要惩罚的图像名称中有特殊字符左右)
来自pytorch的源码:
import torch.nn.modules.loss as l
class CustomBCEWithLogitsLoss(l._Loss):
def __init__(self, weight: Optional[Tensor] = None, size_average=None, reduce=None, reduction: str = 'mean',
pos_weight: Optional[Tensor] = None) -> None:
super(BCEWithLogitsLoss, self).__init__(size_average, reduce, reduction)
self.register_buffer('weight', weight)
self.register_buffer('pos_weight', pos_weight)
self.weight: Optional[Tensor]
self.pos_weight: Optional[Tensor]
def forward(self, input: Tensor, target: Tensor) -> Tensor:
return F.binary_cross_entropy_with_logits(input, target,
self.weight,
pos_weight=self.pos_weight,
reduction=self.reduction)
这里,forward 有两个张量作为输入,所以我不知道如何在这里添加我想用 lambda 惩罚的图像的类。在构造函数中添加lambda是可以的,但是如果只允许张量,如何进行前向传递?
编辑:
为了澄清这个问题,假设我有一个包含图像的培训/测试文件夹。文件名中带有 @ 字符的文件是我想要正确分类的文件,而不是没有字符的文件,因子为 lambda。
我如何以training a model in pytorch 的常规方式判断这些文件必须使用lambda 惩罚(假设损失函数是 lambda * BCEWithLogitLoss),但其他文件不是?我正在使用DataLoader。
【问题讨论】:
-
“使用因子 lambda 分类错误”是什么意思?
-
@Ivan 给定一个我想正确分类的图像 X_i,如果图像 X_i 属于特殊输入的某个子集(如果它们没有正确预测,我想额外惩罚的那些)应用一个因素lambda(正整数)到
binary_cross_entropy_with_logits。否则只申请binary_cross_entropy_with_logitsloss。特殊输入应以某种形式标记,可能在文件名中带有特殊字符。这也是另一个我不知道如何解决的问题。