torch.masked¶
簡介¶
動機¶
警告
遮罩張量的 PyTorch API 處於原型階段,未來可能會或可能不會更改。
MaskedTensor 作為 torch.Tensor
的擴展,為使用者提供能力
使用任何遮罩語義 (例如,可變長度張量、nan* 運算符等)。
區分 0 和 NaN 梯度。
各種稀疏應用 (請參閱下面的教學)。
「已指定」和「未指定」在 PyTorch 中有很長的歷史,但沒有正式的語義,當然也沒有一致性;事實上,MaskedTensor 的誕生源於 vanilla torch.Tensor
類別無法妥善解決的問題累積。因此,MaskedTensor 的主要目標是成為 PyTorch 中「已指定」和「未指定」值的真實來源,這些值是一等公民,而不是事後才考慮。反過來,這應該進一步釋放稀疏性的潛力、實現更安全和更一致的運算符,並為用戶和開發人員提供更流暢和更直觀的體驗。
什麼是 MaskedTensor?¶
MaskedTensor 是一個張量子類別,由 1) 輸入 (資料) 和 2) 遮罩組成。遮罩告訴我們應該包含或忽略輸入中的哪些條目。
舉例來說,假設我們要遮罩掉所有等於 0 的值 (以灰色表示) 並取最大值。

上面是 vanilla 張量範例,而下面是 MaskedTensor,其中所有的 0 都被遮罩掉。 這顯然會產生不同的結果,具體取決於我們是否有遮罩,但這種靈活的結構允許使用者有系統地忽略他們在計算過程中想要忽略的任何元素。
我們已經編寫了許多現有的教學,以幫助使用者入門,例如:
支援的運算符¶
一元運算符¶
一元運算符是只包含單個輸入的運算符。 將它們應用於 MaskedTensors 相對簡單:如果在給定索引處資料被遮罩掉,我們就應用運算符,否則我們將繼續遮罩掉資料。
可用的一元運算符包括:
計算 |
|
別名,請參閱 |
|
計算 |
|
別名,請參閱 |
|
傳回一個新張量,其中包含 |
|
別名,請參閱 |
|
計算給定 |
|
傳回一個新張量,其中包含 |
|
別名,請參閱 |
|
傳回一個新張量,其中包含 |
|
別名,請參閱 |
|
傳回一個新張量,其中包含 |
|
別名,請參閱 |
|
傳回一個新張量,其中包含 |
|
別名,請參閱 |
|
計算給定輸入張量的位元 NOT。 |
|
傳回一個新張量,其中包含 |
|
別名,請參閱 |
|
計算給定 |
|
傳回一個新張量,其中包含 |
|
傳回一個新張量,其中包含 |
|
傳回一個新張量,其中包含從角度(以度為單位)轉換為弧度的 |
|
別名,請參閱 |
|
別名,請參閱 |
|
別名,請參閱 |
|
別名,請參閱 |
|
返回一個新的張量,其元素為輸入張量 |
|
是 |
|
是 |
|
是 |
|
返回一個新的張量,其元素為 |
|
計算 |
|
計算 |
|
返回一個新的張量,其元素為 |
|
返回一個新的張量,其元素為 |
|
返回一個新的張量,其元素為 (1 + |
|
返回一個新的張量,其元素為 |
|
是 |
|
是 |
|
返回一個新的張量,其布林元素表示 |
|
將 |
|
返回一個新的張量,其元素為 |
|
是 |
|
返回 |
|
將 |
|
返回一個新的張量,其元素為 |
|
返回一個新的張量,其元素為 |
|
將 |
|
返回一個新的張量,其元素為 |
|
是 |
|
返回一個新的張量,其元素為 |
|
此函數是 torch.sign() 對複數張量的擴展。 |
|
測試 |
|
返回一個新的張量,其元素為 |
|
是 |
|
返回一個新的張量,其元素為 |
|
返回一個新的張量,其元素為 |
|
返回一個新的張量,其元素為 |
|
返回一個新的張量,其元素為 |
|
返回一個新的張量,其元素為 |
|
返回一個新的張量,其元素為 |
可用的 inplace 一元運算符是以上所有 除了
計算給定 |
|
返回 |
|
測試 |
|
返回一個新的張量,其布林元素表示 |
二元運算符¶
您可能在教學中已經看到,MaskedTensor
也實作了二元運算,但前提是兩個 MaskedTensor 中的遮罩必須匹配,否則會引發錯誤。 如錯誤中所述,如果您需要對特定運算符的支持,或者對它們應該如何表現有建議的語義,請在 GitHub 上提出 issue。 目前,我們決定採用最保守的實作方式,以確保使用者確切地知道發生了什麼,並且有意識地決定使用遮罩語義。
可用的二元運算符有
將按 |
|
逐元素計算 的反正切函數,並考量象限。 |
|
是 |
|
計算 |
|
計算 |
|
計算 |
|
計算 |
|
計算 |
|
將輸入 |
|
是 |
|
逐元素應用 C++ 的 std::fmod。 |
|
輸入指數之和的對數。 |
|
以 2 為底數,輸入指數之和的對數。 |
|
將 |
|
是 |
|
逐元素返回 |
|
逐元素計算 Python 的模數運算。 |
|
從 |
|
是 |
|
是 |
|
逐元素計算相等性 |
|
逐元素計算 。 |
|
逐元素計算 。 |
|
逐元素計算 。 |
|
是 |
|
是 |
|
逐元素計算 。 |
|
是 |
|
逐元素計算 。 |
|
是 |
|
計算 |
|
計算 |
|
計算 |
|
計算 |
|
是 |
所有可用的原地二元運算符都是上述的,除了
輸入指數之和的對數。 |
|
以 2 為底數,輸入指數之和的對數。 |
|
如果兩個張量具有相同的大小和元素,則為 |
|
計算 |
|
計算 |
|
計算 |
縮減 (Reductions)¶
以下縮減可用(具有自動微分支持)。 更多信息,概述 教學詳細介紹了一些縮減的範例,而 進階語義 教學則更深入地討論了我們如何決定某些縮減語義。
返回 |
|
返回給定維度 |
|
返回給定維度 |
|
返回扁平化張量或沿維度的最小值(們)的索引 |
|
返回 |
|
返回 |
|
測試 |
|
返回給定張量的矩陣範數或向量範數。 |
|
計算由 |
|
計算由 |
視圖和選擇函數 (View and select functions)¶
我們還包含了一些視圖和選擇函數; 直觀地說,這些運算符將同時應用於數據和遮罩,然後將結果包裝在 MaskedTensor
中。 舉一個簡單的例子,考慮 select()
>>> data = torch.arange(12, dtype=torch.float).reshape(3, 4)
>>> data
tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]])
>>> mask = torch.tensor([[True, False, False, True], [False, True, False, False], [True, True, True, True]])
>>> mt = masked_tensor(data, mask)
>>> data.select(0, 1)
tensor([4., 5., 6., 7.])
>>> mask.select(0, 1)
tensor([False, True, False, False])
>>> mt.select(0, 1)
MaskedTensor(
[ --, 5.0000, --, --]
)
目前支持以下操作
返回每個零維輸入張量的 1 維視圖。 |
|
根據 廣播語義 (Broadcasting semantics) 廣播給定的張量。 |
|
將 |
|
在給定的維度中串聯 |
|
嘗試將張量拆分為指定數量的塊。 |
|
通過水平堆疊 |
|
根據 |
|
通過將 |
|
根據 |
|
按順序水平(按列)堆疊張量。 |
|
計算 |
|
創建由 attr:tensors 中 1D 輸入指定的坐標網格。 |
|
返回一個新張量,它是 |
|
從批次輸入張量中提取滑動局部塊。 |
|
返回一個連續的扁平化張量。 |
|
沿給定索引處的選定維度對 |
|
將張量分割成塊。 |
|
沿新維度串聯一系列張量。 |
|
期望 |
|
返回一個張量,它是 |
|
根據 |
|
按順序垂直(按行)堆疊張量。 |
|
返回 |
|
將此張量擴展為與 |
|
返回一個與 |
|
將此張量返回為與 |
|
返回原始張量的視圖,該視圖包含來自 |
|
返回一個新的張量,其數據與 |