Loading... # pytorch数据迁移、转换 最近碰到很多数据在CPU和GPU之间传递和数据类型转换,做下记录 --- *参考*: 【1】[搞定pytorch中.detach(),detach_(),.data,.cpu(),.item()和numpy()等 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/505445223) 【2】[(2条消息) Pytorch .numpy(), .item(), .detach(), .cpu(), .cuda(), .tensor(), .as_tensor(), Tensor(), .clone(),_Ordgod_new的博客-CSDN博客_.cpu() .cuda()](https://blog.csdn.net/weixin_41490373/article/details/114407305) --- 主要涉及到**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](http://xherlock.top/usr/uploads/2022/10/1633754482.png) #### tensor(GPU) >> tensor(CPU) 只需tensor.cpu()即可从GPU传递数据回CPU ![image-20221012102335818.png](http://xherlock.top/usr/uploads/2022/10/136809766.png) #### tensor(CPU) >> array(CPU) 直接tensor.numpy()即可从tensor类型转换为array类型数组 ![image-20221012102535338.png](http://xherlock.top/usr/uploads/2022/10/3163795364.png) #### tensor(GPU) >> array(CPU) 但如果tensor在GPU上,需要先传回CPU再进行数据类型转换 ![image-20221012102750930.png](http://xherlock.top/usr/uploads/2022/10/2742818347.png) 补充:如果tensor本身还包含了梯度信息,需要先用.detach()剔除梯度信息,再转成numpy,例如建立了个net的神经网络,并处理得到输出out,这时out本身是带有梯度的 ~~~python out = out.detach().cpu().numpy() ~~~ #### array(CPU) >> tensor(CPU) ![image-20221012104825471.png](http://xherlock.top/usr/uploads/2022/10/14832397.png) 或者torch.from_array(array) #### array(CPU) >> tensor(GPU) 在上一个基础上加上.cuda() ![image-20221012104841866.png](http://xherlock.top/usr/uploads/2022/10/551716318.png) 补充:.clone()是直接复制一个tensor,并带有梯度,和原来的动态图仍链接在一起 最后修改:2022 年 10 月 14 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏