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类型即可,有几个常见的修改位置:
在数据集加载阶段修改
找到你自定义Dataset类的__getitem__方法,在返回标签前加上类型转换:# 假设原来的标签获取逻辑是这样的 label = ... # 这里得到的是Byte类型的张量或数值 label = torch.tensor(label, dtype=torch.long) return sample, label在训练循环中直接转换
打开你报错的train_helper.py文件,在计算loss的代码前添加转换逻辑:# 原代码第109行之前 labels = labels.long() if use_cuda: labels = labels.cuda() loss = criterion(outputs, labels)检查数据预处理环节
确认一下你的数据加载脚本(比如读取标签文件的部分),是不是在Colab中读取到的标签是Byte类型(比如从图片或二进制文件读取时默认是uint8),这时候可以在读取后直接转换为int64类型。
补充说明
PyTorch的损失函数对输入类型有严格要求:
CrossEntropyLoss的目标标签必须是类别的索引值,且类型为torch.long- 如果是二分类场景用
BCELoss,才会要求标签是torch.float类型
所以只要把标签的类型统一成LongTensor,这个错误就能解决啦。
内容的提问来源于stack exchange,提问作者shjk
相关产品推荐
相关产品推荐

