千家信息网

Numpy与Pytorch互转时需要注意什么问题

发表于:2024-10-20 作者:千家信息网编辑
千家信息网最后更新 2024年10月20日,这篇文章主要为大家展示了"Numpy与Pytorch互转时需要注意什么问题",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Numpy与Pytorch互转时需
千家信息网最后更新 2024年10月20日Numpy与Pytorch互转时需要注意什么问题

这篇文章主要为大家展示了"Numpy与Pytorch互转时需要注意什么问题",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Numpy与Pytorch互转时需要注意什么问题"这篇文章吧。

1.1、numpy --> torch   

使用 torch.from_numpy() 转换,需要注意,两者共享内存。例子如下:

import torchimport numpy as npa = np.array([1,2,3])b = torch.from_numpy(a)np.add(a, 1, out=a)print('转换后a', a)print('转换后b', b)# 显示转换后a [2 3 4]转换后b tensor([2, 3, 4], dtype=torch.int32)

1.2、torch--> numpy   

使用 .numpy() 转换,同样,两者共享内存。例子如下:

import torchimport numpy as npa = torch.zeros((2, 3), dtype=torch.float)c = a.numpy()np.add(c, 1, out=c)print('a:', a)print('c:', c)# 结果a: tensor([[1., 1., 1.],           [1., 1., 1.]])c: [[1. 1. 1.]  [1. 1. 1.]]

需要注意的是,如果将程序中的 np.add(c, 1, out=c) 改成 c = c + 1 会发现两者貌似不共享内存了,其实不然,原因是后者相当于改变了 c 的存储地址。可以使用 id(c) 发现c的内存位置变了。

补充:pytorch中tensor数据和numpy数据转换中注意的一个问题

在pytorch中,把numpy.array数据转换到张量tensor数据的常用函数是torch.from_numpy(array)或者torch.Tensor(array),第一种函数更常用。

下面通过代码看一下区别:

import numpy as npimport torcha=np.arange(6,dtype=int).reshape(2,3)b=torch.from_numpy(a)c=torch.Tensor(a)a[0][0]=10print(a,'',b,'',c)[[10  1  2] [ 3  4  5]]  tensor([[10,  1,  2],        [ 3,  4,  5]], dtype=torch.int32)  tensor([[0., 1., 2.],        [3., 4., 5.]])c[0][0]=10print(a,'',b,'',c)[[10  1  2] [ 3  4  5]]  tensor([[10,  1,  2],        [ 3,  4,  5]], dtype=torch.int32)  tensor([[10.,  1.,  2.],        [ 3.,  4.,  5.]])print(b.type())torch.IntTensorprint(c.type())torch.FloatTensor

可以看出修改数组a的元素值,张量b的元素值也改变了,但是张量c却不变。修改张量c的元素值,数组a和张量b的元素值都不变。

这说明torch.from_numpy(array)是做数组的浅拷贝,torch.Tensor(array)是做数组的深拷贝。

以上是"Numpy与Pytorch互转时需要注意什么问题"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0