如何将带有梯度的 PyTorch 张量转换为 NumPy 数组?


要将具有梯度的 Torch 张量转换为 NumPy 数组,首先我们必须将该张量从当前计算图中分离出来。为此,我们使用 Tensor.detach() 操作。此操作将张量从当前计算图中分离出来。现在,我们无法计算相对于此张量的梯度。在 detach() 操作之后,我们使用 .numpy() 方法将其转换为 NumPy 数组。

如果在 GPU 上定义了具有 **requires_grad=True** 的张量,则要将此张量转换为 NumPy 数组,我们必须执行一个额外的步骤。首先,我们必须将张量移动到 CPU,然后执行 **Tensor.detach()** 操作,最后使用 **.numpy()** 方法将其转换为 NumPy 数组。

步骤

  • 导入所需的库。所需的库是 **torch**。

  • 在 CPU 上创建具有梯度的张量。如果在 GPU 上已经定义了具有梯度的张量,则必须将其移动到 CPU。

  • 将张量从当前计算图中分离。您可以使用 **.detach()** 执行此操作。在 **detach()** 操作之后,张量将没有梯度。

  • 接下来,将没有梯度的张量转换为 NumPy 数组。您可以使用 **.numpy()** 将其转换为 NumPy 数组。

  • 打印 NumPy 数组。

示例 1

# import torch library
import torch

# define a tensor with requires gradient true
x = torch.tensor([1.,2.], requires_grad = True)
print("x:", x)

# x.numpy()--> error
x = x.detach().numpy()
print("x:", x)
print("type of x:", type(x))

输出

x: tensor([1., 2.], requires_grad=True)
x: [1. 2.]
type of x: <class 'numpy.ndarray'>

示例 2

import torch

# define device
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

# define tensors with gradients on gpu
x = torch.tensor([1.,2.], requires_grad = True, device = device)
y = torch.tensor([1.,2., 3.], requires_grad = True, device = device)

print("x:", x)
print("y:", y)

# first move the tensor from gpu to cpu
x = x.to('cpu') # or x = x.cpu()

# then detach the requires_grad
x = x.detach()

# and then convert to numpy
x = x.numpy()
print("x:",x)
print("type of x:", type(x))

y = y.cpu().detach().numpy()
print("y:", y)
print("type of y:", type(y))

输出 1 - 如果 GPU 不可用

x: tensor([1., 2.], requires_grad=True)
y: tensor([1., 2., 3.], requires_grad=True)
x: [1. 2.]
type of x: <class 'numpy.ndarray'>
y: [1. 2. 3.]
type of y: <class 'numpy.ndarray'>

输出 2 - 如果 GPU 可用

x: tensor([1., 2.], device='cuda:0', requires_grad=True)
y: tensor([1., 2., 3.], device='cuda:0', requires_grad=True)
x: [1. 2.]
type of x: <class 'numpy.ndarray'>
y: [1. 2. 3.]
type of y: <class 'numpy.ndarray'>

更新于: 2022年1月6日

6K+ 浏览量

启动你的 职业生涯

通过完成课程获得认证

开始学习
广告