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

Colab运行神经网络遇RuntimeError:期望Long类型却得到Byte类型

解决PyTorch中RuntimeError: Expected object of scalar type Long but got scalar type Byte的问题

这个错误的核心原因非常明确:PyTorch的CrossEntropyLoss(也就是你代码里的criterion)要求传入的目标标签必须是LongTensor(64位整数类型),但你当前传入的标签是ByteTensor(8位无符号整数类型)。

你提到相同代码在本地运行正常但Colab报错,大概率是因为两地环境的数据加载逻辑或PyTorch版本差异导致标签的默认类型不一样——比如本地加载数据时标签自动被转换成了Long类型,而Colab中数据加载后标签保留了Byte类型。这个问题和batch size完全无关,所以减小batch size自然解决不了。

具体解决方法

你只需要在传入损失函数前,把标签转换成Long类型即可,有几个常见的修改位置:

  1. 在数据集加载阶段修改
    找到你自定义Dataset类的__getitem__方法,在返回标签前加上类型转换:

    # 假设原来的标签获取逻辑是这样的
    label = ... # 这里得到的是Byte类型的张量或数值
    label = torch.tensor(label, dtype=torch.long)
    return sample, label
    
  2. 在训练循环中直接转换
    打开你报错的train_helper.py文件,在计算loss的代码前添加转换逻辑:

    # 原代码第109行之前
    labels = labels.long()
    if use_cuda:
        labels = labels.cuda()
    loss = criterion(outputs, labels)
    
  3. 检查数据预处理环节
    确认一下你的数据加载脚本(比如读取标签文件的部分),是不是在Colab中读取到的标签是Byte类型(比如从图片或二进制文件读取时默认是uint8),这时候可以在读取后直接转换为int64类型。

补充说明

PyTorch的损失函数对输入类型有严格要求:

  • CrossEntropyLoss的目标标签必须是类别的索引值,且类型为torch.long
  • 如果是二分类场景用BCELoss,才会要求标签是torch.float类型

所以只要把标签的类型统一成LongTensor,这个错误就能解决啦。

内容的提问来源于stack exchange,提问作者shjk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:04:54