使用 Cuda 将 Pytorch 张量转换为 Numpy 数组

Noa*_*kel 6 python numpy pytorch

我想使用 cuda 将 Pytorch 张量转换为 numpy 数组:

这是不使用 cuda 时的代码行:

A = self.tensor.weight.data.numpy()

如何使用 cuda 执行相同的操作?根据这个:https : //discuss.pytorch.org/t/how-to-transform-variable-into-numpy/104/3 似乎:

A = self.tensor.weight.data.cpu().numpy()

Mat*_*haq 6

some_tensor.detach().cpu().numpy()
Run Code Online (Sandbox Code Playgroud)
  • .detach()与后向图分离以避免复制梯度。
  • .cpu()将数据移至CPU。
  • .numpy()将 转换torch.Tensornp.ndarray


Uma*_*pta 5

如果张量为gpucuda,则将张量复制到cpu并使用以下方法将其转换为 numpy 数组:

tensor.data.cpu().numpy()
Run Code Online (Sandbox Code Playgroud)

如果张量已经打开,cpu你可以这样做tensor.data.numpy()。但是,您也可以这样做 tensor.data.cpu().numpy()。如果张量已经打开cpu,则该.cpu()操作将不起作用。这可以用作与设备无关的方式将张量转换为 numpy 数组。


Azi*_*bro 5

我相信你也必须使用.detach()。我不得不在使用 CUDA 和 GPU 的 Colab 上将我的 Tensor 转换为一个 numpy 数组。我是这样做的:

embedding = learn.model.u_weight

embedding_list = list(range(0, 64382))

input = torch.cuda.LongTensor(embedding_list)
tensor_array = embedding(input)
# the output of the line bwlow is a numpy array
tensor_array.cpu().detach().numpy() 
Run Code Online (Sandbox Code Playgroud)

  • 如果“Tensor”具有关联的梯度,则只需调用“detach”。当需要“detach”时,您需要在“cpu”之前调用“detach”。否则,PyTorch 将在 CPU 上创建与张量相关的梯度,然后在调用“numpy”时立即销毁它们。首先调用“detach”可以消除这个多余的步骤。有关更多信息,请参阅:https://discuss.pytorch.org/t/should-it-really-be-necessary-to-do-var-detach-cpu-numpy/35489/8?u=zayd (9认同)