【Deep learning】——一文知torch分类任务的交叉熵Loss(多分类、多标签任务)

【Deep learning】——一文知torch分类任务的交叉熵Loss(多分类、多标签任务)

之前对torch的分类Loss还有好些疑惑,这次一网打进不留漏洞。文章包含多分类任务loss和多标签任务loss【softmax/NLLloss/CrossEntropyLoss/sigmoid/BCEloss/BCEWithLogitsLoss】
参考博客:
Pytorch入门笔记(多分类问题)
Pytorch踩坑记之交叉熵(nn.CrossEntropy,nn.NLLLoss,nn.BCELoss的区别和使用)
pytorch 多标签分类以及BCEloss

多分类任务

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面三个图胜千言,总结如下:
在这里插入图片描述
自己尝试用代码做一遍(三个loss算出来相等,推荐直接CrossEntropyLoss):

import torch
import torch.nn as nn
import torch.nn.functional as F

y = torch.Tensor([[1, 0, 0], [0, 1, 0]]) # one-hot vector
z = torch.Tensor([[0.2, 0.1, -0.1], [0.3, 0.5, -0.2]]) # logits

# 最原始的公式计算法
# y_pred = torch.exp(z) / torch.exp(z).sum(1, keepdim=True) # softmax,注意按行求和,而不是整个求和
y_pred = F.softmax(z, dim=1)
loss = (- y * torch.log(y_pred)).sum()
print('directly compute', loss)

# Nll_loss 公式
# y_pred = torch.exp(z) / torch.exp(z).sum(1, keepdim=True)
# y_pred_log = torch.log(y_pred)
y_pred_log = F.log_softmax(z, dim=1)
criterion = nn.NLLLoss(reduction='sum') # 默认为mean,总Loss/样本数
                                        # 若为none,则返回向量每个样本对应的loss
                                        # 若为sum,则返回总loss
loss = criterion(y_pred_log, torch.LongTensor([0, 1])) # 直接使用标签(需要是LongTensor类型),不用one-hot向量
print('NLL loss', loss)

# cross_entroy 公式
criterion = nn.CrossEntropyLoss(reduction='sum')
loss = criterion(z, torch.LongTensor([0, 1]))
print('cross entroy loss', loss)

多标签任务

首先要弄清楚什么是多标签分类:比如判断一幅图是否有猫或者狗,如果都有标签则为[1, 1];
——【可以看做多个二分类】,而对于二分类任务,通常采用BCEloss即Binary CrossEntropy loss。对于一个样本来说,它的各个label的分数加起来不一定等于1,不同的是,此时激活函数通常使用Sigmoid而不是Softmax
在这里插入图片描述
对二分类问题,其Loss也叫交叉熵,但公式表示形式不同,与多分类的softmax后-y*logy^相比,给人的感觉就像考虑了yn=0的样本的损失。
而对于二分类任务和多标签任务,pytorch有BCEloss和BCEWithLogitsLoss供使用选择,与前面介绍的NLLloss和CrossEntropy的关系类似,BCEloss前需要做Sigmoid激活,BCEWithLogitsLoss自带了Sigmoid,直接用logits作输入即可。
下图也是一图胜前言
在这里插入图片描述
自己尝试用代码做一遍(三个loss算出来相等,推荐直接BCEWithLogitsLoss):

# 最原始计算
y = torch.Tensor([[1, 1, 0], [1, 0, 1]]) # 多标签one-hot
y_sigmoid = 1 / (1 + torch.exp(-z))
r11 = 1 * math.log(y_sigmoid[0, 0]) + 0 * math.log(1 - y_sigmoid[0, 0])
r12 = 1 * math.log(y_sigmoid[0, 1]) + 0 * math.log(1 - y_sigmoid[0, 1])
r13 = 0 * math.log(y_sigmoid[0, 2]) + 1 * math.log(1 - y_sigmoid[0, 2])

r21 = 1 * math.log(y_sigmoid[1, 0]) + 0 * math.log(1 - y_sigmoid[1, 0])
r22 = 0 * math.log(y_sigmoid[1, 1]) + 1 * math.log(1 - y_sigmoid[1, 1])
r23 = 1 * math.log(y_sigmoid[1, 2]) + 0 * math.log(1 - y_sigmoid[1, 2])

r1 = - (r11 + r12 + r13) / 3
r2 = - (r21 + r22 + r23) / 3
loss = (r1 + r2) / 2
print('directly compute', loss)


# BCE 公式
y = torch.Tensor([[1, 1, 0], [1, 0, 1]]) # 多标签one-hot
y_sigmoid = torch.sigmoid(z)
criterion = nn.BCELoss(reduction='mean')
loss = criterion(y_sigmoid, y)
print('BCE loss', loss)

# BCEwithLogits 公式
criterion = nn.BCEWithLogitsLoss(reduction='mean')
loss = criterion(z, y)
print('BCEwithLogits loss', loss)
### 物理信息神经网络文献综述 物理信息神经网络(Physics-Informed Neural Networks, PINNs)是一种将物理定律嵌入到机器学习模型中的新兴技术。这类网络能够利用已的物理规律来指导训练过程,从而提高预测精度并减少所需的数据量。 #### 文献推荐 对于希望深入了解PINN的研究者来说,可以参考以下几篇重要文献: - **Subhayan De等人**的工作探讨了双保真度数据在不确定性传播中的迁移学习问题[^2]。虽然这篇论文主要聚焦于不确定性的处理方式及其应用背景,但对于理解如何结合先验识与实际观测有着重要的启示意义。 - 另外一篇值得关注的文章是由Raissi M., Perdikaris P., Karniadakis G.E.(2019)发表在Journal of Computational Physics上的《Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations》。这篇文章首次系统地阐述了PINN的概念,并展示了它们解决偏微分方程正向和反向问题的强大能力。 - 此外,《DeepXDE: A Deep Learning Library for Solving Differential Equations》一文中介绍了一个名为DeepXDE的开源库,它实现了多种类型的PINN架构,可用于求解各类微分方程。此资源不仅提供了理论基础,也包含了丰富的实践案例供读者参考。 这些资料共同构成了对物理信息神经网络较为完整的描述,既涵盖了基本原理又涉及具体实现细节。 ```python import torch from pytorch_lightning import LightningModule class PINN(LightningModule): def __init__(self, layers, lb, ub): super().__init__() self.layers = layers ... def pde_loss(self, u_pred, x): """Compute physics-based loss.""" ... def training_step(self, batch, batch_idx): x, y_true = batch y_pred = self.forward(x) mse_loss = F.mse_loss(y_pred, y_true) pde_l = self.pde_loss(y_pred, x) total_loss = mse_loss + pde_l return {'loss': total_loss} ``` 上述代码片段展示了一个简单的基于PyTorch Lightning构建的PINN类结构,其中`pde_loss()`函数用于计算基于物理约束产生的损失项。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值