Pytorch调用CrossEntropyLoss报nll_loss CUDA内核不支持Int类型错误如何解决
报错核心原因
PyTorch的nn.CrossEntropyLoss()损失函数要求传入的标签参数必须为LongTensor(64位整数类型),你当前传入的labels是32位整数类型,CUDA环境下没有针对32位整数的对应损失计算内核实现,因此触发报错。教程可正常运行大概率是其使用CPU环境运行,CPU对32位整数标签的兼容更宽松。
可行解决方法
- 改动最小的方案:在训练循环中将标签移到计算设备时,直接转换为
long类型,修改对应代码即可:
# 原代码 labels = labels.to(device) # 修改为 labels = labels.to(device).long()
- 更规范的方案:在数据集的
__getitem__方法返回标签时,就指定为long类型,避免后续每次训练都做类型转换:
def __getitem__(self, index): # 假设y_data是你存储标签的变量 return self.x_data[index], torch.tensor(self.y_data[index], dtype=torch.long)
- 临时验证方案:强制使用CPU运行,牺牲训练速度即可兼容32位整数标签,不推荐长期使用:
device = torch.device('cpu')
内容的提问来源于stack exchange,提问作者Joyanta J. Mondal
相关产品推荐
相关产品推荐

