簡體   English   中英

torch.tensor 和 torch.Tensor 有什么區別?

[英]What is the difference between torch.tensor and torch.Tensor?

從 0.4.0 版本開始,可以使用torch.tensortorch.Tensor

有什么區別? 提供這兩個非常相似且令人困惑的替代方案的原因是什么?

在 PyTorch 中, torch.Tensor是主要的張量類。 所以所有的張量都只是torch.Tensor實例。

當您調用torch.Tensor()您將獲得一個沒有任何data的空張量。

相比之下, torch.tensor是一個返回張量的函數。 文檔中它說:

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

data構造一個張量。


這也解釋了為什么通過調用創建一個沒有 `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"

會導致錯誤:

 --------------------------------------------------------------------------- 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([])

根據關於pytorch 的討論, torch.Tensor構造函數被重載以與torch.tensortorch.empty做同樣的事情。 人們認為這種重載會使代碼混亂,因此將torch.Tensor拆分為torch.tensortorch.empty

所以是的,在某種程度上, torch.tensor工作方式類似於 torch.Tensor(當你傳入數據時)。 不,兩者都不應該比另一個更有效率。 只是torch.emptytorch.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.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()方法,因為在訓練時它可能需要再次“重置”參數,我們在__init__()方法的末尾調用reset_paremeters()

也許在未來torch.empty()將取代torch.Tensor()因為它們在效果上是相同的。

reset_parameters()也有一個不錯的選擇,您可以創建自己的版本並在需要時更改原始初始化過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM