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

问题描述:

        如题目所示,之所以报这个错呢主要还是tensor 和 numpy 的转换问题,为什么写这个题解,也是因为报错调试花了一点时间,参考了许多前辈的经验,这里做一个梳理,备查:

百度到的答案,有的对版本有一些操作,有的直接对源码进行了修改。

尝试1:

不知道问题究竟出现在何处时,我以为时没有对数据进行强制转换操作,所以报错,因此直接对 numpy 和 tensor 进行了转换。

data = data.numpy()

仍然会报同样的错误。

通过报错可以溯源到源码的位置,对源码进行修改, 将self.numpy() --> self.cpu().numpy():

TypeError: can‘t convert CUDA tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory..._第1张图片

改源码总感觉不太好,所以没采取这种方法。

尝试2:

最终通过一篇大佬的博客,清楚问题出在何处。

Pytorch学习(九)Pytorch中CPU和GPU的Tensor转换,Tensor和ndarray的转换及.cuda(non_blocking=True)的作用_TEn%的博客-CSDN博客_tensor转cuda

其实报错的提示已经比较清楚,但是一开始我并没有get到重点。

其实我们应该先做的是将tensor数据从GPU设备转到CPU设备。

CPU和GPU的Tensor之间的转换:

  • CPU转GPU: data.cuda()
  • GPU转CPU: data.cpu()
data = data.cpu().numpy()

别急,你以为这样就结束了吗,NO.

很可能会报错:

RuntimeError: Can't call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.

当计算中的数据类型为tensor时,想要获取其具体的数值,由于它带梯度值时,不能直接转为numpy格式。

data = data.cpu().detach().numpy()

以上。

你可能感兴趣的:(python,开发语言)