歡迎!對於新項目,我現在強烈建議您改用我的新型Jaxtyping項目。它支持pytorch,實際上並不依賴於jax,並且與火炬不同,它與靜態類型的棋子兼容。 :)
轉到這個:
def batch_outer_product ( x : torch . Tensor , y : torch . Tensor ) -> torch . Tensor :
# x has shape (batch, x_channels)
# y has shape (batch, y_channels)
# return has shape (batch, x_channels, y_channels)
return x . unsqueeze ( - 1 ) * y . unsqueeze ( - 2 )介入:
def batch_outer_product ( x : TensorType [ "batch" , "x_channels" ],
y : TensorType [ "batch" , "y_channels" ]
) -> TensorType [ "batch" , "x_channels" , "y_channels" ]:
return x . unsqueeze ( - 1 ) * y . unsqueeze ( - 2 )通過編程檢查是否滿足形狀(dtype,...)規範。
再見蟲子!向執行,清晰的代碼文檔打招呼。
如果(像我一樣)您發現自己會用# x has shape (batch, hidden_state)或諸如assert x.shape == y.shape之類的語句,只是為了跟踪所有形狀的內容,那麼這是給您的。
pip install torchtyping需要Python> = 3.7和Pytorch> = 1.7.0。
如果使用typeguard ,則必須是版本<3.0.0。
torchtyping允許註釋類型:
...的任意數量的批次尺寸;torchtyping是高度擴展的。如果(選項)安裝了typeguard ,則可以在運行時檢查類型,以確保張量確實具有廣告的形狀,DTYPE等。
# EXAMPLE
from torch import rand
from torchtyping import TensorType , patch_typeguard
from typeguard import typechecked
patch_typeguard () # use before @typechecked
@ typechecked
def func ( x : TensorType [ "batch" ],
y : TensorType [ "batch" ]) -> TensorType [ "batch" ]:
return x + y
func ( rand ( 3 ), rand ( 3 )) # works
func ( rand ( 3 ), rand ( 1 ))
# TypeError: Dimension 'batch' of inconsistent size. Got both 1 and 3. typeguard還具有一個導入掛鉤,可用於自動測試整個模塊,而無需手動添加@typeguard.typechecked Decorter。
如果您不使用typeguard ,則可以完全省略torchtyping.patch_typeguard() ,而torchtyping只用於文檔目的。如果您尚未使用typeguard進行常規Python編程,請強烈考慮使用它。這是擠壓錯誤的好方法。 typeguard和torchtyping都與pytest集成在一起,因此,如果您擔心任何性能罰款,則只能在測試中啟用它們。
torchtyping . TensorType [ shape , dtype , layout , details ]圖書館的核心。
每個shape , dtype , layout , details都是可選的。
shape論點可以是任何:int :尺寸必須完全如此。如果是-1 ,則允許任何尺寸。str :運行時通過的維度的大小將被綁定到此名稱,所有張量檢查尺寸是否一致。... :任何大小的任意數量的尺寸。str: int對(從技術上講,這是一個切片),將str和int行為結合在一起。 (只是一個單獨的str等同於str: -1 。)str: str對,在這種情況下,運行時傳遞的維度的大小將綁定到兩個名稱,並且所有名稱的所有維度都必須具有相同的大小。 (有些人喜歡將其用作將多個名稱與維度相關聯的一種方式,出於額外的文檔目的。)str: ...對,在這種情況下,與...相對應的多個維度將綁定到str指定的名稱,並再次檢查參數之間的一致性。None ,當與下面的is_named結合使用時,它表示一個尺寸,該維度一定不具有命名張量的名稱。None: int對,既結合None and int行為。 (只是None本身就是等同None: -1 。)None: str對,既結合None and str行為。 (也就是說,它一定不能具有命名的維度,但必須與字符串的其他用途相一致。)typing.Any :任何尺寸都允許使用此維度(相當於-1 )。TensorType["batch": ..., "length": 10, "channels", -1] 。如果您只想指定尺寸的數量,則使用三維張量的TensorType[-1, -1, -1] 。dtype論點可以是:torch.float32 , torch.float64等int , bool , float ,它們轉換為相應的pytorch類型。 float被專門解釋為torch.get_default_dtype() ,通常為float32 。layout參數可以分別torch.sparse_coo torch.strided ,分別用於密集和稀疏的張量。details參數提供了一種傳遞任意數量的其他標誌來自定義和擴展torchtyping方法。默認情況下,兩個標誌是內置的。 torchtyping.is_named會導致檢查張量尺寸的名稱,並可以使用torchtyping.is_float來檢查是否傳遞了任意的torchtyping details 。 (而不是僅僅是特定的浮點類型,例如TensorType[torch.float32] 。[]中,立即檢查多件事。例如TensorType["batch": ..., "length", "channels", float, is_named] 。 torchtyping . patch_typeguard () torchtyping與typeguard集成以執行運行時類型檢查。 torchtyping.patch_typeguard()應在全球級別上調用,並將修補typeguard檢查TensorType s。
此功能可以安全多次運行。 (在第一次運行後它無能為力)。
@typeguard.typechecked ,則在使用@typeguard.typechecked之前,應隨時調用torchtyping.patch_typeguard() 。例如,您可以使用torchtyping在每個文件的開頭調用它。typeguard.importhook.install_import_hook ,則在定義要檢查的功能之前,應隨時調用torchtyping.patch_typeguard() 。例如,您只需與typeguard Import Hook同時調用一次torchtyping.patch_typeguard() 。 (鉤子和補丁的順序無關緊要。)typeguard ,則可以完全省略torchtyping.patch_typeguard() ,而torchtyping只用於文檔目的。 pytest --torchtyping-patch-typeguard torchtyping提供了一個pytest插件,可以在測試之前自動運行torchtyping.patch_typeguard() 。 pytest會自動發現插件,您只需要傳遞--torchtyping-patch-typeguard標誌即可啟用它。然後可以使用@typeguard.typechecked , typeguard的導入掛鉤或pytest flag --typeguard-packages="your_package_here" ,可以將軟件包傳遞給typeguard 。
請參閱更多文檔以下文檔:
flake8和mypy兼容性;torchtyping編寫自定義擴展;