![](/img/trans.png)
[英]Is there a difference between torch.IntTensor and torch.Tensor
[英]What is the difference between torch.tensor and torch.Tensor?
從 0.4.0 版本開始,可以使用torch.tensor
和torch.Tensor
有什么區別? 提供這兩個非常相似且令人困惑的替代方案的原因是什么?
在 PyTorch 中, 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()
但另一方面:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-12-ebc3ceaa76d2> in <module>()
----> 1 torch.tensor()
TypeError: tensor() missing 1 required positional arguments: "data"
會導致錯誤:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-12-ebc3ceaa76d2> in <module>() ----> 1 torch.tensor() TypeError: tensor() missing 1 required positional arguments: "data"
可以使用以下方法實現創建沒有data
的張量的類似行為,例如: torch.Tensor()
:
torch.tensor(())
輸出:
tensor([])
根據關於pytorch 的討論, torch.Tensor
構造函數被重載以與torch.tensor
和torch.empty
做同樣的事情。 人們認為這種重載會使代碼混亂,因此將torch.Tensor
拆分為torch.tensor
和torch.empty
。
所以是的,在某種程度上, torch.tensor
工作方式類似於 torch.Tensor(當你傳入數據時)。 不,兩者都不應該比另一個更有效率。 只是torch.empty
和torch.tensor
有一個比torch.Tensor
構造函數更好的 API。
除了上述答案之外,我注意到torch.Tensor(<data>)
將使用默認數據類型(如torch.get_default_dtype()
定義torch.Tensor(<data>)
初始化張量。 另一方面, 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。
https://discuss.pytorch.org/t/difference-between-torch-tensor-and-torch-tensor/30786/2
torch.tensor 自動推斷 dtype,而 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)
torch.Tensor()
和and torch.empty()
非常相似,並返回一個充滿未初始化數據的張量。
為什么我們不在__init__
初始化參數,而技術上這是可能的?
這是torch.Tensor
中實際使用的nn.Linear
來創建weight
參數:
self.weight = nn.Parameter(torch.Tensor(out_features, in_features))
我們不會根據設計對其進行初始化。 還有另一個reset_parameters()
方法,因為在訓練時它可能需要再次“重置”參數,我們在__init__()
方法的末尾調用reset_paremeters()
。
也許在未來torch.empty()
將取代torch.Tensor()
因為它們在效果上是相同的。
reset_parameters()
也有一個不錯的選擇,您可以創建自己的版本並在需要時更改原始初始化過程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.