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
相关产品推荐
相关产品推荐

