Добро пожаловать! Для новых проектов я сейчас настоятельно рекомендую использовать свой новый проект Jaxtyping. Он поддерживает Pytorch, на самом деле не зависит от JAX, и, в отличие от Forchtyping, он совместим со статическими шашками типа. :)
Поверните это:
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 PARE, и в этом случае размер измерения, передаваемого во время выполнения, будет связан с обоими именами, и все измерения с любым именем должны иметь одинаковый размер. (Некоторые люди любят использовать это как способ связать несколько имен с измерением, для дополнительных целей документации.)str: ... Пара, и в этом случае множественные измерения, соответствующие ... будут связаны с именем, указанным str , и снова проверяются на согласованность между аргументами.None , который при использовании в сочетании с is_named ниже, указывает на измерение, которое не должно иметь имени в смысле названных тензоров.None: int , объединяя как None , так и поведение int . (Просто None сам по себе эквивалентен None: -1 .)None: str pair, объединяя как None , так и поведение str . (То есть он не должен иметь именованное измерение, но должно быть размером, согласующимся с другими видами использования строки.)typing.Any Любой: любой размер допускается для этого измерения (эквивалентно -1 ).TensorType["batch": ..., "length": 10, "channels", -1] . Если вы просто хотите указать количество измерений, то используйте, например, TensorType[-1, -1, -1] для трехмерного тензора.dtype может быть любым:torch.float32 , torch.float64 и т. Д.int , bool , float , которые преобразуются в их соответствующие типы питор. float специально интерпретируется как torch.get_default_dtype() , который обычно является float32 .layout может быть либо torch.strided , либо torch.sparse_coo , для плотных и разреженных тензоров соответственно.details предлагает способ передать произвольное количество дополнительных флагов, которые настраивают и расширяют torchtyping . Два флага встроены по умолчанию. torchtyping.is_named приводит к проверке имен тензоров, и torchtyping.is_float можно использовать для проверки того, что производят произвольные типы плавания. (Вместо того, как только конкретный, как с EG 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 . Например, вы можете вызвать его в начале каждого файла, используя 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 Flag --typeguard-packages="your_package_here" .
Смотрите дальнейшую документацию для:
flake8 и mypy ;torchtyping ;