Pytorch中的 .detach().cpu().numpy()

发布于:2024-06-25 ⋅ 阅读:(133) ⋅ 点赞:(0)

用法

在 PyTorch 中,.detach().cpu().numpy() 是一个常见的链式方法调用,主要用于将一个在计算图中(即由 autograd 跟踪的)张量转换为 NumPy 数组。

.detach():

  1. detach 方法用于从计算图中分离出一个张量。也就是说,返回一个新的张量,该张量与原始张量共享相同的数据,但不会再计算梯度。
  2. 这在需要将张量用于不希望追踪计算图的操作时非常有用,比如在推理过程中或在计算损失之外进行一些操作时。

.cpu():

  1. 将张量移动到 CPU 内存中。如果张量已经在 CPU 上,则该操作不会有任何影响;如果张量在 GPU 上,则会将其数据从 GPU 内存传输到 CPU 内存。
  2. 这是因为 NumPy 仅能处理 CPU 内存中的数据,而不能直接处理 GPU 上的数据。

.numpy():

  1. 将 PyTorch 张量转换为 NumPy 数组。
  2. PyTorch 张量和 NumPy 数组之间共享内存,因此转换是一个轻量级的操作,不会复制数据。

应用场景

  • 模型推理和评估:在推理过程中将张量转换为 NumPy 数组,以便使用 NumPy 进行后续处理。
  • 数据可视化:将张量转换为 NumPy 数组,以便使用 Matplotlib 等库进行绘图。
  • 与其他库的兼容性:一些库(如 SciPy、Scikit-learn)需要 NumPy 数组作为输入,通过这种方法可以轻松转换数据格式。

这种方法使得在使用 PyTorch 进行深度学习时,可以方便地在张量和 NumPy 数组之间进行转换,从而利用两者的优势。


例子

def train(epoch):

    RMSE = 0
    cost_all = 0

    for step, (batch_x, batch_mask_x, batch_y) in enumerate(loader):

        batch_x = batch_x.type(torch.FloatTensor).cuda()
        batch_mask_x = batch_mask_x.type(torch.FloatTensor).cuda()

        decoder = rec(batch_x)   # 前向传播
        loss, rmse = rec.loss(decoder=decoder, input=batch_x, optimizer=optimer, mask_input=batch_mask_x)   # 计算损失
        optimer.zero_grad()   # 清零梯度
        loss.backward()    # 反向传播计算梯度
        optimer.step()    # 更新参数
        cost_all += loss
        RMSE += rmse

    # detach()
    RMSE = np.sqrt(RMSE.detach().cpu().numpy() / (train_mask_r == 1).sum())
    print('epoch:', epoch, 'train RMSE:', RMSE)