PyTorchweak_script_method装饰器

时间:2019-02-04 14:57:12

标签: python pytorch

我在对Word2Vec和PyTorch的介绍中遇到了一些我不太熟悉的代码。我以前从未见过这种类型的代码结构。

> OC_EDITOR="subl" oc edit service helloworld -o json

我对以下代码行有些困惑。

OC_EDITOR=subl : The term 'OC_EDITOR=subl' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

我过去可能会无意中忽略了这种语法,但是我不记得以前曾有一个变量被传递给类实例吗?参照定义了>>> 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]]]) 的PyTorch documentation,是否可以通过装饰器>>> embedding(input) 包装Class Embedding()来启用此行为?下面的代码表明可能是这种情况?

@weak_script_method

在这种情况下,为什么最好使用装饰器def forward()

1 个答案:

答案 0 :(得分:4)

否,@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和前后调用一些额外的内容(请参见documentation)。因此,调用module_instance(arguments)大致等同于调用module_instance.forward(arguments)

@weak_script_method装饰器与它无关。它与jit的兼容性有关,@weak_script_method@script_method的一种变体,设计用于PyTorch内部使用-给您的唯一信息应该是nn.Embedding与{ {1}},如果您想使用它。