每天进步亿点点之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()
调试效果如下: