PyTorch CrossEntropyLoss文档示例运行异常:概率目标输入报错
问题原因及解决方案
一、概率形式目标报错的解决
你遇到的RuntimeError: 1D target tensor expected, multi-target not supported,核心原因是当前使用的PyTorch版本不支持将概率形式的2D张量作为CrossEntropyLoss的输入目标。
PyTorch 2.0及以上版本才正式支持CrossEntropyLoss接受类概率形式的目标(NxC维度的float张量),旧版本中该损失函数仅支持1D的类别索引张量(每个样本对应一个类别索引值)。
验证与修复步骤:
- 先确认当前PyTorch版本:
import torch print(torch.__version__)
- 如果版本低于2.0,可选择两种方案:
- 升级PyTorch到2.0+版本
- 手动实现概率形式的交叉熵计算:
import torch from torch import nn input = torch.randn(3, 5, requires_grad=True) target = torch.randn(3, 5).softmax(dim=1) # 手动计算交叉熵:log_softmax后与target加权求和取平均 log_probs = nn.functional.log_softmax(input, dim=1) loss = -(target * log_probs).sum(dim=1).mean() loss.backward()
二、类别索引目标无法更新权重的排查
使用类别索引目标时权重不更新,通常是以下某一操作缺失导致:
- 未执行反向传播:仅计算损失但未调用
loss.backward()触发梯度计算 - 模型参数未开启梯度追踪:部分层的参数被设置为
requires_grad=False - 优化器未绑定模型参数:初始化优化器时传入的参数不是模型的可训练参数
- 梯度被意外清零:反向传播前调用
optimizer.zero_grad()后,未重新计算损失并执行反向传播
正确使用示例:
import torch from torch import nn from torch.optim import SGD # 定义模型与优化器 model = nn.Linear(10, 5) optimizer = SGD(model.parameters(), lr=0.01) # 输入与类别索引目标 input = torch.randn(3, 10) target = torch.tensor([0, 2, 4]) # 1D类别索引张量 # 完整训练流程 output = model(input) loss = nn.CrossEntropyLoss()(output, target) optimizer.zero_grad() loss.backward() optimizer.step() # 验证梯度是否生成 print(next(model.parameters()).grad is not None) # 应输出True
内容的提问来源于stack exchange,提问作者rwallace
相关产品推荐
相关产品推荐

