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

时间:2018-08-18 19:06:14

标签: python pytorch

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

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

5 个答案:

答案 0 :(得分:4)

根据pytorch discussion的讨论 Torch.Tensor构造函数被重载以执行与Torch.tensor和Torch.empty相同的操作。有人认为这种重载会使代码混乱,因此将Torch.Tensorin分为torch.tensor和`torch.empty。

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

答案 1 :(得分:3)

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

调用torch.Tensor()时,将得到一个空的张量,而没有任何data

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

torch.tensor(data, dtype=None, device=None, requires_grad=False) → Tensor
     

使用data构造张量。


这也解释了为什么通过调用以下命令来创建没有torch.Tensor的{​​{1}}的空张量实例没问题的原因:

data

但另一方面:

tensor_without_data = torch.Tensor()

会导致错误:

tensor_without_data = torch.tensor()

但是一般来说,没有理由选择--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-12-ebc3ceaa76d2> in <module>() ----> 1 torch.tensor() TypeError: tensor() missing 1 required positional arguments: "data" 而不是torch.Tensor。另外torch.tensor缺少文档字符串。

使用torch.Tensor可以创建没有data的张量的类似行为,例如:{p>

torch.Tensor()

输出:

torch.tensor(())

答案 2 :(得分:2)

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

torch.tensor会自动推断dtype,而torch.Tensor 返回torch.FloatTensor。我建议坚持 torch.tensor,如果您愿意的话,它也有类似dtype的参数 更改类型。

答案 3 :(得分:1)

torch.Tensor是创建参数(例如在nn.Linearnn._ConvNd中)时常用的方法。

为什么?因为它非常快。它甚至比torch.empty()快一点。

import torch
torch.set_default_dtype(torch.float32) # default

%timeit torch.empty(1000,1000)
%timeit torch.Tensor(1000,1000)
%timeit torch.ones(1000,1000)
%timeit torch.tensor([[1]*1000]*1000)

出局:

68.4 µs ± 789 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
67.9 µs ± 349 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
1.26 ms ± 8.61 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
36.1 ms ± 610 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

torch.Tensor()and torch.empty()非常相似,并返回一个填充有未初始化数据的张量。

在技术上可行的情况下,为什么不初始化__init__中的参数?

这里是torch.Tensor内部的nn.Linear,用于创建weight参数:

self.weight = nn.Parameter(torch.Tensor(out_features, in_features))

我们不按设计初始化它。还有另一种reset_parameters()方法,因为在训练时可能需要再次“重置”参数,所以我们在reset_paremeters()方法的末尾调用__init__()

也许将来torch.empty()将替换torch.Tensor(),因为它们的作用相同。

reset_parameters()还有一个不错的选择,您可以创建自己的版本,并在需要时更改原始的初始化过程。

答案 4 :(得分:0)

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

例如,

tensor_arr = torch.tensor([[2,5,6],[9,7,6]])
tensor_arr

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

tensor_arr = torch.Tensor([[2,5,6],[9,7,6]])
tensor_arr

将打印:

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