torch.tensor和torch.Tensor有什么区别?

Jua*_*eni 13 python pytorch

从0.4.0版开始,可以使用torch.tensortorch.Tensor

有什么不同?提供这两种非常相似且令人困惑的替代方案的原因是什么?

blu*_*nox 9

在PyTorch中torch.Tensor是主要的张量类。因此,所有张量只是的实例torch.Tensor

当您打电话时,torch.Tensor()您将得到一个没有任何张量的空张量data

相反,torch.tensor是一个返回张量的函数。在文档中说:

torch.tensor(data, dtype=None, device=None, requires_grad=False) ? Tensor
Run Code Online (Sandbox Code Playgroud)

用构造张量data


这也也解释了为什么它是没有问题的创建一个空的张量情况下torch.Tensor没有data通过调用:

tensor_without_data = torch.Tensor()
Run Code Online (Sandbox Code Playgroud)

但另一方面:

tensor_without_data = torch.tensor()
Run Code Online (Sandbox Code Playgroud)

会导致错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-ebc3ceaa76d2> in <module>()
----> 1 torch.tensor()

TypeError: tensor() missing 1 required positional arguments: "data"
Run Code Online (Sandbox Code Playgroud)

但总的来说,没有理由去选择torch.Tensortorch.tensor。也torch.Tensor缺少文档字符串。

创建不data具有with 的张量的类似行为torch.Tensor()

torch.tensor(())
Run Code Online (Sandbox Code Playgroud)

输出:

tensor([])
Run Code Online (Sandbox Code Playgroud)


小智 6

根据pytorch上的讨论,  torch.Tensor  构造函数被重载以与torch.tensor 和  进行相同的操作  torch.empty。人们认为这种重载会使代码混乱,因此将其拆分  torch.Tensor为  torch.tensor 和torch.empty

因此,是的,在某种程度上,它的  torch.tensor工作方式类似于torch.Tensor(当您传递数据时)。不,这两个都不应该比另一个更有效。这只是在  torch.empty 和  torch.tensor 有一个更好的API比 torch.Tensor 构造。


fel*_*xmd 6

除了上述答案之外,我注意到torch.Tensor(<data>)将使用默认数据类型(如 中定义torch.get_default_dtype())初始化张量。torch.tensor(<data>),另一方面,将从数据推断数据类型。

例如,

tensor_arr = torch.tensor([[2,5,6],[9,7,6]])
tensor_arr
Run Code Online (Sandbox Code Playgroud)

将打印: tensor([[2, 5, 6], [9, 7, 6]])

tensor_arr = torch.Tensor([[2,5,6],[9,7,6]])
tensor_arr
Run Code Online (Sandbox Code Playgroud)

将打印:

tensor([[2., 5., 6.], [9., 7., 6.]]) 因为默认数据类型是 float32。


Pro*_*rox 5

https://discuss.pytorch.org/t/difference- Between-torch-tensor-and-torch-tensor/30786/2

torch.tensor 自动推断数据类型,而 torch.Tensor 返回 torch.FloatTensor。如果您想更改类型,我建议坚持使用 torch.tensor,它也有 dtype 等参数。