multi-target not supported:CrossEntropyLoss 的 one-hot 标签先还原成类别索引

简介: 本文详解PyTorch中`multi-target not supported`错误成因:`[N,2]` one-hot标签误用`squeeze(1)`无法转为`[N]`类别索引,须显式`argmax`或改用BCE损失;强调验证target形状、语义及HWC→CHW正确变换,避免占位标签误导训练。(239字)

原帖用 [[1,0]] 作为占位标签,组批后又 squeeze,但仍将一整行类别向量传给旧版交叉熵:

RuntimeError: multi-target not supported at /pytorch/aten/src/THCUNN/generic/ClassNLLCriterion.cu:15

两列 one-hot 不是可被 squeeze 删除的单例维

原题用 [1,0] 当占位标签,组批后每样本仍有两个值。维度长度为 2 时 squeeze(1) 不做任何改变。若每样本只属于一个类别,应还原类别索引;若真正允许多个正类,则不能用 argmax 丢失信息。

squeeze(1) 只能删除长度为 1 的维度,不能把 [N,2] 的 one-hot 自动变成 [N] 类别编号。

在损失前检查 target 的实际维数:

print("josh050608")
print("output:", output.shape, output.dtype)
print("target:", target.shape, target.dtype)
print("example:", target[:2])

若确认每行恰有一个 1、表示互斥类别,可以先去掉原题多余的单例维,再按类别轴取索引:

one_hot = target.squeeze(1) if target.ndim == 3 else target
assert one_hot.ndim == 2 and one_hot.shape[1] == output.shape[1]
assert ((one_hot == 0) | (one_hot == 1)).all()
assert (one_hot.sum(dim=1) == 1).all()
class_ids = one_hot.argmax(dim=1).long()
loss = criterion(output, class_ids)

更直接是在 Dataset 中为每张图返回单个类别编号,DataLoader 会组成 [N]。真正的多标签任务不能用 argmax 丢掉其他正类,应改用相应的 BCE 目标。

原帖输出已经 log_softmax,可改为原始 logits 配 CrossEntropyLoss,或保留 log_softmax 配 NLLLoss。现代交叉熵支持同形状浮点软目标,但原帖历史接口与整型 one-hot 不能据此视为有效输入。

另外,HWC 图像变 CHW 应交换轴,不能用 reshape 重排颜色。占位标签只能验证流程,不代表模型学到了真实类别。验证目标形状、标签语义与一个训练 step 后,再换真实标注训练。

用合法 one-hot 验证转换,再拒绝多正类

下面是 CPU 合成分类例子,明确检查每行只有一个 1,再得到 [N] long 目标;不使用原题的占位标注训练真实模型:

import torch
from torch import nn
one_hot = torch.tensor([[1, 0], [0, 1], [1, 0]], dtype=torch.long)
assert one_hot.ndim == 2 and one_hot.shape[1] == 2
assert ((one_hot == 0) | (one_hot == 1)).all()
assert (one_hot.sum(dim=1) == 1).all()
class_ids = one_hot.argmax(dim=1).long()
head = nn.Linear(4, 2)
logits = head(torch.randn(3, 4))
loss = nn.CrossEntropyLoss()(logits, class_ids)
loss.backward()
assert head.weight.grad is not None
assert class_ids.tolist() == [0, 1, 0]
multi_label = torch.tensor([[1, 1]])
assert not bool((multi_label.sum(dim=1) == 1).all())
print("class IDs/loss:", class_ids, loss.item())

若真实标注是一张图片多个类别,保留 [N,C] 浮点目标,按多标签任务选择 BCEWithLogitsLoss,并使用逐类阈值预测。不能仅为让旧 NLL 接口接受而 argmax 成单类。

数据集直接返回类别编号通常更清楚,loader 会自然组为 [N]。原题占位标签全部相同,只能用于管线测试;训练准确率即使上升,也无法说明学会了真实类别。

历史接口与现代软目标支持需按版本区分。无论选哪条路线,都要确认输出原始 logits 或对数概率与损失匹配,并验证输入图片 HWC→CHW 用换轴完成,避免标签错误消失后还保留图像布局错误。

参考:原始求助帖;技术依据:CrossEntropyLoss(2.5)、NLLLoss(2.5)、BCEWithLogitsLoss(2.5)、PyTorch 数据加载(2.5)。

相关文章
|
10天前
|
Linux 开发工具 iOS开发
Codex保姆级教程(下载+安装+登录+使用,含所有版本,2026最新)
Codex是OpenAI推出的开源AI编程智能体,本地运行,可理解整个代码库,支持自然语言指令改代码、执行命令、跑测试、修Bug,兼容Win/macOS/Linux。(239字)
4015 20
|
11天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
4138 49
|
11天前
|
iOS开发 Docker MacOS
【2026实测】Docker Desktop下载、安装、汉化、配置教程(附官网安装包)
Docker Desktop 是 Docker 官方推出的桌面容器管理工具,集成引擎、CLI、图形界面与 Kubernetes,支持 Win/macOS/Linux。2026 最新版 4.88.1 强化 ARM 原生运行、镜像加速及资源可视化,附中文汉化与国内镜像配置指南。
1982 7
|
6天前
|
云安全 人工智能 安全
|
6天前
|
存储 弹性计算 人工智能
2026 年阿里云双十一活动入口攻略,新客服务器优惠通道、三大会场入口梳理
综合来看,2026年阿里云双十一活动入口清晰: 阿里云轻量应用服务器、阿里云ECS云服务器、阿里云GPU云服务器、阿里云百炼大模型服务平台 活动会场、综合权益中心、99计划专场三大入口覆盖服务器、AI权益与续费特价;新用户通过控制台首页banner、权益中心、产品页三处路径进入专属专场,老用户通过控制台弹窗和费用中心权益中心进入老客专区,企业用户做企业实名后解锁专属满减与阶梯折扣。
819 0
|
5天前
|
Linux 开发工具 iOS开发
2026最新codex下载安装保姆级使用教程(下载+安装+登录+使用,含所有历史版本)
本文详解OpenAI Codex国内快速上手指南:提供Win/macOS/Linux全平台免安装包、npm/Homebrew等多方式安装、账号/API Key双登录、简体中文切换,覆盖下载、安装、汉化、使用及高频避坑(如微软商店失败、npm超时等),10分钟即可跑通。
1097 2
|
12天前
|
安全 算法 定位技术
《高性价比人生指南》完整原版:普通人用最少的资源,过好这一生的底层逻辑~How To Live Better
📖《高性价比人生指南》是一份基于实证、拒绝焦虑的生存手册,倡导以“人生时薪”为视角,重新计算时间、金钱与精力的成本与收益。它不承诺逆袭,只教人算清账:省下的钱若耗掉时间便亏;买体验比买物品更值;睡眠是最高杠杆的健康投资;关系贵在情绪价值而非表面热络;学习重在改变行为而非自我安慰。核心理念:用低成本、高回报的微小行动,换取长期的选择权——不是成为谁,而是掌控自己人生的主动权。
2145 6
|
云安全 安全 网络安全
|
24天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
4341 58

热门文章

最新文章