You need to enable JavaScript to run this app. Yolact Edge分割时CUDA张量转numpy触发TypeError如何修复
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 12:00:01