ยินดีต้อนรับ! สำหรับโครงการใหม่ตอนนี้ฉันขอแนะนำ อย่างยิ่ง ให้ใช้โครงการ 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, ... )
Bye-bye Bugs! ทักทายกับเอกสารที่บังคับใช้และชัดเจนของรหัสของคุณ
ถ้า (เช่นฉัน) คุณพบว่าตัวเองทิ้งรหัสของคุณด้วยความคิดเห็นเช่น # 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 Decorators
หากคุณไม่ได้ใช้ 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 pair (ในทางเทคนิคมันเป็นชิ้น) รวมทั้งพฤติกรรม str และ int (เพียงแค่ str ด้วยตัวเองเทียบเท่ากับ str: -1 .)str: str คู่ซึ่งในกรณีนี้ขนาดของมิติที่ผ่านเมื่อรันไทม์จะถูกผูกไว้กับ ทั้งสอง ชื่อและมิติทั้งหมดที่มีชื่อทั้งสองจะต้องมีขนาดเท่ากัน (บางคนชอบใช้สิ่งนี้เป็นวิธีเชื่อมโยงหลายชื่อกับมิติเพื่อวัตถุประสงค์ในการจัดทำเอกสารเพิ่มเติม)str: ... คู่ซึ่งในกรณีนี้หลายมิติที่สอดคล้องกับ ... จะถูกผูกไว้กับชื่อที่ระบุโดย str และตรวจสอบอีกครั้งเพื่อความสอดคล้องระหว่างอาร์กิวเมนต์None ซึ่งเมื่อใช้ร่วมกับ is_named ด้านล่างแสดงมิติที่ต้อง ไม่มี ชื่อในแง่ของเทนเซอร์ที่มีชื่อNone: int คู่รวมทั้ง None และพฤติกรรม int (เพียงแค่ None ตัวเองก็เทียบเท่ากับ None: -1 .)None: str คู่ None ทั้งสองและพฤติกรรม 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() ซึ่งมักจะ float32layout อาจเป็นไปได้ทั้ง torch.strided หรือ torch.sparse_coo สำหรับเทนเซอร์ที่หนาแน่นและเบาบางตามลำดับdetails มีวิธีที่จะผ่านจำนวนธงเพิ่มเติมที่กำหนดและขยาย torchtyping ธงสองตัวถูกสร้างขึ้นโดยค่าเริ่มต้น torchtyping.is_named ทำให้ชื่อของมิติเทนเซอร์ที่จะตรวจสอบและ torchtyping.is_float สามารถนำมาใช้เพื่อตรวจสอบว่า TensorType[torch.float32] torchtyping details นั้นผ่านเข้ามา[] ตัวอย่างเช่น TensorType["batch": ..., "length", "channels", float, is_named] torchtyping . patch_typeguard () torchtyping รวมเข้ากับ typeguard เพื่อทำการตรวจสอบประเภทรันไทม์ torchtyping.patch_typeguard() ควรถูกเรียกในระดับโลกและจะแก้ไข typeguard เพื่อตรวจสอบ TensorType s
ฟังก์ชั่นนี้ปลอดภัยในการทำงานหลายครั้ง (มันไม่ได้ทำอะไรหลังจากการวิ่งครั้งแรก)
@typeguard.typechecked ดังนั้นควรเรียกใช้ torchtyping.patch_typeguard() ได้ตลอดเวลาก่อนที่จะใช้ @typeguard.typechecked ตัวอย่างเช่นคุณสามารถเรียกมันได้ที่จุดเริ่มต้นของแต่ละไฟล์โดยใช้ torchtypingtypeguard.importhook.install_import_hook ดังนั้นจึงควรเรียกว่า torchtyping.patch_typeguard() ได้ตลอดเวลาก่อนที่จะกำหนดฟังก์ชั่นที่คุณต้องการตรวจสอบ ตัวอย่างเช่นคุณสามารถเรียก torchtyping.patch_typeguard() เพียงครั้งเดียวในเวลาเดียวกันกับเบ็ดนำเข้า typeguard (ลำดับของตะขอและแพทช์ไม่สำคัญ)typeguard ดังนั้น torchtyping.patch_typeguard() สามารถละเว้นได้โดยสิ้นเชิงและ torchtyping ใช้เพื่อวัตถุประสงค์ในการจัดทำเอกสาร pytest --torchtyping-patch-typeguard torchtyping นำเสนอปลั๊กอิน pytest เพื่อเรียกใช้ torchtyping.patch_typeguard() ก่อนการทดสอบของคุณ pytest จะค้นพบปลั๊กอินโดยอัตโนมัติคุณเพียงแค่ต้องผ่านธง --torchtyping-patch-typeguard เพื่อเปิดใช้งาน แพ็คเกจสามารถส่งผ่านไปยัง typeguard ตามปกติไม่ว่าจะโดยใช้ @typeguard.typechecked , hook นำเข้าของ typeguard หรือธง pytest --typeguard-packages="your_package_here"
ดูเอกสารเพิ่มเติมสำหรับ:
flake8 และความเข้ากันได้ของ mypy ;torchtyping ;