每天进步亿点点之20210226

在码代码时遇到一个问题,需将cuda.tensor格式的数据保存下来,我以为只要执行tensor.numpy()就可以,这是最too young too sample and naive的想法,有人可能以为只要加个cpu()就万事大吉,那我运行相应的代码来看下:
代码如下:

a = extract_result(x)[4].cpu().numpy()

出现如下报错信息:

    a = extract_result(x)[4].cpu().numpy()
RuntimeError: Can't call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.

正确的“芝士”是先将cuda.tensor转为cpu.tensor;再用detach函数将tensor从当前计算图中分离出来,但是仍指向原变量的存放位置,不同之处只是requires_grad为false,得到的这个tensor永远不需要计算其梯度,不具有grad。

即使之后重新将它的requires_grad置为true,它也不会具有梯度grad

这样我们就会继续使用这个新的tensor进行计算,后面当我们进行反向传播时,到该调用detach()的tensor就会停止,不能再继续向前进行传播,详细的用法请参考该博主博文,博文地址

所以,最终我的代码修改如下:

a = extract_result(x)[4].cpu()
aa = a.detach().numpy()

调试效果如下:
在这里插入图片描述

torch.as_tensor() 和 torch.from_numpy()在Pytorch使用过程中不可避免的要用Numpy中的数据结构去处理数据,但是在用cuda进行计算时变量必须转成tensor型。所以tensornumpy数据类型之间的转换就显得尤为重要了。当然这上面的例子仅是简单的应用,如果数据是cup中的还需.cpu()等。除此之外,还涉及到tensor中转换变量是否共享的问题,这就跟python变量的copy一样了,用的不好程序不会报错,但是逻辑会有问题。等我慢慢在这上面加吧。 torch.tensor 整数默认为 int64 即 LongTensor 小数默认为 float32 不过 一般对tensor 采用 tensor.data() 或者 tensor.detach( 环境:Ubuntu 20.04 +pytorchGPU版本一、GPU1、查看CPU是否可用2、查看CPU个数3、查看GPU的容量和名称4、清空程序占用的GPU资源5、查看显卡信息6、清除多余进程二、GPU和CPU1、GPU传入CPU1.1 另一种情况2、CPU传入GPU3、注意数据位置对应三、NumpyTensor(pytorch)1、Tensor转成Numpy2、Numpy转成Tensor3、Cuda转成Numpy 一、GPU 1、查看CPU是否可用 print (torch.cuda.is_avail RuntimeError: Expected object of type torch.cuda.FloatTensor but found type torch.FloatTensor for argument #4 'mat1' 意思是:如果想把CUDA tensor格式的数据改成numpy时,需要先将其转换成cpu float-tensor随后再转到numpy格式。 numpy不能读取CU... Pytorch的数据类型为各式各样的Tensor,Tensor可以理解为高维矩阵。与Numpy中的Array类似。Pytorch中的tensor又包括CPU上的数据类型和GPU上的数据类型,一般GPU上的Tensor是CPU上的Tensorcuda()函数得到。通过使用Type函数可以查看变量类型。一般系统默认是torch.FloatTensor类型。例如data = torch.Tensor(