Pytorch 張量屬性

2020-09-16 14:47 更新

原文:PyTorch 張量屬性

每個torch.Tensor具有 torch.dtype , torch.devicetorch.layout 。

torch類型

class torch.dtype?

torch.dtype 是表示 torch.Tensor 的數(shù)據(jù)類型的對象。 PyTorch 具有九種不同的數(shù)據(jù)類型:

|

數(shù)據(jù)類型

|

dtype

|

張量類型

| | --- | --- | --- | | 32 位浮點 | torch.float32torch.float | torch.*.FloatTensor | | 64 位浮點 | torch.float64torch.double | torch.*.DoubleTensor | | 16 位浮點 | torch.float16torch.half | torch.*.HalfTensor | | 8 位整數(shù)(無符號) | torch.uint8 | torch.*.ByteTensor | | 8 位整數(shù)(有符號) | torch.int8 | torch.*.CharTensor | | 16 位整數(shù)(有符號) | torch.int16torch.short | torch.*.ShortTensor | | 32 位整數(shù)(有符號) | torch.int32torch.int | torch.*.IntTensor | | 64 位整數(shù)(有符號) | torch.int64torch.long | torch.*.LongTensor | | 布爾型 | torch.bool | torch.*.BoolTensor |

要確定 torch.dtype 是否為浮點數(shù)據(jù)類型,可以使用屬性 is_floating_point ,如果數(shù)據(jù)類型為浮點數(shù)據(jù),則返回True。 類型。

當(dāng)算術(shù)運算的輸入 dtypes(<cite>加</cite>,<cite>子</cite>, <cite>div</cite> , <cite>mul</cite> )不同時,我們通過尋找最小值來促進(jìn) 滿足以下規(guī)則的 dtype:

  • 如果標(biāo)量操作數(shù)的類型比張量操作數(shù)(浮動>整數(shù)>布爾值)具有更高的類別,則我們將其提升為具有足夠大小的類型,以容納該類別的所有標(biāo)量操作數(shù)。
  • 如果零維張量操作數(shù)的類別高于維操作數(shù)的類別,我們將提升為具有足夠大小和類別的類型,以容納該類別的所有零維張量操作數(shù)。
  • 如果沒有更高類別的零維操作數(shù),我們將提升為具有足夠大小和類別的類型以容納所有尺寸的操作數(shù)。

浮點標(biāo)量操作數(shù)的 dtype 為 <cite>torch.get_default_dtype()</cite>,整數(shù)非布爾標(biāo)量操作數(shù)的 dtype 為 <cite>torch.int64</cite> 。 與 numpy 不同,在確定操作數(shù)的最小 <cite>dtypes</cite> 時,我們不檢查值。 尚不支持量化和復(fù)雜類型。

促銷示例:

>>> float_tensor = torch.ones(1, dtype=torch.float)
>>> double_tensor = torch.ones(1, dtype=torch.double)
>>> int_tensor = torch.ones(1, dtype=torch.int)
>>> long_tensor = torch.ones(1, dtype=torch.long)
>>> uint_tensor = torch.ones(1, dtype=torch.uint8)
>>> double_tensor = torch.ones(1, dtype=torch.double)
>>> bool_tensor = torch.ones(1, dtype=torch.bool)
## zero-dim tensors
>>> long_zerodim = torch.tensor(1, dtype=torch.long)
>>> int_zerodim = torch.tensor(1, dtype=torch.int)


>>> torch.add(5, 5).dtype
torch.int64
## 5 is an int64, but does not have higher category than int_tensor so is not considered.
>>> (int_tensor + 5).dtype
torch.int32
>>> (int_tensor + long_zerodim).dtype
torch.int32
>>> (long_tensor + int_tensor).dtype
torch.int64
>>> (bool_tensor + long_tensor).dtype
torch.int64
>>> (bool_tensor + uint_tensor).dtype
torch.uint8
>>> (float_tensor + double_tensor).dtype
torch.float64
>>> (bool_tensor + int_tensor).dtype
torch.int32
## Since long is a different kind than float, result dtype only needs to be large enough
## to hold the float.
>>> torch.add(long_tensor, float_tensor).dtype
torch.float32
When the output tensor of an arithmetic operation is specified, we allow casting to its dtype except that:

  • 積分輸出張量不能接受浮點張量。
  • 布爾輸出張量不能接受非布爾張量。

投放示例:

## allowed:
>>> float_tensor *= double_tensor
>>> float_tensor *= int_tensor
>>> float_tensor *= uint_tensor
>>> float_tensor *= bool_tensor
>>> float_tensor *= double_tensor
>>> int_tensor *= long_tensor
>>> int_tensor *= uint_tensor
>>> uint_tensor *= int_tensor


## disallowed (RuntimeError: result type can't be cast to the desired output type):
>>> int_tensor *= float_tensor
>>> bool_tensor *= int_tensor
>>> bool_tensor *= uint_tensor

torch設(shè)備

class torch.device?

torch.device 是表示在其上或?qū)⒁峙?torch.Tensor 的設(shè)備的對象。

torch.device 包含設(shè)備類型('cpu''cuda')和該設(shè)備類型的可選設(shè)備序號。 如果不存在設(shè)備序號,則即使調(diào)用 torch.cuda.set_device() ,該對象也始終代表設(shè)備類型的當(dāng)前設(shè)備。 例如,用設(shè)備'cuda'構(gòu)造的 torch.Tensor 等效于'cuda:X',其中 X 是 torch.cuda.current_device() 的結(jié)果。

可以通過 Tensor.device 屬性訪問 torch.Tensor 的設(shè)備。

torch.device 可以通過字符串或通過字符串和設(shè)備序號構(gòu)造

通過字符串:

>>> torch.device('cuda:0')
device(type='cuda', index=0)


>>> torch.device('cpu')
device(type='cpu')


>>> torch.device('cuda')  # current cuda device
device(type='cuda')

通過字符串和設(shè)備序數(shù):

>>> torch.device('cuda', 0)
device(type='cuda', index=0)


>>> torch.device('cpu', 0)
device(type='cpu', index=0)

注意

函數(shù)中的 torch.device 參數(shù)通??梢杂米址鎿Q。 這樣可以快速編寫代碼原型。

>>> # Example of a function that takes in a torch.device
>>> cuda1 = torch.device('cuda:1')
>>> torch.randn((2,3), device=cuda1)
>>> # You can substitute the torch.device with a string
>>> torch.randn((2,3), device='cuda:1')

Note

出于遺留原因,可以通過單個設(shè)備序號(被視為 cuda 設(shè)備)構(gòu)造設(shè)備。 這與 Tensor.get_device() 匹配,后者為 cuda 張量返回序數(shù),而 cpu 張量不支持此序數(shù)。

>>> torch.device(1)
device(type='cuda', index=1)

Note

使用設(shè)備的方法通常會接受(正確格式化的)字符串或(舊式)整數(shù)設(shè)備序數(shù),即以下所有等效方法:

>>> torch.randn((2,3), device=torch.device('cuda:1'))
>>> torch.randn((2,3), device='cuda:1')
>>> torch.randn((2,3), device=1)  # legacy

torch布局

class torch.layout?

torch.layout 是表示 torch.Tensor 的內(nèi)存布局的對象。 目前,我們支持torch.strided(密集張量),并為torch.sparse_coo(稀疏 COO 張量)提供實驗性支持。

torch.strided代表密集的張量,是最常用的內(nèi)存布局。 每個跨步張量都有一個關(guān)聯(lián)的torch.Storage,它保存其數(shù)據(jù)。 這些張量提供了存儲的多維跨度視圖。 步幅是一個整數(shù)列表:第 k 個步幅表示在張量的第 k 個維度中從一個元素到下一個元素所需的內(nèi)存跳轉(zhuǎn)。 這個概念使得有可能高效地執(zhí)行許多張量運算。

例:

>>> x = torch.Tensor([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
>>> x.stride()
(5, 1)


>>> x.t().stride()
(1, 5)

有關(guān)torch.sparse_coo張量的更多信息,請參見 torch.sparse 。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號