问题描述:
如题目所示,之所以报这个错呢主要还是tensor 和 numpy 的转换问题,为什么写这个题解,也是因为报错调试花了一点时间,参考了许多前辈的经验,这里做一个梳理,备查:
百度到的答案,有的对版本有一些操作,有的直接对源码进行了修改。
尝试1:
不知道问题究竟出现在何处时,我以为时没有对数据进行强制转换操作,所以报错,因此直接对 numpy 和 tensor 进行了转换。
data = data.numpy()
仍然会报同样的错误。
通过报错可以溯源到源码的位置,对源码进行修改, 将self.numpy() --> self.cpu().numpy():
改源码总感觉不太好,所以没采取这种方法。
尝试2:
最终通过一篇大佬的博客,清楚问题出在何处。
Pytorch学习(九)Pytorch中CPU和GPU的Tensor转换,Tensor和ndarray的转换及.cuda(non_blocking=True)的作用_TEn%的博客-CSDN博客_tensor转cuda
其实报错的提示已经比较清楚,但是一开始我并没有get到重点。
其实我们应该先做的是将tensor数据从GPU设备转到CPU设备。
CPU和GPU的Tensor之间的转换:
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()
以上。