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

PyTorch计算ResNet50的IoU时报bitwise_and_cpu不支持Float错误怎么解决

问题原因

你遇到的报错是因为&和|是位运算符,PyTorch仅支持布尔型或整型张量调用这两个运算符,而你的预测掩码、真值掩码均为浮点型张量,因此触发了对应报错。

无位运算的IoU实现方案

IoU的核心计算逻辑为交集像素总数 / 并集像素总数,完全可以通过四则运算代替位运算实现:

  • 交集:对于二值0/1张量,两个张量对应位置相乘,结果为1的位置就是同时为真的交集区域,求和即可得到交集像素总数
  • 并集:两个张量分别求和后减去交集的和,即可得到并集像素总数

修正后的IoU计算函数

import torch

def IoU(predict: torch.Tensor, target: torch.Tensor):
    # 若模型输出的是概率值,需先加阈值转为二值张量,示例:predict = (predict > 0.5).float()
    intersection = (predict * target).sum().double()
    union = predict.sum().double() + target.sum().double() - intersection
    # 处理并集为0的边界情况,避免除0报错
    if union == 0:
        return 1.0 if intersection == 0 else 0.0
    return (intersection / union).item()

修正后的IoU批量计算函数

你原有代码存在逻辑问题:初始化IoU_score为列表,但循环中直接将其赋值为单值,最终只会返回最后一个样本的IoU,修正后如下:

def applyIoU(model, dataset):
    IoU_scores = []
    for i in range(len(dataset)):
        image, true_mask = dataset[i]
        x_tensor = torch.from_numpy(image).to('cpu').unsqueeze(0)
        pred_mask = model.predict(x_tensor)
        # 若模型输出概率,同样在此处加阈值转二值:pred_mask = (pred_mask > 0.5).float()
        true_mask = torch.from_numpy(true_mask).to('cpu').unsqueeze(0)
        current_iou = IoU(pred_mask, true_mask)
        IoU_scores.append(current_iou)
    assert type(true_mask) == torch.Tensor
    # 此处返回所有样本的平均IoU,也可根据需求直接返回IoU_scores列表
    return sum(IoU_scores) / len(IoU_scores) if IoU_scores else 0.0

如果是多分类场景的IoU计算,只需对每个类别单独执行上述逻辑即可,同样不需要使用位运算符。

内容的提问来源于stack exchange,提问作者Black Beard 53

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:09:01