Willkommen! Für neue Projekte empfehle ich jetzt dringend mein neueres Jaxyping -Projekt. Es unterstützt Pytorch, hängt nicht von JAX ab und ist im Gegensatz zu Torchyping nicht mit statischen Checkern kompatibel. :)
Drehen Sie das:
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 )in dieses:
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 )Bei der programmatischen Überprüfung, dass die Form (dype, ...) Spezifikation erfüllt ist.
Tschüss Bugs! Begrüßen Sie Hallo, um die Dokumentation Ihres Codes durchzusetzen.
Wenn (wie ich) Sie Ihren Code mit Kommentaren wie # x has shape (batch, hidden_state) oder Aussagen wie assert x.shape == y.shape , um zu verfolgen, was alles in der Form ist, dann ist dies für Sie.
pip install torchtypingBenötigt Python> = 3.7 und Pytorch> = 1,7.0.
Bei Verwendung von typeguard muss es sich um eine Version <3.0.0 handeln.
torchtyping ermöglicht dem Annotieren von Typen:
... ;torchtyping sehr erweiterbar ist. Wenn typeguard (optional) installiert ist, können die Typen zur Laufzeit überprüft werden, um sicherzustellen, dass die Tensoren wirklich von der angegebenen Form, DTYPE usw. sind.
# 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 verfügt außerdem über einen Importhaken, mit dem automatisch ein ganzes Modul getestet werden kann, ohne manuell @typeguard.typechecked Dekoratoren hinzufügen zu müssen.
Wenn Sie typeguard nicht verwenden, kann torchtyping.patch_typeguard() insgesamt weggelassen werden und nur für Dokumentationszwecke torchtyping werden. Wenn Sie nicht noch typeguard für Ihre reguläre Python -Programmierung verwenden, sollten Sie sie nachdrücklich in Betracht ziehen. Es ist eine großartige Möglichkeit, Bugs zu quetschen. Sowohl typeguard als auch torchtyping integrieren sich ebenfalls in pytest . Wenn Sie also über eine Leistungsstrafe besorgt sind, können sie nur während der Tests aktiviert werden.
torchtyping . TensorType [ shape , dtype , layout , details ]Der Kern der Bibliothek.
Jede shape , dtype , layout , details sind optional.
shape kann eines von:int : Die Dimension muss genau so groß sein. Wenn es -1 ist, ist jede Größe erlaubt.str : Die Größe der zur Laufzeit übergebenen Dimension wird an diesen Namen gebunden, und alle Tensoren überprüfen, ob die Größen konsistent sind.... : Eine willkürliche Anzahl von Dimensionen aller Größen.str: int -Paar (technisch gesehen ist es ein Stück) und kombiniert sowohl str als auch int -Verhalten. (Nur ein str allein entspricht str: -1 .)str: str -Paar, in diesem Fall wird die Größe der zur Laufzeit übergebenen Dimension an beide Namen gebunden, und alle Dimensionen mit beiden Namen müssen die gleiche Größe haben. (Einige Leute verwenden dies gerne, um mehrere Namen mit einer Dimension für zusätzliche Dokumentationszwecke zu verbinden.)str: ... Paar, in diesem Fall werden die mehrfachen Dimensionen, die ... an den von str festgelegten Namen gebunden sein, und wird erneut auf die Konsistenz zwischen Argumenten überprüft.None , der in Verbindung mit is_named unten eine Dimension zeigt, die im Sinne von genannten Tensoren keinen Namen haben darf.None: int -Paar, das sowohl None als auch int -Verhalten kombiniert. (Nur eine eigene für sich ist None gleichbedeutend mit None: -1 .)None: str -Paar, das sowohl None als auch str -Verhalten kombiniert. (Das heißt, es darf keine benannte Dimension haben, sondern muss eine Größe haben, die mit anderen Verwendungen der Zeichenfolge übereinstimmt.)typing.Any : Jede Größe ist für diese Dimension zulässig (äquivalent zu -1 ).TensorType["batch": ..., "length": 10, "channels", -1] . Wenn Sie nur die Anzahl der Dimensionen angeben möchten, verwenden Sie beispielsweise TensorType[-1, -1, -1] für einen dreidimensionalen Tensor.dtype -Argument kann eines von:torch.float32 , torch.float64 usw.int , bool , float , die in ihre entsprechenden Pytorch -Typen umgewandelt werden. float wird speziell float32 torch.get_default_dtype() interpretiert.layout -Argument kann entweder torch.strided oder torch.sparse_coo für dichte bzw. spärliche Tensoren sein.details -Argument bietet eine Möglichkeit, eine willkürliche Anzahl zusätzlicher Flags zu übergeben, die torchtyping anpassen und erweitern. Standardmäßig sind zwei Flaggen integriert. torchtyping.is_named bewirkt, dass die Namen der Tensordimensionen überprüft werden, und torchtyping.is_float kann verwendet werden, um zu überprüfen, ob willkürliche torchtyping details übergeben werden. (Anstatt nur eine bestimmte wie bei z. B. TensorType[torch.float32] .[] zusammenfügen. Zum Beispiel TensorType["batch": ..., "length", "channels", float, is_named] . torchtyping . patch_typeguard () torchtyping integriert sich in typeguard , um die Überprüfung des Laufzeit -Typs durchzuführen. torchtyping.patch_typeguard() sollte auf globaler Ebene aufgerufen werden und typeguard , um TensorType s zu überprüfen.
Diese Funktion ist sicher, mehrmals auszuführen. (Es tut nach dem ersten Lauf nichts).
@typeguard.typechecked verwendet wird, sollte torchtyping.patch_typeguard() jederzeit aufgerufen werden, bevor @typeguard.typechecked verwendet wird. Sie können es beispielsweise zu Beginn jeder Datei mit torchtyping aufrufen.typeguard.importhook.install_import_hook verwenden, sollte torchtyping.patch_typeguard() jederzeit aufgerufen werden, bevor die Funktionen überprüft werden. Sie können beispielsweise torchtyping.patch_typeguard() nur einmal aufrufen, gleichzeitig mit dem typeguard -Importhaken. (Die Reihenfolge des Hakens und des Patchs spielt keine Rolle.)typeguard nicht verwenden, kann torchtyping.patch_typeguard() insgesamt weggelassen werden und nur für Dokumentationszwecke torchtyping werden. pytest --torchtyping-patch-typeguard torchtyping bietet vor Ihren Tests ein pytest -Plugin zum automatischen Ausführen torchtyping.patch_typeguard() . pytest entdeckt automatisch das Plugin. Sie müssen nur das Flag- --torchtyping-patch-typeguard übergeben, um es zu aktivieren. Pakete können dann wie gewohnt an typeguard übergeben werden, entweder mit @typeguard.typechecked , dem Importhaken von typeguard oder dem pytest -Flag --typeguard-packages="your_package_here" .
Siehe die weitere Dokumentation für:
flake8 und mypy -Kompatibilität;torchtyping schreibt;