いらっしゃいませ!新しいプロジェクトについては、代わりに新しい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 torchtypingpython> = 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ドキュメントの目的で使用されます。通常のPythonプログラミングにtypeguardをまだ使用していない場合は、使用することを強く検討してください。バグをつぶすのに最適な方法です。 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によって指定された名前にバインドされ、再び引数間の一貫性があることを確認します。is_namedと組み合わせて使用する場合、名前が付けられたテンソルという意味で名前を持たない次元None示します。None: intペア、 Noneとint両方の動作を組み合わせます。 (それ自体ではありNone: -1 NoneNone: strペア、 Noneとstr両方の動作を組み合わせます。 (つまり、名前付きの次元を持っているべきではありませんが、文字列の他の使用と一致するサイズでなければなりません。)typing.Any :任意のサイズがこの次元に許可されています( -1に相当)。TensorType["batch": ..., "length": 10, "channels", -1] 。寸法の数を指定するだけの場合は、3次元テンソルに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の任意の数の追加フラグを渡す方法を提供します。デフォルトでは、2つのフラグが組み込まれています。 torchtyping.is_namedテンソル寸法の名前をチェックし、 torchtyping.is_float使用して、任意のtorchtypingポイントTensorType[torch.float32]が渡されるdetailsを確認できます。[]内にすべてをまとめるだけで、複数のものを一度に確認します。たとえば、 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()は、チェックする機能を定義する前にいつでも呼び出す必要があります。たとえば、 torchtyping.patch_typeguard() typeguard電話することができます。 (フックとパッチの順序は関係ありません。)typeguardを使用していない場合は、 torchtyping.patch_typeguard()完全に省略でき、 torchtypingドキュメントの目的で使用されます。 pytest --torchtyping-patch-typeguard torchtyping 、テストの前にtorchtyping.patch_typeguard()自動的に実行するためのpytestプラグインを提供します。 pytestプラグインを自動的に発見します。それを有効にするために、 --torchtyping-patch-typeguardフラグを渡すだけです。 @typeguard.typechecked 、 typeguardのインポートフック、またはpytestフラグ--typeguard-packages="your_package_here"を使用して、パッケージを通常どおりtypeguardに渡すことができます。
次のドキュメントを参照してください:
flake8およびmypy互換性を含む。torchtypingにカスタム拡張機能を書き込む方法。