Expected scalar type Long for argument #2 'target':单输出二分类别只改标签类型

简介: 该帖解析 PyTorch 中 `CrossEntropyLoss` 报错“expected scalar type Long but got Float”的根本原因:末层单输出(`Linear(…,1)`)却误用交叉熵——它要求标签为 `long` 且输出通道数≥类别数。正确方案二选一:① 改用 `BCEWithLogitsLoss`(单输出+浮点标签);② 改末层为 `Linear(…,2)` 并确保标签∈{0,1}。需同步校验形状、类型与类别映射。(239字)

原帖末层 Linear(input_size,1),却把浮点标签交给 CrossEntropyLoss:

RuntimeError: Expected object of scalar type Long but got scalar type Float for argument #2 'target'

类型修完后,还要确认类别数

原题的单输出层只给交叉熵一个类别通道。如果标签含 1,简单 .long() 会把错误推进到“类别越界”。因此这题与普通的 Long/Float 标签错误不同,需要把最后一层、损失和准确率计算一起确认。

这里同时存在两个需要判断的问题:目标类型与输出定义。把标签转成 long,未必足以修复只有一个 logit 的二分类模型。

在损失调用前,y_hat 是模型输出,y 是当前标签:

print("josh050608")
print("prediction:", y_hat.shape, y_hat.dtype)
print("target:", y.shape, y.dtype, y.unique())

若保留一个输出神经元,采用 BCEWithLogitsLoss。下面假定 y 是每样本一个 0/1 值,输出为 [N,1]:

import torch.nn.functional as F
target = y.reshape(-1, 1).to(y_hat)
assert target.shape == y_hat.shape
loss = F.binary_cross_entropy_with_logits(y_hat, target)
pred = (y_hat.squeeze(1) >= 0).long()
accuracy = (pred == y.reshape(-1).long()).float().mean()

模型末尾不要再加 sigmoid,预测阶段才把 logit 转为概率。原题还计算 L2 正则项,可以在得到这个标量 loss 后按原设计相加。

若坚持用交叉熵,末层应为 Linear(input_size,2),输出 [N,2] 原始 logits,标签为 [N] long,取值 0 或 1;预测使用 argmax(dim=1)。只有一个类别通道时,类别 1 不在交叉熵可接受的范围内。

修复后先做一批前向与反向,检查标签含义和类别映射,再测准确率。不要把所有模型输入改成 long,这个类型要求针对的是类别索引目标。

两种完整设计的对照小例子

下面使用相同的合成二分类标签,分别验证单 logit 与双 logit 的接口,不声称两套随机模型的数值结果相同:

import torch
from torch import nn
x = torch.randn(4, 3)
labels = torch.tensor([0, 1, 1, 0], dtype=torch.long)
one = nn.Linear(3, 1)
two = nn.Linear(3, 2)
logit = one(x)
binary_target = labels.to(logit).unsqueeze(1)
loss_one = nn.BCEWithLogitsLoss()(logit, binary_target)
logits = two(x)
loss_two = nn.CrossEntropyLoss()(logits, labels)
loss_one.backward()
loss_two.backward()
assert one.weight.grad is not None and two.weight.grad is not None
prediction_one = (logit.squeeze(1) >= 0).long()
prediction_two = logits.argmax(dim=1)
assert prediction_one.shape == prediction_two.shape == labels.shape
print("losses:", loss_one.item(), loss_two.item())

单输出方案中,浮点标签是 BCE 接口所需;双输出方案中,long 标签表示两个互斥类别的编号。这不是一条“所有标签永远转 long”的规则。

原题还手工把 L2 项加到损失。保留时确认正则项是与参数相连的标量,再与正确的基础损失相加;不要把 .item() 后的 Python 数值当作仍可对参数求导的正则项。如果同时给优化器设置 weight_decay,还应核对是否有意重复惩罚。

修改完成后分别检查 loss 的标量性、参数 grad、预测 shape 和 0/1 类别映射。准确率若把 [N,1] 与 [N] 直接比较,可能广播成 [N,N],应像示例那样先对齐为一维再逐样本比较。

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

相关文章
|
10天前
|
Linux 开发工具 iOS开发
Codex保姆级教程(下载+安装+登录+使用,含所有版本,2026最新)
Codex是OpenAI推出的开源AI编程智能体,本地运行,可理解整个代码库,支持自然语言指令改代码、执行命令、跑测试、修Bug,兼容Win/macOS/Linux。(239字)
4061 20
|
11天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
4159 49
|
11天前
|
iOS开发 Docker MacOS
【2026实测】Docker Desktop下载、安装、汉化、配置教程(附官网安装包)
Docker Desktop 是 Docker 官方推出的桌面容器管理工具,集成引擎、CLI、图形界面与 Kubernetes,支持 Win/macOS/Linux。2026 最新版 4.88.1 强化 ARM 原生运行、镜像加速及资源可视化,附中文汉化与国内镜像配置指南。
1998 7
|
6天前
|
云安全 人工智能 安全
|
6天前
|
存储 弹性计算 人工智能
2026 年阿里云双十一活动入口攻略,新客服务器优惠通道、三大会场入口梳理
综合来看,2026年阿里云双十一活动入口清晰: 阿里云轻量应用服务器、阿里云ECS云服务器、阿里云GPU云服务器、阿里云百炼大模型服务平台 活动会场、综合权益中心、99计划专场三大入口覆盖服务器、AI权益与续费特价;新用户通过控制台首页banner、权益中心、产品页三处路径进入专属专场,老用户通过控制台弹窗和费用中心权益中心进入老客专区,企业用户做企业实名后解锁专属满减与阶梯折扣。
820 0
|
5天前
|
Linux 开发工具 iOS开发
2026最新codex下载安装保姆级使用教程(下载+安装+登录+使用,含所有历史版本)
本文详解OpenAI Codex国内快速上手指南:提供Win/macOS/Linux全平台免安装包、npm/Homebrew等多方式安装、账号/API Key双登录、简体中文切换,覆盖下载、安装、汉化、使用及高频避坑(如微软商店失败、npm超时等),10分钟即可跑通。
1121 3
|
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等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
4354 58

热门文章

最新文章