pytorch数据迁移、转换
最近碰到很多数据在CPU和GPU之间传递和数据类型转换,做下记录
参考:
【1】搞定pytorch中.detach(),detach_(),.data,.cpu(),.item()和numpy()等 - 知乎 (zhihu.com)
主要涉及到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
tensor(GPU) >> tensor(CPU)
只需tensor.cpu()即可从GPU传递数据回CPU
tensor(CPU) >> array(CPU)
直接tensor.numpy()即可从tensor类型转换为array类型数组
tensor(GPU) >> array(CPU)
但如果tensor在GPU上,需要先传回CPU再进行数据类型转换
补充:如果tensor本身还包含了梯度信息,需要先用.detach()剔除梯度信息,再转成numpy,例如建立了个net的神经网络,并处理得到输出out,这时out本身是带有梯度的
out = out.detach().cpu().numpy()
array(CPU) >> tensor(CPU)
或者torch.from_array(array)
array(CPU) >> tensor(GPU)
在上一个基础上加上.cuda()
补充:.clone()是直接复制一个tensor,并带有梯度,和原来的动态图仍链接在一起