مرحباً! بالنسبة للمشاريع الجديدة ، أوصي بشدة باستخدام مشروع Jaxtyping الأحدث بدلاً من ذلك. إنه يدعم Pytorch ، ولا يعتمد فعليًا على Jax ، وعلى عكس Torchtyping ، فإنه متوافق مع المدققات الثابتة. سائدا
اقلب هذا:
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 يدويًا.
إذا كنت لا تستخدم 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 والسلوك 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() ، والذي عادة ما يكون float32 .layout إما torch.strided أو torch.sparse_coo ، للترنز الكثيف والتفريخ على التوالي.details وسيلة لتمرير عدد تعسفي من الأعلام الإضافية التي تخصص وتمديد torchtyping . علمان مدمجان بشكل افتراضي. يسبب torchtyping.is_named أسماء أبعاد الموتر التي يتم فحصها ، ويمكن استخدام torchtyping.is_float للتحقق من أن أنواع النقاط العائمة torchtyping قد تم تمريرها. (بدلاً من مجرد واحدة محددة كما هو الحال مع Eg TensorType[torch.float32] .) 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 . على سبيل المثال ، يمكنك الاتصال به في بداية كل ملف باستخدام torchtyping .typeguard.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 ، أو خطاف استيراد typeguard ، أو علامة pytest --typeguard-packages="your_package_here" .
شاهد الوثائق الإضافية لـ:
flake8 والتوافق mypy ؛torchtyping ؛