nll_loss_forward_reduce_cuda_kernel_2d_index not implemented for Int:类别标签要用 int64

简介: PyTorch中CrossEntropyLoss报错“not implemented for 'Int'”,主因是标签为int32(torch.int32),而该损失要求long(int64)。需显式转换:`labels = labels.to(device, dtype=torch.long)`,并验证范围与维度。数据集入口统一转int64更稳妥。(239字)

原帖聊天机器人在 CrossEntropyLoss(outputs, labels) 失败;报错中的 Int 指向 int32 目标:

RuntimeError: "nll_loss_forward_reduce_cuda_kernel_2d_index" not implemented for 'Int'

Int 与 Long 在这里不是同一种整数

报错内核名已经指向分类索引损失,Int 通常对应 torch.int32,long 对应 int64。原题把标签移到 device 时没有指定 dtype,因而可能保留 NumPy 导入的 int32。应转换类别索引,词袋特征仍按模型浮点类型处理。

CUDA 上的分类索引目标需要符合该损失的类型约定。把标签移动到 GPU 不会自动把 int32 转成 long。

在损失前检查当前 batch:

print("josh050608")
print("outputs:", outputs.shape, outputs.dtype, outputs.device)
print("labels:", labels.shape, labels.dtype, labels.device)
print("range:", labels.min().item(), labels.max().item())

若 labels 确实是单标签分类的整数类别编号,取 batch 后显式转换:

labels = labels.to(device=outputs.device, dtype=torch.long)
assert labels.ndim == 1
assert 0 <= labels.min().item() and labels.max().item() < outputs.shape[1]
loss = criterion(outputs, labels)

本段需已有 import torch。更早也可以在构造数据集时把 NumPy 标签转为 int64。不要对词袋浮点特征和整个模型一起调用 .long();模型输出应保留浮点原始 logits。

原帖的缩减代码还把 X_train 展示成空数组,并省略了 Dataset 的取样方法,这不足以单独重跑完整训练。修复类型后若出现范围或空数据错误,要回到实际标签编码和数据集构造检查。

验证同一个 batch 能完成前向、loss 与 backward,再检查标签映射与 output_size=len(tags) 一致。报错消失并不保证训练数据与意图标签已经正确配对。

在数据入口固定类型,避免每批反复猜测

下面用合成词袋和意图编号完成一步训练,CPU 即可运行。它保留原题隐藏层宽度 47,类别数仅为演示设成 3,不代替真实 tags:

import numpy as np
import torch
from torch import nn
features = torch.from_numpy(np.arange(24, dtype=np.float32).reshape(4, 6) / 24)
raw_labels = np.array([0, 1, 2, 1], dtype=np.int32)
labels = torch.from_numpy(raw_labels.astype(np.int64))
model = nn.Sequential(nn.Linear(6, 47), nn.ReLU(), nn.Linear(47, 3))
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
optimizer.zero_grad()
outputs = model(features)
assert labels.dtype == torch.long and labels.shape == (4,)
assert labels.min() >= 0 and labels.max() < outputs.shape[1]
loss = nn.CrossEntropyLoss()(outputs, labels)
loss.backward()
assert model[0].weight.grad is not None
optimizer.step()
print("labels/output/loss:", labels.dtype, outputs.shape, loss.item())

真实 Dataset 最好同时返回一条词袋特征和相应类别编号,loader 打乱时仍保持配对。labels.to(device) 只改变设备;若数据入口没固定 int64,可在取 batch 时显式指定 dtype=torch.long,但要接住返回值。

原帖缩减代码中 X_train 为空,Dataset 方法也不完整,因此无法据它直接重跑全部训练。需要回到真实生成过程确认样本数量、tags 映射与 output_size;标签类型修好后出现空数据或范围错误,应继续处理,不能把类型转换当作完整训练正确性的证明。

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

相关文章
|
2天前
|
存储 PyTorch 算法框架/工具
some of the strides of a given numpy array are negative:flip 后先复制再 from_numpy
PyTorch `torch.from_numpy()` 不支持负步长(如 `np.flip` 生成的视图),会报错。解决方法:① `.copy()` 或 `np.ascontiguousarray()` 转为正步长;② 改用 `torch.flip()` 在 Tensor 层翻转。注意图像轴向、标注同步及 Dataset 中提前处理,避免 collate 阶段出错。(239字)
|
2天前
|
人工智能 自然语言处理 运维
AI 邮件助理场景下提示注入型钓鱼攻击的机理与防御
本文揭示AI邮件助理面临的新威胁:攻击者利用“提示注入”将恶意指令藏于邮件HTML中,绕过人眼直接操控助理执行转发、检索与窃取。研究指出,防御关键不在识别恶意文本,而在于约束能力组合——通过入口净化、权限分权、动作审核与输出归因构建闭环防护。(239字)
38 1
|
2天前
|
数据采集 运维 监控
发电机供油设备物联网可视化监控方案
本方案构建发电机供油系统物联网监控平台,实现油罐/箱液位、油温、油压、泵阀状态等实时采集、可视化展示、智能告警、远程控制与PLC远程维护,破解人工巡检低效、数据孤岛、响应滞后难题,提升供电可靠性与运维智能化水平。(239字)
|
2天前
|
存储 PyTorch 算法框架/工具
can't convert a given np.ndarray to a tensor:字符串类别先建立稳定编码
该文详解PyTorch中字符串类别标签转Tensor的常见错误与正确做法:需先构建统一的类别→整数映射(如`class_to_id`),再生成`torch.long`型目标张量;强调训练/验证/推理必须复用同一映射,显式处理未知类别,并校验维度与语义一致性。
|
2天前
|
PyTorch API 算法框架/工具
pic should be PIL Image or ndarray, Got numpy.ndarray:CSV 表格别走图像 ToTensor
本文剖析PyTorch中误用图像ToTensor处理表格数据的典型错误:一维标签触发类型检查异常,整表append导致样本数为1。强调应按行取样,用torch.from_numpy直接转数值张量,避免强行适配图像API,并验证数据粒度、形状与模型语义一致性。(239字)
|
2天前
|
索引
IndexError: index out of range in self:BERT 先查 token ID 与 embedding 表大小
该文详解 `IndexError: index out of range in self` 在 `F.embedding` 中的根因:token ID 越界。强调优先检查输入 ID 范围、嵌入表行数(`num_embeddings`)、位置/类型表限制,而非误调标签;指出 tokenizer 与模型需配套,新增 special tokens 必须调用 `resize_token_embeddings()` 并同步保存,禁用取模等掩盖语义的错误修复。(239字)
|
2天前
|
并行计算 PyTorch 算法框架/工具
Cannot re-initialize CUDA in forked subprocess:先把图像预处理留在 CPU worker
PyTorch中multiprocessing.Pool默认fork方式会触发CUDA重初始化错误。正确做法:worker仅做CPU预处理(如zoom),主进程统一转GPU;必须用spawn启动方法,并确保worker为模块顶层函数。
|
2天前
|
缓存 PyTorch Linux
module 'torch' has no attribute 'Tensor':先看导入的是哪个 torch
该问题源于`torch`模块导入异常,常见于同名文件冲突(如本地`torch.py`遮挡)、安装不完整或Python版本过旧(如CentOS+Py3.5.1)。需先验证模块路径与完整性,再修复环境。
|
2天前
|
并行计算 PyTorch 算法框架/工具
The NVIDIA driver on your system is too old:分清驱动支持版本、torch 构建和 nvcc
该帖揭示CUDA版本混淆常见误区:nvidia-smi显示驱动支持的最高CUDA版本(如10.1),而PyTorch实际依赖其编译时绑定的CUDA运行时(如10.2),报错“driver too old”实为驱动版本低于PyTorch构建所需最低要求,并非数字不一致即出错。
|
2天前
|
机器学习/深度学习 并行计算 PyTorch
CUDA error: an illegal memory access was encountered:LSTM 分配 hidden 的行可能只是后续报错点
原帖在验证阶段创建LSTM hidden状态时触发CUDA非法内存访问错误。该异步报错常掩盖真实越界位置,需设`CUDA_LAUNCH_BLOCKING=1`定位首个失败操作,并通过输入派生`h0/c0`避免设备不一致,辅以CPU批次快照与小规模复现排查根因。(239字)

热门文章

最新文章