Pytorch创建张量与使用注意事项

目录

一、Pytorch创建张量的4种方法

二、4种方法的区别

1、数据类型

2、数据内存分配方式

三、最优的数据转换方法

四、使用内存共享函数的注意事项


一、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有大量的相互往返的操作时,对性能的提升会有较大的影响。

猜你喜欢

转载自blog.csdn.net/ting_qifengl/article/details/130577861
今日推荐