PyTorch中torch.tensor与torch.Tensor的区别详解
在PyTorch中,有两种不同的Tensor类型,它们分别是torch.tensor
与torch.Tensor
。这两种Tensor类型总体而言非常相似,用法也十分相似,但在细节与某些用法上有些许差别。本文将对这两种Tensor进行详细的区别与说明,帮助大家更好的理解和使用它们。
1. torch.tensor
与torch.Tensor
的定义与用法
1.1 定义
首先我们来看这两种Tensor的定义:
torch.tensor
: torch.tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False)torch.Tensor
: Class torch.Tensor([data, dtype, device, requires_grad])
我们可以看到,torch.tensor
是一个函数,它接收一些数据,并返回一个对应的tensor;而torch.Tensor
则是一个类(Class),返回一个新的Tensor实例,实例的属性和方法与普通的Python类实例一样。
1.2 用法
我们来看看这两种Tensor的用法:
import torch
a = torch.Tensor(3, 5) # 创建一个3x5的未初始化的torch.Tensor
b = torch.tensor([[1, 2], [3, 4]]) # 创建一个2x2的tensor,并从Python List中初始化
从上面的例子中我们可以看到:使用torch.Tensor
创建的Tensor可以设定其形状,但tensor内部的数据并不会被初始化,需要手动填充数据;而使用torch.tensor
创建的Tensor则可以直接从Python List等数据类型中自动初始化。
除了上述例子中的初始化方式,还可以通过其他方式初始化Tensor,例如:
x = torch.randn((3,3), requires_grad=True) # 从随机分布初始化
y = torch.zeros((2,2)) # 全0的Tensor
z = torch.ones((4,4)) # 全1的Tensor
不管是哪种初始化方式,torch.tensor
和torch.Tensor
的用法都非常相似,每种方式都拥有两种不同的创建方式。
2. torch.tensor
与torch.Tensor
的区别
在大多数情况下,torch.tensor
和torch.Tensor
的区别并不大,它们可以互换使用。然而,在一些细节和某些特殊场景下,它们还是有一些差别的。以下将列举一些这样的情况:
2.1 首字母大小写
首先,我们可以看到torch.Tensor
的首字母是大写的,而torch.tensor
的首字母是小写的。这并不仅仅是大小写的不同,同时它也意味着这两种Tensor在Python中的本质区别:
torch.Tensor
是一个Python类,而torch.tensor
仅是一个函数的名称。torch.tensor
函数返回的是torch.Tensor
的实例。
因此,在创建Tensor时需要注意使用大写和小写方式。
2.2 多维度数据
在多维度Tensor的初始化中,两种Tensor的行为有些差异。
例如,使用torch.tensor
初始化时,你需要保证每一个元素都是相同的数据类型。如果你提供了不同类型的数据,torch.tensor
会强制把它们转换为相同类型的数据:
x = torch.tensor([[1, 2], [3.0, 4]]) # 注意这里是浮点数3.0而不是整数3
在上面的例子中,原本的输入应该是一个int Tensor,但因为输入中混入了一个浮点数,在转换时Tensor会自动将整个Tensor转换为浮点类型的Tensor。
而对于torch.Tensor
来说,它可以接受并分别处理不同类型的数据:
y = torch.Tensor([[1, 2], [3.0, 4]]) # 同样的输入,但不会报错
在Tensor初始化时对于数据类型的处理,在两种Tensor中是不同的,这也是两种Tensor的差异之一。
2.3 其他差异
除了上述两种场景外,两种Tensor之间的差异并不多,值得注意的是,它们拥有相同的属性和方法,例如对Tensor进行形变的方法:
x = torch.rand(5, 4)
y = torch.Tensor.view(x, 1, 20)
在上面的代码中,我们使用torch.Tensor.view
来对一个Tensor进行形变操作。需要注意的是,在这个view
方法中, 形参x
,1
和20
均为torch.Tensor
的实例,也就是说tensor.view
调用的是torch.Tensor
实例的方法。
3. 示例说明
接下来,我们通过两个Tensor初始化的示例来展示torch.tensor
和torch.Tensor
之间的区别。
3.1 示例1
import torch
import numpy as np
a = np.ones(3)
b = torch.Tensor(a)
c = torch.tensor(a)
print(a, "\n", b, "\n", c)
在上面的代码中,我们创建了一个长度为3、元素全为1的numpy数组$a$,然后分别使用torch.Tensor
和torch.tensor
来初始化Tensor $b$ 和 $c$。输出结果为:
[1. 1. 1.]
tensor([1., 1., 1.])
tensor([1., 1., 1.], dtype=torch.float64)
可以看到,$b$ 和 $c$ 的数据完全相同,但是 $c$ 的数据类型为浮点类型(dtype=torch.float64)。也就是说,在使用torch.tensor
时,输入数组的数据类型如果不为浮点类型,则会自动转换为浮点类型。而使用torch.Tensor
初始化时,并没有进行类似的操作。
3.2 示例2
import torch
import numpy as np
a = np.ones(3)
b = torch.Tensor(a)
c = torch.tensor(a)
a[0] = 2
print(a, "\n", b, "\n", c)
在上面的代码中,我们创建了一个长度为3、元素全为1的numpy数组$a$,然后分别使用torch.Tensor
和torch.tensor
来初始化Tensor $b$ 和 $c$。接下来,我们修改了$a$的第一个元素为2。输出结果为:
[2. 1. 1.]
tensor([1., 1., 1.])
tensor([1., 1., 1.], dtype=torch.float64)
可以看到,在修改$a$的元素后,仅有使用torch.Tensor
初始化的Tensor $b$ 的数据没有发生变化,而使用torch.tensor
初始化的Tensor $c$ 的数据仍然与原始数组$a$相同。
4. 总结
在本文中,我们介绍了PyTorch中torch.tensor
和torch.Tensor
这两种Tensor类型的定义和用法,并对其差异进行了详细的讲解。同时,我们还给出了两个示例进行了示范,在使用这两种Tensor类型时需要特别注意两种Tensor在多维度初始化和数据类型处理上的差异。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyTorch中torch.tensor与torch.Tensor的区别详解 - Python技术站