torch.tensor
和torch.Tensor
之间有什么区别?为什么提供这两个非常相似且容易混淆的替代方式的原因是什么?torch.Tensor
是主要的张量类。因此,所有张量都只是torch.Tensor
的实例。torch.Tensor()
将返回一个没有data
的空张量。相比之下,torch.tensor
是一个返回张量的函数。在文档中说:torch.tensor(data, dtype=None, device=None, requires_grad=False) → Tensor
使用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
的张量的行为,类似于使用 torch.Tensor()
可以通过以下方式实现:
torch.tensor(())
输出:
tensor([])
torch.Tensor()
创建一个使用 torch.get_default_dtype()
定义的默认数据类型的tensor。torch.tensor()
将从数据推断出数据类型。>>> torch.Tensor([1, 2, 3]).dtype
torch.float32
>>> torch.tensor([1, 2, 3]).dtype
torch.int64
torch.Tensor
构造函数被重载为与torch.tensor
和torch.empty
执行相同的操作。认为这种重载会使代码混乱,因此将torch.Tensor
分成了torch.tensor
和torch.empty
。torch.tensor
的工作方式类似于torch.Tensor。不,两者都不应比另一个更有效。只是torch.empty
和torch.tensor
具有比torch.Tensor
构造函数更好的API。https://discuss.pytorch.org/t/difference-between-torch-tensor-and-torch-tensor/30786/2
torch.tensor会自动推断数据类型,而torch.Tensor则返回torch.FloatTensor类型。如果您需要更改数据类型,建议使用torch.tensor,并使用dtype等参数进行设置。
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)
self.weight = nn.Parameter(torch.Tensor(out_features, in_features))
[[1]*1000]*1000
的调用,这很可能是缓慢且占据运行时间的主导因素。 - Turakarpy -m timeit "a = [[1]*1000]*1000" 50000 次循环,5 次中的最佳结果:每次循环 5.11 微秒
并且将其作为设置的一部分,py -m timeit -s "import torch; a = [[1]*1000]*1000" "torch.tensor(a)" 10 次循环,5 次中的最佳结果:每次循环 31.7 毫秒
- pu239