You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch CrossEntropyLoss文档示例运行异常:概率目标输入报错

问题原因及解决方案

一、概率形式目标报错的解决

你遇到的RuntimeError: 1D target tensor expected, multi-target not supported,核心原因是当前使用的PyTorch版本不支持将概率形式的2D张量作为CrossEntropyLoss的输入目标。

PyTorch 2.0及以上版本才正式支持CrossEntropyLoss接受类概率形式的目标(NxC维度的float张量),旧版本中该损失函数仅支持1D的类别索引张量(每个样本对应一个类别索引值)。

验证与修复步骤:

  1. 先确认当前PyTorch版本:
import torch
print(torch.__version__)
  1. 如果版本低于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:08:16