pytorch 的交叉熵函数,多分类,二分类

多分类

在PyTorch中,交叉熵损失函数主要用于多类分类问题。PyTorch提供了两个交叉熵损失函数:`nn.CrossEntropyLoss` 和 `nn.NLLLoss` 与 `nn.LogSoftmax` 的组合。

1. `nn.CrossEntropyLoss`

`nn.CrossEntropyLoss` 是一个组合损失函数,它结合了 `nn.LogSoftmax` 和 `nn.NLLLoss`。这个损失函数期望输入(通常是模型的原始输出,即logits)和目标(ground truth labels)。

  • **输入**:模型的原始输出(logits)和目标标签。

  • **目标**:目标标签,通常是类的索引。

使用示例:

```python

import torch

import torch.nn as nn

假设有3个样本,每个样本有5个类别,模型输出的logits形状为[3, 5]

logits = torch.tensor([[1.0, 2.0, 3.0, 4.0, 5.0],

[1.0, 2.0, 3.0, 4.0, 5.0],

[1.0, 2.0, 3.0, 4.0, 5.0]])

真实标签,每个样本一个标签

labels = torch.tensor([1, 0, 4])

创建交叉熵损失函数

criterion = nn.CrossEntropyLoss()

计算损失

loss = criterion(logits, labels)

print(loss)

```

2. `nn.NLLLoss` 和 `nn.LogSoftmax`

如果你想要更细粒度的控制,可以使用 `nn.LogSoftmax` 和 `nn.NLLLoss` 分别对logits进行softmax转换和计算负对数似然损失。

  • **`nn.LogSoftmax`**:对输入应用log-softmax函数。

  • **`nn.NLLLoss`**:计算负对数似然损失。

使用示例:

```python

import torch

import torch.nn as nn

import torch.nn.functional as F

假设有3个样本,每个样本有5个类别,模型输出的logits形状为[3, 5]

logits = torch.tensor([[1.0, 2.0, 3.0, 4.0, 5.0],

[1.0, 2.0, 3.0, 4.0, 5.0],

[1.0, 2.0, 3.0, 4.0, 5.0]])

真实标签,每个样本一个标签

labels = torch.tensor([1, 0, 4])

应用log-softmax

log_softmax = nn.LogSoftmax(dim=1)

log_probs = log_softmax(logits)

创建负对数似然损失函数

nll_loss = nn.NLLLoss()

计算损失

loss = nll_loss(log_probs, labels)

print(loss)

```

这两种方法都可以用于计算交叉熵损失,选择哪一种取决于你的具体需求和偏好。`nn.CrossEntropyLoss` 更为方便,因为它将两个步骤合并为一步,而 `nn.NLLLoss` 和 `nn.LogSoftmax` 的组合则提供了更多的灵活性。

二分类

loss = -torch.trace(torch.matmul(y, torch.log(output).float().t()) + torch.matmul((1 - y), torch.log(1 - output).float().t())) # 计算损失函数 和这个区别呢

您提供的代码行:

```python

loss = -torch.trace(torch.matmul(y, torch.log(output).float().t()) +

torch.matmul((1 - y), torch.log(1 - output).float().t()))

```

这是一个自定义的二元分类交叉熵损失函数的实现。它与PyTorch提供的`nn.CrossEntropyLoss`和`nn.NLLLoss`+`nn.LogSoftmax`的组合有以下不同:

  1. **输入要求不同**:
  • `nn.CrossEntropyLoss`接受原始输出(logits)和类别索引作为目标(target)。它内部会先应用`nn.LogSoftmax`,然后计算负对数似然损失(NLL)。

  • 您提供的代码同样接受原始输出(logits)和真实标签(y),但它期望`y`是0和1的二元标签,并且直接计算对数似然,没有应用softmax函数。

  1. **计算方式不同**:
  • `nn.CrossEntropyLoss`和`nn.NLLLoss`+`nn.LogSoftmax`的组合首先对logits应用softmax函数,然后对每个类别的概率取对数,最后计算负对数似然损失。

  • 您的代码直接对输出(`output`)取对数,没有经过softmax转换。这意味着您的代码假设`output`是概率值(即经过sigmoid函数处理的结果),而不是logits。因此,它直接计算了每个样本的对数似然损失,并且通过`torch.matmul`和`torch.trace`来计算整个批次的损失。

  1. **损失计算的细节**:
  • `nn.CrossEntropyLoss`在内部处理了多类别的情况,并且可以处理多维的输出,其中每一维对应一个类别的概率。

  • 您的代码是为二元分类设计的,它通过`y`和`(1 - y)`来区分两个类别,并且只计算了两个类别的对数似然损失。

  1. **数值稳定性**:
  • `nn.CrossEntropyLoss`和`nn.LogSoftmax`的组合由于先进行softmax转换,通常具有更好的数值稳定性。

  • 直接对概率值取对数可能会遇到数值问题,尤其是当概率值接近0或1时。

总结来说,您的代码是一个为二元分类问题定制的交叉熵损失函数,它直接对概率输出取对数,而PyTorch的`nn.CrossEntropyLoss`和`nn.NLLLoss`+`nn.LogSoftmax`的组合则提供了更通用的解决方案,适用于多类别问题,并且具有更好的数值稳定性。

相关推荐
python算法(魔法师版)17 分钟前
深度学习深度解析:从基础到前沿
人工智能·深度学习
kakaZhui41 分钟前
【llm对话系统】大模型源码分析之 LLaMA 位置编码 RoPE
人工智能·深度学习·chatgpt·aigc·llama
struggle20252 小时前
一个开源 GenBI AI 本地代理(确保本地数据安全),使数据驱动型团队能够与其数据进行互动,生成文本到 SQL、图表、电子表格、报告和 BI
人工智能·深度学习·目标检测·语言模型·自然语言处理·数据挖掘·集成学习
佛州小李哥2 小时前
通过亚马逊云科技Bedrock打造自定义AI智能体Agent(上)
人工智能·科技·ai·语言模型·云计算·aws·亚马逊云科技
云空3 小时前
《DeepSeek 网页/API 性能异常(DeepSeek Web/API Degraded Performance):网络安全日志》
运维·人工智能·web安全·网络安全·开源·网络攻击模型·安全威胁分析
AIGC大时代3 小时前
对比DeepSeek、ChatGPT和Kimi的学术写作关键词提取能力
论文阅读·人工智能·chatgpt·数据分析·prompt
山晨啊84 小时前
2025年美赛B题-结合Logistic阻滞增长模型和SIR传染病模型研究旅游可持续性-成品论文
人工智能·机器学习
一水鉴天4 小时前
为AI聊天工具添加一个知识系统 之77 详细设计之18 正则表达式 之5
人工智能·正则表达式
davenian5 小时前
DeepSeek-R1 论文. Reinforcement Learning 通过强化学习激励大型语言模型的推理能力
人工智能·深度学习·语言模型·deepseek
X.AI6665 小时前
【大模型LLM面试合集】大语言模型架构_llama系列模型
人工智能·语言模型·llama