torch.masked¶
介紹¶
動機¶
警告
masked tensors 的 PyTorch API 處於原型階段,未來可能會發生變化。
MaskedTensor 是 torch.Tensor 的擴充套件,它提供了以下能力:
使用任何 masked 語義(例如,變長張量、nan* 運算元等)
區分 0 梯度和 NaN 梯度
各種稀疏應用(見下方教程)
“指定”(Specified)和“未指定”(unspecified)在 PyTorch 中有著悠久的歷史,但缺乏正式的語義和一致性;事實上,MaskedTensor 的誕生是為了解決普通 torch.Tensor 類無法妥善處理的一系列問題。因此,MaskedTensor 的主要目標是成為 PyTorch 中這些“指定”和“未指定”值的唯一真理來源,讓它們成為一等公民而非事後補丁。這反過來應該進一步釋放稀疏性的潛力,實現更安全、更一致的運算元,併為使用者和開發者提供更流暢、更直觀的體驗。
什麼是 MaskedTensor?¶
MaskedTensor 是一種張量子類,由 1) 輸入(資料)和 2) 掩碼(mask)組成。掩碼告訴我們應包含或忽略輸入中的哪些條目。
舉個例子,假設我們想遮蔽掉所有等於 0 的值(用灰色表示)並取最大值
上方是普通張量的例子,下方是 MaskedTensor 的例子,其中所有的 0 都被遮蔽掉了。這顯然會產生不同的結果,取決於我們是否有掩碼,但這種靈活的結構允許使用者在計算過程中系統地忽略他們希望忽略的任何元素。
我們已經編寫了一些現有教程來幫助使用者入門,例如
支援的運算元¶
一元運算元¶
一元運算元是僅包含一個輸入的運算元。將其應用於 MaskedTensors 相對簡單:如果在給定索引處資料被遮蔽,我們會應用該運算元;否則,我們將繼續遮蔽資料。
可用的一元運算元有
計算 |
|
|
|
計算 |
|
|
|
返回一個新張量,其中包含 |
|
|
|
計算給定 |
|
返回一個新張量,其中包含 |
|
|
|
返回一個新張量,其中包含 |
|
|
|
返回一個新張量,其中包含 |
|
|
|
返回一個新張量,其中包含 |
|
|
|
計算給定輸入張量的按位非。 |
|
返回一個新張量,其中包含 |
|
|
|
計算給定 |
|
返回一個新張量,其中包含 |
|
返回一個新張量,其中包含 |
|
返回一個新張量,其中包含 |
|
|
|
|
|
返回一個新張量,其中包含輸入張量 |
|
|
|
|
|
返回一個新張量,其中包含 |
|
計算 |
|
計算 |
|
返回一個新張量,其中包含 |
|
返回一個新張量,其中包含 |
|
返回一個新張量,其中包含 (1 + |
|
返回一個新張量,其中包含 |
|
|
|
返回一個新張量,其中包含布林元素,表示 |
|
將 |
|
返回一個新張量,其中包含 |
|
|
|
返回 |
|
計算 |
|
返回一個新張量,其中包含 |
|
返回一個新張量,其中包含 |
|
將 |
|
返回一個新張量,其中包含 |
|
返回一個新張量,其中包含 |
|
此函式是 torch.sign() 對於複數張量的擴充套件。 |
|
測試 |
|
返回一個新張量,其中包含 |
|
|
|
返回一個新張量,其中包含 |
|
返回一個新張量,其中包含 |
|
返回一個新張量,其中包含 |
|
返回一個新張量,其中包含 |
|
返回一個新張量,其中包含 |
|
返回一個新張量,其中包含 |
可用的就地(inplace)一元運算元包括上述所有運算元,**除了**
計算給定 |
|
返回 |
|
測試 |
|
返回一個新張量,其中包含布林元素,表示 |
二元運算元¶
如您在教程中可能看到的,MaskedTensor 也實現了二元操作,但需要注意的是,兩個 MaskedTensors 中的掩碼必須匹配,否則會引發錯誤。正如錯誤資訊中指出的,如果您需要支援某個特定的運算元,或者對它們應該如何表現有提議的語義,請在 GitHub 上開啟一個 issue。目前,我們決定採用最保守的實現方式,以確保使用者清楚地瞭解正在發生的事情,並慎重地對待 masked 語義相關的決策。
可用的二元運算元有
將按 |
|
逐元素計算 的反正切,並考慮象限。 |
|
|
|
計算 |
|
計算 |
|
計算 |
|
計算 |
|
計算 |
|
將輸入 |
|
|
|
逐元素應用 C++ 的 std::fmod。 |
|
輸入指數之和的對數。 |
|
輸入指數之和以 2 為底的對數。 |
|
將 |
|
|
|
逐元素返回 |
|
逐元素計算 Python 的模運算。 |
|
從 |
|
|
|
|
|
計算逐元素相等性 |
|
逐元素計算 。 |
|
逐元素計算 。 |
|
逐元素計算 。 |
|
|
|
|
|
按元素計算 。 |
|
|
|
按元素計算 。 |
|
|
|
按元素計算 |
|
按元素計算 |
|
按元素計算 |
|
按元素計算 |
|
|
可用的原地二元運算子包含以上所有,**除了**
輸入指數之和的對數。 |
|
輸入指數之和以 2 為底的對數。 |
|
如果兩個張量具有相同的大小和元素,則為 |
|
按元素計算 |
|
按元素計算 |
|
按元素計算 |
規約¶
以下規約可用(支援 autograd)。更多資訊請參閱 概述 教程,其中詳細介紹了一些規約示例;而 高階語義 教程則對某些規約語義的決定方式進行了深入探討。
返回 |
|
返回 |
|
返回 |
|
返回展平張量或沿某個維度的最小值索引 |
|
返回 |
|
返回 |
|
測試 |
|
返回給定張量的矩陣範數或向量範數。 |
|
計算由 |
|
計算由 |
檢視和選擇函式¶
我們還包含了一些檢視和選擇函式;直觀上,這些運算子將同時應用於資料和掩碼,然後將結果包裝在 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, --, --]
)
當前支援以下操作:
返回每個零維輸入張量的一維檢視。 |
|
根據 廣播語義 廣播給定張量。 |
|
將 |
|
在給定維度連線 |
|
嘗試將張量分割成指定數量的塊。 |
|
透過水平堆疊 |
|
根據 |
|
透過將其重塑為一維張量來展平 |
|
根據 |
|
按順序水平堆疊張量(按列)。 |
|
計算 |
|
根據 |
|
返回一個新張量,它是 |
|
從批次輸入張量中提取滑動區域性塊。 |
|
返回一個連續的展平張量。 |
|
在給定索引處沿選定維度對 |
|
將張量分割成塊。 |
|
沿新維度連線張量序列。 |
|
要求 |
|
返回 |
|
根據 |
|
按順序垂直堆疊張量(按行)。 |
|
返回 |
|
將此張量擴充套件到與 |
|
返回一個與 |
|
返回此張量,使其形狀與 |
|
返回原始張量的一個檢視,該檢視包含 |
|
返回一個新張量,其資料與 |