从0.4.0版开始,可以使用torch.tensor
和torch.Tensor
有什么区别?提供这两种非常相似且令人困惑的替代方案的原因是什么?
答案 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.Linear
,nn._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。