Torch 的几个损失函数

初步了解一下,pytorch里面的损失函数及使用方法。如有不对的地方,欢迎指出。谢谢!

1.  L1Loss

Input:    X、Y可以是任意形状的输入,X与Y的 shape相同。

Output: 标量

用途:计算X与Y的差的绝对值, 1/n * (|Xi -Yi|)

2. MSELoss

Input:  x, y 任意具有相同shape的tensor。

Output: 计算均方差

3. CrossEntropyLoss

Input: X--> (N, C), N是样本个数, C是类别个数; Y --> (N),Y表示target, Y的元素在 [0, C-1)中,即类别的索引

Output: 标量,适用于多分类模型

4.NLLLoss

用于多分类模型

input:  X --> (batch_size, num_classes), Y --> (batch_size)1D list (属于某一类的index)

output: (batch_size)

当 输入类似图片这种格式时,即 X --> (batch_size, num_classes, d1, d2, ..., dk)

Y --> (batch_size, d1, d2, ..., dk)

输出为 (batch_size, d1, d2, ..., dk)。计算的是每一个像素的损失。

使用方法如下: loss = torch.nn.NLLLoss(); output = loss(X, Y)

5. PoissonNLLLoss

适合多目标分类

input :  X --> (batch_size, num_classes), Y --> (batch_size, num_classes)

6. KLDivLoss

适用于连续分布的距离计算

input: X -->(N, *), Y -->(N, *)

7. BCELoss

适用于多目标分类

Input: X --> (N, *), Y --> (N, *), X 需要经过sigmoid, Y元素的值只能是0或1的float值

8. BCEWithLogitsLoss

同上,X不需要经过sigmoide

9. MarginRankingLoss

适用于计算两个1D的tensor和一个1D标签的损失,如果label为1则x1应该比x2大,若为-1则相反

输入,X1 -->(batch_size), X2 --> (batch_size), Y -->(batch_size),值为1或-1

10. HingeEmbeddingLoss

适用于学习非线性embedding、半监督学习。用于计算两个输入是否相似

input: X-->(N, *), Y --> (N, *) Y中的元素只能为1或-1

output: 依据size_average值得来


11. MultiLabelMarginLoss

适用于多目标分类

input : x --> (N, c), y --> (N, c)其中y是 LongTensor, 且其元素为类别的index


12. torch.nn.SmoothL1Loss

损失函数


Input: x --> (N, *),  y --> (N, *)

13. SoftMarginLoss

适用于二分类logistic损失

input : x --> (n, c), y --> (n, c)其中y的元素为1或-1

14. MultiLabelSoftMarginLoss

与MultiLableMarginLoss相同,区别在于y的类型是FloatTensor.

参考文档里面给出,y的元素应该是0或1,但是尝试过Index,没有报错. 


15. CosineEmbeddingLoss

与HingeEmbeddingLoss类似。计算映射空间下表示的距离。


输入包括三个值,如上图所示。

16. MultiMarginLoss

适用于多分类模型。

输入: X -->(batch_size, num_classes), Y --> (batch_size)

17. TripletMarginLoss

三胞胎网络的损失函数。



参考资料:

http://pytorch.org/docs/master/nn.html#tripletmarginloss




### 多损失函数在图像分割中的方法与实现 在图像分割任务中,使用多种损失函数能够更好地优化模型性能。这是因为不同的损失函数关注的目标不同,例如 BCE 损失函数专注于像素级别的分类精度[^1],而 DICE 损失则更注重区域重叠程度的评估[^4]。 #### 1. 组合多损失函数的方式 组合多个损失函数可以通过加权求和的方式来完成。假设我们选择了两种损失函数 \( L_1 \) 和 \( L_2 \),那么最终的总损失可以表示为: \[ L_{total} = w_1 \cdot L_1 + w_2 \cdot L_2 \] 其中 \( w_1 \) 和 \( w_2 \) 是权重参数,用于平衡每种损失的重要性[^3]。这些权重可以根据实验结果手动调整或者通过动态机制自适应调节。 #### 2. 实现代码示例 以下是基于 PyTorch 的一个多损失函数实现案例,结合了 BCE 损失和 Dice 损失: ```python import torch import torch.nn as nn import torch.nn.functional as F class MultiLoss(nn.Module): def __init__(self, bce_weight=0.5): super(MultiLoss, self).__init__() self.bce_weight = bce_weight def forward(self, input, target): # 计算BCE损失 bce_loss = F.binary_cross_entropy_with_logits(input, target) # 将输入转换到概率空间 smooth = 1e-6 input_prob = torch.sigmoid(input) intersection = (input_prob * target).sum() dice_coefficient = (2. * intersection + smooth) / \ (input_prob.sum() + target.sum() + smooth) dice_loss = 1 - dice_coefficient # 总损失 total_loss = self.bce_weight * bce_loss + (1 - self.bce_weight) * dice_loss return total_loss # 使用实例 model_output = torch.randn(10, 1, requires_grad=True) # 预测值 ground_truth = torch.randint(0, 2, size=(10, 1)).float() # 真实标签 criterion = MultiLoss(bce_weight=0.7) loss_value = criterion(model_output, ground_truth) print(f'Total Loss: {loss_value.item()}') ``` 上述代码定义了一个 `MultiLoss` 类,它将 BCE 损失和 Dice 损失结合起来,并允许用户指定两者的相对重要性(由 `bce_weight` 控制)。这种设计使得开发者可以在训练过程中灵活地调整损失之间的比重[^2]。 #### 3. 权重的选择策略 对于权重的选择,通常有两种常见做法: - **固定权重**:预先设定好各部分损失的比例关系,适用于已知某种损失更重要的情形。 - **动态调整**:随着训练过程的变化自动更新权重,比如利用梯度大小或其他启发式规则决定当前阶段哪种损失更为关键。 #### 4. 注意事项 当引入多个损失项时需要注意以下几点: - 不同类型的损失可能具有完全不同的数值范围,因此建议先对其进行标准化或归一化处理后再参与加权运算; - 如果某些特定条件下某一类错误特别难以纠正,则可考虑加入额外惩罚因子进一步增强该方向上的约束力。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值