pytorch数据迁移、转换

最近碰到很多数据在CPU和GPU之间传递和数据类型转换,做下记录


参考

【1】搞定pytorch中.detach(),detach_(),.data,.cpu(),.item()和numpy()等 - 知乎 (zhihu.com)

【2】(2条消息) Pytorch .numpy(), .item(), .detach(), .cpu(), .cuda(), .tensor(), .as_tensor(), Tensor(), .clone(),_Ordgod_new的博客-CSDN博客_.cpu() .cuda()


主要涉及到CPU和GPU之间数据迁移、Tensor和Array数据类型的转换

首先需要知道

  • Numpy中的所有操作是针对Numpy特有的变量类型Array
  • pytorch中的所有操作是针对pytorch特有的变量类型Tensor
  • Tensor和Array最大不同是:Tensor既可以存储在CPU上,也可以存储在GPU上,而Array只能存储在CPU上

所以涉及到如何相互传递和转换数据

tensor(CPU) >> tensor(GPU)

tensor.cuda()从CPU传递数据到GPU,默认使用第一个GPU

image-20221012102248123.png

tensor(GPU) >> tensor(CPU)

只需tensor.cpu()即可从GPU传递数据回CPU

image-20221012102335818.png

tensor(CPU) >> array(CPU)

直接tensor.numpy()即可从tensor类型转换为array类型数组

image-20221012102535338.png

tensor(GPU) >> array(CPU)

但如果tensor在GPU上,需要先传回CPU再进行数据类型转换

image-20221012102750930.png

补充:如果tensor本身还包含了梯度信息,需要先用.detach()剔除梯度信息,再转成numpy,例如建立了个net的神经网络,并处理得到输出out,这时out本身是带有梯度的

out = out.detach().cpu().numpy()

array(CPU) >> tensor(CPU)

image-20221012104825471.png

或者torch.from_array(array)

array(CPU) >> tensor(GPU)

在上一个基础上加上.cuda()

image-20221012104841866.png

补充:.clone()是直接复制一个tensor,并带有梯度,和原来的动态图仍链接在一起

最后修改:2022 年 10 月 14 日
如果觉得我的文章对你有用,请随意赞赏