torch.masked¶
簡介¶
動機¶
警告
遮罩張量的 PyTorch API 處於原型階段,未來可能會或可能不會更改。
MaskedTensor 是 torch.Tensor 的擴充,它為使用者提供了以下功能:
- 使用任何遮罩語義(例如,變長張量、nan* 運算子等) 
- 區分 0 和 NaN 梯度 
- 各種稀疏應用(請參閱以下教學課程) 
「指定的」和「未指定的」在 PyTorch 中有著悠久的歷史,但沒有正式的語義,當然也沒有一致性;事實上,MaskedTensor 的誕生源於普通的 torch.Tensor 類別無法妥善解決的問題。因此,MaskedTensor 的主要目標是成為 PyTorch 中所述「指定的」和「未指定的」值的真實來源,在這些值中,它們是一等公民,而不是事後才想到的。反過來,這應該會進一步釋放 稀疏性 的潛力,實現更安全、更一致的運算子,並為使用者和開發者提供更順暢、更直觀的體驗。
什麼是 MaskedTensor?¶
MaskedTensor 是一個張量子類別,它由 1) 輸入(資料)和 2) 遮罩組成。遮罩告訴我們哪些輸入項目應該包含或忽略。
舉例來說,假設我們想要遮罩掉所有等於 0 的值(以灰色表示),並取最大值
 
頂部是普通的張量範例,而底部是 MaskedTensor,其中所有 0 都被遮罩掉了。這顯然會根據我們是否有遮罩而產生不同的結果,但這種靈活的結構允許使用者在計算過程中系統地忽略他們想要的任何元素。
我們已經編寫了一些現有的教學課程來幫助使用者入門,例如:
支援的運算子¶
一元運算子¶
一元運算子是只包含單一輸入的運算子。將它們應用於 MaskedTensors 相對簡單:如果資料在給定索引處被遮罩,我們就應用運算子,否則我們將繼續遮罩資料。
可用的一元運算子如下:
| 計算  | |
| 
 | |
| 計算  | |
| 
 | |
| 傳回一個新張量,其中包含  | |
| 
 | |
| 計算給定  | |
| 傳回一個新張量,其中包含  | |
| 
 | |
| 傳回一個新張量,其中包含  | |
| 
 | |
| 傳回一個新的張量,其中包含  | |
| 
 | |
| 傳回一個新的張量,其中包含  | |
| 
 | |
| 計算給定輸入張量的位元反轉。 | |
| 傳回一個新的張量,其中包含  | |
| 
 | |
| 計算給定  | |
| 傳回一個新的張量,其中包含  | |
| 傳回一個新的張量,其中包含  | |
| 傳回一個新的張量,其中包含將  | |
| 
 | |
| 
 | |
| 傳回一個新的張量,其中包含輸入張量  | |
| 
 | |
| 
 | |
| 傳回一個新的張量,其中包含  | |
| 計算  | |
| 計算  | |
| 傳回一個新的張量,其中包含  | |
| 傳回一個新的張量,其中包含  | |
| 傳回一個新的張量,其中包含 (1 +  | |
| 傳回一個新的張量,其中包含  | |
| 
 | |
| 傳回一個新的張量,其中包含布林元素,表示  | |
| 將  | |
| 傳回一個新的張量,其中包含  | |
| 
 | |
| 傳回  | |
| 使用  | |
| 傳回一個新的張量,其中包含將  | |
| 傳回一個新的張量,其中包含  | |
| 將  | |
| 傳回一個新的張量,其中包含  | |
| 傳回一個新的張量,其中包含  | |
| 此函數是 torch.sign() 對複數張量的擴展。 | |
| 測試  | |
| 傳回一個新的張量,其中包含  | |
| 
 | |
| 傳回一個新的張量,其中包含  | |
| 傳回一個新的張量,其中包含  | |
| 傳回一個新的張量,其中包含  | |
| 傳回一個新的張量,其中包含  | |
| 傳回一個新的張量,其中包含  | |
| 傳回一個新的張量,其中包含  | 
可用的原地單元運算符是以上所有運算符,除了
| 計算給定  | |
| 傳回  | |
| 測試  | |
| 傳回一個新的張量,其中包含布林元素,表示  | 
二元運算符¶
您可能在教程中已經看到,MaskedTensor 也實現了二元運算,但需要注意的是,兩個 MaskedTensors 中的遮罩必須匹配,否則會引發錯誤。如錯誤訊息中所述,如果您需要支援特定運算符或建議它們應該如何運作的語義,請在 GitHub 上提交議題。目前,我們決定採用最保守的實現方式,以確保使用者確切了解發生了什麼事,並對遮罩語義做出有意識的決定。
可用的二元運算符有
| 將  | |
| 考慮象限的元素反正切 。 | |
| 
 | |
| 計算  | |
| 計算  | |
| 計算  | |
| 計算  | |
| 計算  | |
| 將輸入  | |
| 
 | |
| 逐項應用 C++ 的 std::fmod。 | |
| 輸入值的指數總和之對數。 | |
| 以 2 為底數時,輸入值的指數總和之對數。 | |
| 將  | |
| 
 | |
| 逐項傳回在  | |
| 逐項計算 Python 的模數運算。 | |
| 從  | |
| 
 | |
| 
 | |
| 逐項計算是否相等 | |
| 逐項計算 。 | |
| 逐項計算 。 | |
| 逐項計算 。 | |
| 
 | |
| 
 | |
| 逐項計算 。 | |
| 
 | |
| 逐項計算 。 | |
| 
 | |
| 逐項計算  | |
| 逐項計算  | |
| 逐項計算  | |
| 逐項計算  | |
| 
 | 
可用的就地二元運算子為以上所有運算子,除了
| 輸入值的指數總和之對數。 | |
| 以 2 為底數時,輸入值的指數總和之對數。 | |
| 如果兩個張量具有相同的大小和元素,則為  | |
| 逐項計算  | |
| 逐項計算  | |
| 逐項計算  | 
縮減¶
以下縮減操作可用(支援自動梯度)。如需更多資訊,概覽 教學課程詳細說明了一些縮減範例,而 進階語義 教學課程則深入探討了我們如何決定某些縮減語義。
| 傳回  | |
| 傳回  | |
| 傳回給定維度  | |
| 傳回給定維度  | |
| 傳回扁平化張量或沿著維度的最小值索引 | |
| 傳回  | |
| 傳回  | |
| 測試  | |
| 傳回給定張量的矩陣範數或向量範數。 | |
| 計算  | |
| 計算  | 
檢視和選擇函數¶
我們也包含了一些檢視和選擇函數;直觀地說,這些運算子將應用於資料和遮罩,然後將結果包裝在 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 維檢視,維度為零。 | |
| 根據 廣播語義 廣播給定的張量。 | |
| 將  | |
| 在給定維度中串聯給定的  | |
| 嘗試將張量分割成指定數量的區塊。 | |
| 藉由水平堆疊  | |
| 根據  | |
| 藉由將  | |
| 根據  | |
| 水平依序堆疊張量(以欄為單位)。 | |
| 計算  | |
| 建立由 attr:tensors 中的一維輸入指定的座標格線。 | |
| 傳回一個新的張量,它是  | |
| 傳回連續的扁平化張量。 | |
| 沿著所選維度,在給定索引處切片  | |
| 將張量分割成多個區塊。 | |
| 預期  | |
| 傳回  | |
| 根據  | |
| 按順序垂直堆疊張量(逐行)。 | |
| 傳回  | |
| 將此張量擴展到與  | |
| 傳回一個張量,其數據和元素個數與  | |
| 傳回與  | |
| 傳回一個新張量,其數據與  |