您现在的位置是:首页 >技术教程 >Pytorch创建Tensor网站首页技术教程
Pytorch创建Tensor
目录
一、Pytorch创建张量的4种方法
Pytorch创建张量的4种方法主要有:torch.Tensor()、torch.tensor()、torch.as_tensor()、torch.from_numpy()。具体使用方法如下方代码。其中torch.Tensor()是类构造函数,其余三种为工厂函数。工厂函数是指接受参数输入并返回特定类型对象的函数,其允许更多的动态对象创建,有更多的配置参数。通常情况下更倾向于选择工厂函数。
import torch
import numpy as np
t = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(torch.Tensor(t)) # 类构造函数
print(torch.tensor(t)) # 工厂函数
print(torch.as_tensor(t)) # 工厂函数
print(torch.from_numpy(t)) # 工厂函数
输出结果如下:
tensor([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])
tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], dtype=torch.int32)
tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], dtype=torch.int32)
tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], dtype=torch.int32)
二、4种方法的区别
1、数据类型
import torch
import numpy as np
data = np.array([1,2,3])
t1 = torch.Tensor(data)
print(t1)
print(t1.dtype)
t2 = torch.tensor(data)
print(t2)
print(t2.dtype)
t3 = torch.as_tensor(data)
print(t3)
print(t3.dtype)
t4 = torch.from_numpy(data)
print(t4)
print(t4.dtype)
输出结果如下:
tensor([1., 2., 3.])
torch.float32
tensor([1, 2, 3], dtype=torch.int32)
torch.int32
tensor([1, 2, 3], dtype=torch.int32)
torch.int32
tensor([1, 2, 3], dtype=torch.int32)
torch.int32
可以看出,构造函数torch.Tensor()输出的数据类型与其它三种方法不同,其主要原因是:构造函数在构造一个张量时使用全局缺省值,而工厂函数通过输入数据的类型来推断输出数据的类型。我们可以使用如下代码查看全局缺省值的数据类型。
d = torch.get_default_dtype()
print(d)
输出结果为:
torch.float32
所以,构造函数torch.Tensor()输出的数据类型为torch.float32。而工厂函数可以显示指定数据类型,如下所示。
t = torch.tensor(np.array([1,2,3]), dtype=torch.float64)
print(t)
输出结果为:
tensor([1., 2., 3.], dtype=torch.float64)
2、数据内存分配方式
import torch
import numpy as np
data = np.array([1,2,3])
print(data)
t1 = torch.Tensor(data)
t2 = torch.tensor(data)
t3 = torch.as_tensor(data)
t4 = torch.from_numpy(data)
data[0] = 0
data[1] = 0
data[2] = 0
# t1 和 t2 输出的都是更改前的数组
print(t1)
print(t2)
# t3 和 t4 输出的都是更改后的数组
print(t3)
print(t4)
输出结果为:
[1 2 3]
tensor([1., 2., 3.])
tensor([1, 2, 3], dtype=torch.int32)
tensor([0, 0, 0], dtype=torch.int32)
tensor([0, 0, 0], dtype=torch.int32)
上述差异是由创建时分配内存的方式造成的:torch.Tensor()和torch.tensor()的方式是将数组中的元素值直接拷贝到张量中,改变data中的元素值并不会影响到t1和t2中的值;torch.as_tensor()和torch.from_numpy()的方式是与data数组共享数据。(可将t1和t2的方式看作"值传递";t3和t4的方式看作“地址传递”)。数据共享比数据拷贝更高效,更节省内存空间。
共享数据 | 拷贝数据 |
torch.as_tensor() | torch.tensor() |
torch.from_numpy() | torch.Tensor() |
三、最优的数据转换方法
1、数据拷贝方式的最优选择是 torch.tensor() (因为是工厂函数);
2、内存共享方式的最优选择是 torch.as_tensor() (因为torch.as_tensor可以接受任何python数据结构;而torch.from_numpy只接受numpy数组);
3、数据拷贝的方式更注重实现;而内存共享的方式更注重代码性能,日常使用时不注重性能的话选择torch.tensor()即可。
四、使用内存共享函数的注意事项
1、由于numpy.ndaaray对象分配在CPU上,所以如果使用GPU的话,torch.as_tensor函数必须把数据从CPU上拷到GPU上;
2.、as_tensor()对于python内置的数据结构,如列表,是无效的;
3、as_tensor的调用要求熟悉共享特征,以免对底层数据做不必要的更改,而影响到对象;
4、当as_tensor和numpy.ndarray有大量的相互往返的操作时,对性能的提升会有较大的影响。