torch.masked#
創建於: 2022年8月15日 | 最後更新於: 2025年6月17日
引言#
動機#
警告
Masked tensors 的 PyTorch API 處於原型階段,未來可能會更改。
MaskedTensor 作為 torch.Tensor 的擴充套件,賦予使用者能夠
使用任何掩碼語義(例如,可變長度張量、NaN* 運算子等)
區分 0 和 NaN 梯度
各種稀疏應用(請參閱下面的教程)
“指定”和“未指定”在 PyTorch 中有著悠久的歷史,但沒有正式的語義,當然也沒有一致性;事實上,MaskedTensor 的誕生源於 vanilla torch.Tensor 類無法妥善解決的一系列問題。因此,MaskedTensor 的主要目標是成為 PyTorch 中所述“指定”和“未指定”值的真實來源,其中它們是一等公民,而不是事後才考慮。反過來,這應該進一步釋放稀疏性的潛力,實現更安全、更一致的運算子,併為使用者和開發人員提供更順暢、更直觀的體驗。
什麼是 MaskedTensor?#
MaskedTensor 是一個張量子類,它包含 1) 一個輸入(資料)和 2) 一個掩碼。掩碼指示應包含或忽略輸入中的哪些條目。
舉個例子,假設我們想掩蓋所有等於 0 的值(用灰色表示)並取最大值
上面是 vanilla 張量示例,下面是 MaskedTensor,其中所有 0 都被掩蓋了。這顯然會產生不同的結果,具體取決於我們是否有掩碼,但這種靈活的結構允許使用者在計算過程中系統地忽略任何他們想要的元素。
我們已經編寫了許多現有教程來幫助使用者上手,例如
支援的運算子#
一元運算子#
一元運算子是僅包含單個輸入的運算子。將它們應用於 MaskedTensor 相對簡單:如果給定索引的資料被掩蓋,我們將應用運算子,否則將繼續掩蓋資料。
可用的 unary operators 是
計算 |
|
torch.abs() 的別名 |
|
計算 |
|
torch.acos() 的別名 |
|
返回一個新張量,其中包含 |
|
torch.acosh() 的別名 |
|
計算給定 |
|
返回一個新張量,其中包含 |
|
torch.asin() 的別名 |
|
返回一個新張量,其中包含 |
|
torch.asinh() 的別名 |
|
返回一個新張量,其中包含 |
|
torch.atan() 的別名 |
|
返回一個新張量,其中包含 |
|
torch.atanh() 的別名 |
|
計算給定輸入張量的按位 NOT。 |
|
返回一個新張量,其中包含 |
|
torch.clamp() 的別名 |
|
計算給定 |
|
返回一個新張量,其中包含 |
|
返回一個新張量,其中包含 |
|
返回一個新張量,其中 |
|
torch.special.digamma() 的別名 |
|
torch.special.erf() 的別名 |
|
torch.special.erfc() 的別名 |
|
torch.special.erfinv() 的別名 |
|
返回一個新張量,其元素是輸入張量 |
|
torch.special.exp2() 的別名 |
|
torch.special.expm1() 的別名 |
|
torch.trunc() 的別名 |
|
返回一個新張量,其中包含 |
|
計算 |
|
計算 |
|
返回一個新張量,其中包含 |
|
返回一個新張量,其中包含 |
|
返回一個新張量,其中包含(1 + |
|
返回一個新張量,其中包含 |
|
torch.special.logit() 的別名 |
|
torch.special.i0() 的別名 |
|
返回一個新張量,其中包含布林元素,表示 |
|
用 |
|
返回一個新張量,其中包含 |
|
torch.neg() 的別名 |
|
返回 |
|
計算 |
|
返回一個新張量,其中 |
|
返回一個新張量,其中包含 |
|
將 |
|
返回一個新張量,其中包含 |
|
torch.special.expit() 的別名 |
|
返回一個新張量,其中包含 |
|
此函式是 torch.sign() 對複數張量的擴充套件。 |
|
測試 |
|
返回一個新張量,其中包含 |
|
torch.special.sinc() 的別名 |
|
返回一個新張量,其中包含 |
|
返回一個新張量,其中包含 |
|
返回一個新張量,其中包含 |
|
返回一個新張量,其中包含 |
|
返回一個新張量,其元素是 |
|
返回一個新張量,其中包含 |
可用的 inplace unary operators 是上面所有運算子,**但**
二元運算子#
正如您可能在教程中看到的,MaskedTensor 還實現了二元運算子,但有一個條件:兩個 MaskedTensor 的掩碼必須匹配,否則將引發錯誤。如錯誤中所述,如果您需要特定運算子的支援或對如何處理它們有建議的語義,請在 GitHub 上開一個 issue。目前,我們已決定採用最保守的實現方式,以確保使用者確切地知道正在發生什麼,並對他們使用掩碼語義的決定保持謹慎。
可用的 binary operators 是
將 |
|
考慮象限的 的逐元素反正切。 |
|
torch.atan2() 的別名 |
|
計算 |
|
計算 |
|
計算 |
|
計算 |
|
計算 |
|
將輸入 |
|
torch.div() 的別名 |
|
逐元素應用 C++ 的 std::fmod。 |
|
輸入指數和的對數。 |
|
以2為底的輸入指數和的對數。 |
|
將 |
|
torch.mul() 的別名 |
|
返回 |
|
逐元素計算Python 的模運算。 |
|
從 |
|
torch.sub() 的別名 |
|
torch.div() 帶有 |
|
計算逐元素相等 |
|
逐元素計算 。 |
|
逐元素計算 。 |
|
逐元素計算 。 |
|
torch.gt() 的別名 |
|
torch.ge() 的別名 |
|
逐元素計算 。 |
|
torch.le() 的別名 |
|
逐元素計算 。 |
|
torch.lt() 的別名 |
|
計算 |
|
計算 |
|
計算 |
|
計算 |
|
torch.ne() 的別名 |
可用的 inplace binary operators 是上面所有運算子,**但**
檢視和選擇函式#
我們也包含了一些檢視和選擇函式;直觀地說,這些運算子將同時應用於資料和掩碼,然後將結果包裝在 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, --, --]
)
當前支援以下 ops
返回每個輸入張量的一維檢視,其中零維度。 |
|
根據 廣播語義 廣播給定的張量。 |
|
將 |
|
將給定的張量序列 |
|
嘗試將張量分割成指定的塊數。 |
|
透過水平堆疊 |
|
根據 |
|
透過將 |
|
根據 |
|
按水平(列方向)順序堆疊張量。 |
|
計算 |
|
建立由 attr:tensors 中一維輸入指定的座標網格。 |
|
返回一個新張量,它是 |
|
從批次輸入張量中提取滑動區域性塊。 |
|
返回一個連續的展平張量。 |
|
沿選定維度在給定索引處對 |
|
將張量分割成塊。 |
|
沿新維度連線一系列張量。 |
|
期望 |
|
返回一個轉置版本的 |
|
根據 |
|
按垂直(行方向)順序堆疊張量。 |
|
返回 |
|
將此張量擴充套件到與 |
|
返回一個具有與 |
|
將此張量返回為與 |
|
返回原始張量的檢視,該檢視包含 |
|
返回一個新張量,它具有與 |