Yolact Edge分割时CUDA张量转numpy触发TypeError如何修复
报错根因
该报错的本质是Numpy仅支持处理CPU内存中的数据,无法直接读取显存(CUDA设备)上存储的PyTorch张量。你代码中虽然提前将t[3]克隆到CPU并保存为t_cpu变量,但后续调用torch.where时依然使用了存储在显存中的原始t[3]张量,因此返回的horizontal_translation内的张量仍位于CUDA设备上,直接转换为Numpy格式就会触发报错。
除此之外,你代码中的np.append用法也存在错误:np.append属于非原地操作,不会修改传入的原列表,按现有写法运行结束后xmin、xmax都会是空列表。
修复后可运行代码
xmin = [] xmax = [] y = [] print(np.shape(t[3])) print(type(t[3][:][:][:])) # 提前把t[3]搬到CPU,避免循环内重复操作浪费性能 t_cpu = t[3].clone().detach().cpu() for i in range (0, 2): horizontal_translation = torch.where(t_cpu[i][:][:]==1) print(horizontal_translation) # 转numpy前确保张量在CPU上,做双重兼容 horizontal_translation_numpy = np.asarray(horizontal_translation[1].cpu()) x_min = np.amin(horizontal_translation_numpy) x_max = np.amax(horizontal_translation_numpy) # 直接用列表的append方法,避免np.append的非原地问题 xmin.append(x_min) xmax.append(x_max) print(xmin) print(xmax)
核心修改点
- 将torch.where的输入替换为已经搬到CPU的t_cpu张量,减少不必要的CUDA-CPU数据拷贝,同时保证返回的张量默认在CPU上
- 转Numpy数组前给张量加
.cpu()操作,做双重兼容,避免张量还在CUDA设备上的问题 - 把
np.append替换为列表自带的append方法,解决原写法无法保存计算结果的问题
内容的提问来源于stack exchange,提问作者Akshay Acharya
相关产品推荐
相关产品推荐

