将cuda.tensor转为numpy

本文介绍了如何将CUDA上的tensor转换为numpy数组,强调了在转换过程中需要先通过CPU迁移并detach()以防止梯度计算的问题。通过示例代码展示了正确的转换步骤,并解释了detach()的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每天进步亿点点之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()

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值