Pytorch使用BCEWithLogitsLoss报错Float无法转Long类型如何解决
错误原因
- 核心原因是损失函数和标签类型不匹配:
nn.BCEWithLogitsLoss()要求输入的标签必须为浮点型(FloatTensor),你手动将标签y转换为长整型(LongTensor),损失计算时无法将浮点运算结果转为长整型,直接触发该报错。 - 代码还存在两处隐藏的兼容问题,会放大该错误:
- 评估函数
evaluate中计算损失时,y_pred没有执行squeeze()操作,预测输出和标签的维度不匹配,会额外引发类型运算异常。 - 若你是二分类场景使用BCE损失,AlexNet的输出维度
output_dim必须设置为1,若错误设置为2也会出现维度/类型不匹配问题。
- 评估函数
修复方案
- 调整标签类型转换逻辑,将所有
y = y.to(device).long()修改为y = y.to(device).float(),匹配BCE损失的输入要求。 - 统一训练、评估阶段的预测值处理逻辑,在评估函数的损失计算前也对
y_pred做压缩处理:
# evaluate函数内损失计算代码修改为 loss = criterion(y_pred.squeeze(), y)
- 确认你的任务类型适配损失函数:如果是N分类(N>2)任务,将损失函数更换为
nn.CrossEntropyLoss(),此时标签才需要用long类型,同时将AlexNet的output_dim设置为类别数N即可。 - 若你的
binary_accuracy函数对标签类型有特殊要求,可在计算准确率时单独将标签临时转为long类型,不影响损失计算即可。
内容的提问来源于stack exchange,提问作者crispengari
相关产品推荐
相关产品推荐

