PyTorch weak_script_method decorator - PullRequest
       2

PyTorch weak_script_method decorator

0 голосов
/ 04 февраля 2019

Я встретил некоторый код во введении в Word2Vec и PyTorch, с которым я не совсем знаком.Я не видел такого типа структуры кода раньше.

>>> import torch
>>> from torch import nn

>>> # an Embedding module containing 10 tensors of size 3
>>> embedding = nn.Embedding(10, 3)
>>> # a batch of 2 samples of 4 indices each
>>> input = torch.LongTensor([[1,2,4,5],[4,3,2,9]])
>>> embedding(input)

tensor([[[-0.0251, -1.6902,  0.7172],
         [-0.6431,  0.0748,  0.6969],
         [ 1.4970,  1.3448, -0.9685],
         [-0.3677, -2.7265, -0.1685]],

        [[ 1.4970,  1.3448, -0.9685],
         [ 0.4362, -0.4004,  0.9400],
         [-0.6431,  0.0748,  0.6969],
         [ 0.9124, -2.3616,  1.1151]]])

Я немного озадачен следующей строкой кода.

>>> embedding(input)

Возможно, я случайно проигнорировал этот синтаксисв прошлом, но я не помню, чтобы когда-нибудь передавали переменную в экземпляр класса?Ссылаясь на документацию PyTorch , где определено Class Embedding(), разрешено ли это поведение с декоратором @weak_script_method wrapping def forward()?Приведенный ниже код предполагает, что это может иметь место?

>>> torch.manual_seed(2)
>>> torch.eq(embedding(input), embedding.forward(input)).all()

tensor(1, dtype=torch.uint8)

Почему использование декоратора @weak_script_method предпочтительнее в этом случае?

1 Ответ

0 голосов
/ 04 февраля 2019

Нет, @weak_script_method не имеет к этому никакого отношения.embedding(input) следует синтаксису вызова функции Python, который может использоваться как с «традиционными» функциями, так и с объектами, которые определяют магическую функцию __call__(self, *args, **kwargs).Таким образом, этот код

class Greeter:
    def __init__(self, name):
        self.name = name

    def __call__(self, name):
        print('Hello to ' + name + ' from ' + self.name + '!')

greeter = Greeter('Jatentaki')
greeter('EBB')

приведет к выводу Hello to EBB from Jatentaki! на стандартный вывод.Точно так же, Embedding - это объект, который вы создаете, сообщая ему, сколько вложений он должен содержать, какой должна быть их размерность и т. Д., А затем, после того, как он построен, вы можете вызывать его как функцию, чтобы получить нужную часть.

Причина, по которой вы не видите __call__ в nn.Embedding источнике, состоит в том, что он подклассы nn.Module, который обеспечивает автоматическую реализацию __call__, которая делегирует forward и вызывает некоторые дополнительныевещи до и после (см. документацию ).Таким образом, вызов module_instance(arguments) примерно эквивалентен вызову module_instance.forward(arguments).

Декоратор @weak_script_method не имеет к этому никакого отношения.Это связано с совместимостью jit, а @weak_script_method является вариантом @script_method, предназначенным для внутреннего использования в PyTorch - единственное сообщение для вас должно быть о том, что nn.Embedding совместим с jit, если вы хотели его использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...