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函数。 2. \*\*计算方式不同\*\*: - \`nn.CrossEntropyLoss\`和\`nn.NLLLoss\`+\`nn.LogSoftmax\`的组合首先对logits应用softmax函数,然后对每个类别的概率取对数,最后计算负对数似然损失。 - 您的代码直接对输出(\`output\`)取对数,没有经过softmax转换。这意味着您的代码假设\`output\`是概率值(即经过sigmoid函数处理的结果),而不是logits。因此,它直接计算了每个样本的对数似然损失,并且通过\`torch.matmul\`和\`torch.trace\`来计算整个批次的损失。 3. \*\*损失计算的细节\*\*: - \`nn.CrossEntropyLoss\`在内部处理了多类别的情况,并且可以处理多维的输出,其中每一维对应一个类别的概率。 - 您的代码是为二元分类设计的,它通过\`y\`和\`(1 - y)\`来区分两个类别,并且只计算了两个类别的对数似然损失。 4. \*\*数值稳定性\*\*: - \`nn.CrossEntropyLoss\`和\`nn.LogSoftmax\`的组合由于先进行softmax转换,通常具有更好的数值稳定性。 - 直接对概率值取对数可能会遇到数值问题,尤其是当概率值接近0或1时。 总结来说,您的代码是一个为二元分类问题定制的交叉熵损失函数,它直接对概率输出取对数,而PyTorch的\`nn.CrossEntropyLoss\`和\`nn.NLLLoss\`+\`nn.LogSoftmax\`的组合则提供了更通用的解决方案,适用于多类别问题,并且具有更好的数值稳定性。

相关推荐
喜欢吃豆4 小时前
使用 OpenAI Responses API 构建生产级应用的终极指南—— 状态、流式、异步与文件处理
网络·人工智能·自然语言处理·大模型
Q同学4 小时前
verl进行Agentic-RL多工具数据集字段匹配问题记录
人工智能
亚马逊云开发者4 小时前
Amazon Q Developer 结合 MCP 实现智能邮件和日程管理
人工智能
Coding茶水间5 小时前
基于深度学习的路面坑洞检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
图像处理·人工智能·深度学习·yolo·目标检测·计算机视觉
梵得儿SHI5 小时前
AI Agent 深度解析:高级架构、优化策略与行业实战指南(多智能体 + 分层决策 + 人类在环)
人工智能·多智能体系统·aiagent·分层决策系统·人类在环机制·agent系统完整解决方案·aiagent底层原理
Peter_Monster5 小时前
大语言模型(LLM)架构核心解析(干货篇)
人工智能·语言模型·架构
Ma0407135 小时前
【机器学习】监督学习、无监督学习、半监督学习、自监督学习、弱监督学习、强化学习
人工智能·学习·机器学习
cooldream20095 小时前
LlamaIndex 存储体系深度解析
人工智能·rag·llamaindex
Elastic 中国社区官方博客6 小时前
使用 A2A 协议和 MCP 在 Elasticsearch 中创建一个 LLM agent 新闻室:第二部分
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
知识浅谈6 小时前
我用Gemini3pro 造了个手控全息太阳系
人工智能