首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将CUDA张量转换为NumPy

将CUDA张量转换为NumPy
EN

Stack Overflow用户
提问于 2019-09-07 09:33:12
回答 2查看 11.8K关注 0票数 2

首先,我尝试了这些解决方案:1234,但对我来说没有用。

在对神经网络进行训练和测试之后,我试图给出一些例子来验证我的工作。我将方法命名为 predict ,将图像传递给它,以预测它属于哪个类:

代码语言:javascript
代码运行次数:0
运行
复制
def predict(model, image_path, topk=5):
''' Predict the class (or classes) of an image using a trained deep learning model.
'''

output = process_image(image_path)
output.unsqueeze_(0)
output = output.cuda().float()

model.eval()

with torch.no_grad():
    score = model(output)
    prob, idxs = torch.topk(score, topk)

    # Convert indices to classes
    idxs = np.array(idxs)
    idx_to_class = {val:key for key, val in model.class_to_idx.items()}
    classes = [idx_to_class[idx] for idx in idxs[0]]

    # Map the class name with collected topk classes
    names = []
    for cls in classes:
        names.append(cat_to_name[str(cls)])

    return prob, names

然后是最后一步,显示基于神经网络训练的最终结果,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
# TODO: Display an image along with the top 5 classes
x_pos, y_pos = predict(model, img_pil, topk=5)

ax_img = imshow(output)
ax_img.set_title(y_pos[0])

plt.figure(figsize=(4,4))
plt.barh(range(len(y_pos)), np.exp(x_pos[0]))
plt.yticks(range(len(y_pos)), y_pos)

plt.show()

错误是:

代码语言:javascript
代码运行次数:0
运行
复制
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-45-e3f9951e9804> in <module>()
----> 1 x_pos, y_pos = predict(model, img_pil, topk=5)
      2
      3 ax_img = imshow(output)
      4 ax_img.set_title(y_pos[0])
      5

1 frames
<ipython-input-44-d77500f31561> in predict(model, image_path, topk)
     14
     15         # Convert indices to classes
---> 16         idxs = np.array(idxs)
     17         idx_to_class = {val:key for key, val in model.class_to_idx.items()}
     18         classes = [idx_to_class[idx] for idx in idxs[0]]

/usr/local/lib/python3.6/dist-packages/torch/tensor.py in __array__(self, dtype)
    456     def __array__(self, dtype=None):
    457         if dtype is None:
--> 458             return self.numpy()
    459         else:
    460             return self.numpy().astype(dtype, copy=False)

TypeError: can't convert CUDA tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.

如何解决这个问题?

我试图将idx更改为idxs = idxs.cpu().numpy(),错误是:

代码语言:javascript
代码运行次数:0
运行
复制
TypeError                                 Traceback (most recent call last)
<ipython-input-62-e3f9951e9804> in <module>()
      5
      6 plt.figure(figsize=(4,4))
----> 7 plt.barh(range(len(y_pos)), np.exp(x_pos[0]))
      8 plt.yticks(range(len(y_pos)), y_pos)
      9

/usr/local/lib/python3.6/dist-packages/torch/tensor.py in __array__(self, dtype)
    456     def __array__(self, dtype=None):
    457         if dtype is None:
--> 458             return self.numpy()
    459         else:
    460             return self.numpy().astype(dtype, copy=False)

TypeError: can't convert CUDA tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-07 09:37:46

试着改变

代码语言:javascript
代码运行次数:0
运行
复制
idxs = np.array(idxs)

代码语言:javascript
代码运行次数:0
运行
复制
idxs = idxs.cpu().numpy()

和变化

代码语言:javascript
代码运行次数:0
运行
复制
plt.barh(range(len(y_pos)), np.exp(x_pos[0]))

代码语言:javascript
代码运行次数:0
运行
复制
plt.barh(range(len(y_pos)), np.exp(x_pos[0].cpu().numpy()))
票数 5
EN

Stack Overflow用户

发布于 2021-05-03 18:19:13

因此,如果您在2021年来到这里,仍然有"TypeError:无法将CUDA张量转换为numpy。使用Tensor.cpu()首先复制张量以保存内存。

从这个站点尝试x.to("cpu").numpy()https://jbencook.com/pytorch-numpy-conversion/

所以像idxs = idxs.to("cpu").numpy().squeeze()这样的东西会起作用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57832423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档